
PoC of CVE-2025-22710
WordPress 插件
Component name WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type – Smart Manager
Vulnerable version <= 8.50.0
Component slug smart-manager-for-wp-e-commerce
Component link https://wordpress.org/plugins/smart-manager-for-wp-e-commerce/
Vulnerability class A3:注入
Vulnerability type SQL 注入
管理员
WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type – Smart Manager(以下简称 Smart Manager)插件是一款允许批量编辑和查看 WordPress 中所有文章类型的插件。
在 Smart Manager 插件 8.50.0 及更低版本中,使用高级搜索功能查看文章时,由于过滤值在未经过转义处理的情况下传递给数据库查询,导致存在 SQL 注入漏洞。
然而,虽然无法在屏幕上直接看到 SQL 注入攻击的结果,但可以通过真假条件响应值的差异实现盲 SQL 注入。
⚠️ 必须至少存在一篇文章,才能观察到基于真假条件的响应值差异。
/wp-admin/admin.php?page=smart-manager)。

' OR 1=1 )) #。之后,点击顶部的搜索按钮。

' OR 1=2 )) #,由于条件始终为假(OR 1=2),将无法检索到任何文章。

执行上述 PoC 描述中的“高级搜索”功能时,会生成以下数据包,高级搜索中输入的过滤值(文章标题、等于、' OR 1=1 )) #)被输入到请求数据 advanced_search_query 中。
advanced_search_query=[{"condition":"OR","rules":[{"condition":"AND","rules":[{"type":"wp_posts.post_title","operator":"is","value":"' OR 1=1 )) #"}]}]}]

当请求此数据包时,会调用 /wp-content/plugins/smart-manager-for-wp-e-commerce/classes/class-smart-manager-base.php 文件中的 get_data_model 函数,并按照以下顺序执行数据库查询。
如果请求数据 advanced_search_query 存在,则调用 process_search_cond 函数。此时,请求数据 advanced_search_query 被传递给键值对参数中键为 search_query 的值。
search_query=[{"condition":"OR","rules":[{"condition":"AND","rules":[{"type":"wp_posts.post_title","operator":"is","value":"' OR 1=1 )) #"}]}]}]

被调用的函数 process_search_cond 遍历键为 search_query 的值,将过滤值“文章标题(post_title)”初始化为变量 $search_col,并将包含 SQL 注入 payload 的过滤值 ' OR 1=1 )) # 初始化为变量 $search_value。

在高级搜索功能中,用户输入(' OR 1=1 )) #)在未经过转义处理的情况下直接被包含在数据库查询中,导致存在 SQL 注入漏洞。此漏洞使攻击者能够执行任意 SQL 查询,可能导致泄露或篡改数据库中的敏感信息等严重安全风险。
⚠️ PoC 代码实现通过利用 SQL 注入漏洞查询数据库名称。
在编辑器中打开 PoC 代码,输入 WordPress 站点地址和管理员凭据。

然后输入以下命令运行 PoC 代码。
必需模块requests
python poc.py

变量 $search_col 和 $search_value 分别被传递给 $search_params 数组的键 search_col(=post_title)和 search_value(=' OR 1=1 )) #)。随后,此 $search_params 变量作为键为 search_params 的值传递给函数 create_flat_table_search_query。

接着,create_flat_table_search_query 函数定义 SQL 查询的 WHERE 子句,此时,作为参数传递的键 search_params 的值 search_value(=' OR 1=1 )) #)在未经过任何转义处理的情况下被包含在 WHERE 子句中。

然后,函数 create_flat_table_search_query 的返回值(包含 SQL 注入 payload)作为参数传递给函数 process_flat_table_search_query。

函数 process_flat_table_search_query 使用接收到的参数构建数据库查询,初始化变量 $select、$from 和 $where。此处可以看到,SQL 注入 payload 未经任何验证就直接传递给变量 $where。

变量 $select、$from、$where 被直接赋值给变量 $query_posts_search,该变量最终作为参数传递给执行数据库查询的函数。
