WordPress 插件
组件名称 ELEX WooCommerce Advanced Bulk Edit Products, Prices & Attributes
受影响版本 <= 1.4.8
组件slug elex-bulk-edit-products-prices-attributes-for-woocommerce-basic
组件链接 https://wordpress.org/plugins/elex-bulk-edit-products-prices-attributes-for-woocommerce-basic/
漏洞类别 A3: 注入
漏洞类型 SQL注入(盲SQL注入)
商店经理或管理员
ELEX WooCommerce Advanced Bulk Edit Products, Prices & Attributes 插件是一款支持产品批量编辑的插件。
在该插件中批量编辑产品时,通过筛选选择目标。在此过程中,产品筛选请求中传输的某些数据被直接插入 SQL 查询,从而产生 SQL 注入漏洞。
然而,SQL 查询结果无法直接验证,该漏洞以盲 SQL 注入的形式存在,通过判断查询结果的真假来提取数据。
执行上述 PoC 描述中请求的功能(“预览筛选产品”)时,会生成以下数据包。

当请求该数据包时,将调用 /wp-content/plugins/elex-bulk-edit-products-prices-attributes-for-woocommerce-basic/includes/elex-ajax-apifunctions.php 文件中的 elex_bep_filter_products 函数。
请求数据中带有 SQL 注入负载的 desired_price 值通过以下步骤作为 SQL 查询执行。
包含 SQL 注入负载的 desired_price 值被直接传递到查询条件子句,并赋值给变量 $price_query。
product_title_text、range也会被直接传递到查询中,但由于我们在 PoC 中将 SQL 注入负载传递给了desired_price,因此这里只介绍desired_price。
// elex-ajax-apifunctions.php at line 1280
$price_query = " AND meta_key='_regular_price' AND meta_value {$filter_range} {$data_to_filter['desired_price']} ";

随后,将变量 $price_query 添加到变量 $sql(第 1365 行,#1),变量 $sql 连同字符串 AND 和变量 $product_type_condition 一起初始化变量 (第 1379 行,#2)

因此,包含 SQL 注入负载的请求参数 desired_price 被包含在 $wpdb->prepare( '%1s', $main_query ) 语句的 $main_query 中。此时,由于 %1s 格式说明符会按原样传递 $main_query 值,因此 SQL 注入负载无需转义即可插入查询中,从而导致 SQL 注入漏洞。
⚠️ PoC 代码旨在使用产品经理账户,通过利用盲 SQL 注入漏洞获取数据库名称。

接下来,输入以下命令以运行 PoC 代码。
所需模块requests
python poc.py

$main_query变量
$sql在elex-ajax-apifunctions.php的第 1257 行被初始化。

最后,变量 $main_query 作为参数传递给 prepare 函数,如下所示,以执行数据库查询。