WordPress 插件
组件名称 Newsletters
受影响版本 <= 4.9.9.7
组件标识 newsletters-lite
组件链接 https://wordpress.org/plugins/newsletters-lite/
漏洞类别 A3: 注入
漏洞类型 SQL 注入
管理员权限
当查看 Newsletters 插件(版本 4.9.9.7 或更低)仪表盘(/wp-admin/admin.php?page=newsletters)中的统计概览图表时,由于对 URL 参数的输入验证和转义处理不足,导致发生 SQL 注入漏洞。
通过此漏洞,具有管理员权限的攻击者可以利用它来提取目标站点的数据库信息。
准备一个安装了 Newsletters 插件(版本 4.9.9.7 或更低)的 WordPress 站点。
导航到 Newsletters 插件仪表盘菜单(/wp-admin/admin.php?page=newsletters)。

使用浏览器开发者工具,在“元素”选项卡中搜索 action=wpmlwelcomestats&security=,并检查 security 的值。例如,如果搜索结果如下所示,记下 22b1ac0de6。
// ...
jQuery.getJSON(newsletters_ajaxurl + 'action=wpmlwelcomestats&security=22b1ac0de6', ajaxdata, function(json) {
// ...

将记下的 security 值填入下方 URL 路径的 <SECURITY VALUE> 部分,并向该 URL 发送请求。
http://localhost:8080/wp-admin/admin-ajax.php?action=wpmlwelcomestats&security=<SECURITY VALUE>&type=years&chart=bar&from=2024-12-31&to=2024-12-31&history_id=FOO%27+UNION+SELECT+(CONCAT((DATABASE()),%22-%22,(@@VERSION))),NULL+LIMIT+1,2+%23
当请求上述 PoC 中触发 SQL 注入漏洞的 URL 时,会调用 /wp-content/plugins/newsletters-lite/wp-mailinglist-plugin.php 文件中的 ajax_welcomestats 函数。
此时,请求参数 history_id 直接被作为 SQL 查询字符串中的条件子句引用,并初始化为变量 $history_condition。然后该变量未经任何转义处理便传递给数据库查询。

因此,由于对 URL 参数 history_id 中输入的值没有进行验证或转义处理,导致 SQL 注入漏洞。(注意,URL 参数 from 和 to 也因输入验证和转义处理不足而存在 SQL 注入攻击风险。)
在 URL 参数中,
history_id包含 SQL 注入载荷,允许查询数据库名称(DATABASE())和版本(@@VERSION)。例如,当security的值为22b1ac0de6时,访问以下 URL。
http://localhost:8080/wp-admin/admin-ajax.php?action=wpmlwelcomestats&security=22b1ac0de6&type=years&chart=bar&from=2024-12-31&to=2024-12-31&history_id=FOO%27+UNION+SELECT+(CONCAT((DATABASE()),%22-%22,(@@VERSION))),NULL+LIMIT+1,2+%23
检查 URL 请求响应时,可以确认由于 history_id 参数存在 SQL 注入漏洞,数据库名称和版本信息被暴露。
