文章总结: WordPress插件MailMint在1.18.6版本前存在SQL注入漏洞CVE-2025-58604。漏洞源于Import.php文件中未使用$wpdb->prepare()直接拼接用户输入,攻击者可利用RESTAPI接口的selectedCourses参数执行恶意SQL语句窃取用户数据。建议及时更新插件并使用预处理语句修复代码。 综合评分: 88 文章分类: 漏洞分析,代码审计,WEB安全,漏洞POC
}}
工作原理
该漏洞位于 Import 类内部的 get_wp_users_by_learndash_with_limit_offset($courses, $number = 5, $offset = 0) 函数中。 要追踪其使用情况,请在插件目录中搜索关键字 get_wp_users_by_learndash_with_limit_offset。
{{< figure src="search_import.png" caption="搜索导入" alt="Search Import" >}}
该函数在以下位置被调用:
·retrieve_contacts_associated_with_learndash()
·perform_learndash_user_import()
这些函数属于 /app/API/Actions/管理员/Contact/ContactImportAction.php 文件中的 ContactImportAction 类。
接下来,搜索 retrieve_contacts_associated_with_learndash 发现它在另一个方法中被使用:
{{< figure src="search_1.png" caption="搜索 1" alt="Search 1" >}}
此函数由位于 /app/API/Controllers/管理员/Contact/ContactImportController.php 文件中的 ContactImportController 类内的 map_contacts_with_learndash() 调用。
进一步追踪 map_contacts_with_learndash 显示它被注册为一个 REST API 回调函数:
{{< figure src="search_2.png" caption="搜索 2" alt="Search 2" >}}
类 ContactImportRoute extends AdminRoute { public 函数 register_routes() { register_rest_route( $this->namespace, // mrm/v1 $this->rest_base .’/learndash/map’, // contacts/import/learndash/map/ 数组( 数组( ‘methods’ => WP_REST_Server::CREATABLE, // POST ‘回调函数’ => 数组( $this->controller, ‘map_contacts_with_learndash’ ), ‘permission_callback’ => PermissionManager::current_user_can(‘mint_manage_contacts’), // 管理员 ‘args’ => 数组( ‘selectedCourses’ => 数组( ‘description’ => __( ‘The selected courses from which to import contacts.’, ‘mrm’ ), ‘required’ => true, ‘type’ => ‘数组’, ‘sanitize_callback’ => ‘rest_sanitize_array’, ) ), // 数组 + required ), ) ); // other logic } // other logic }
调用流程:
1.向 /wp-JSON/mrm/v1/contacts/import/learndash/map 发送一个 POST 请求,并携带必需的参数 selectedCourses。
2.回调函数 map_contacts_with_learndash(WP_REST_Request $请求) 接收该请求。
o$请求 对象被转换为数组 $params。
3.该回调函数随后调用 retrieve_contacts_associated_with_learndash($params)。
4.该函数最终调用 get_wp_users_by_learndash_with_limit_offset($courses, $number = 5, $offset = 0),其中:
o$courses = $params[‘selectedCourses’]
o$keys 是一个由 $courses 中所有 value 字段构建的数组,像 course_{COURSE_ID}_access_from 那样拼接。
o在插入到 SQL 查询之前,$keys 数组使用 implode() 合并成一个字符串。
5.执行查询并返回一个包含 formatted_users 和 total_users 的 JSON 响应。
漏洞利用
分析代码后,可以清楚地看到 selectedCourses 参数在被注入到存在漏洞的 SQL 查询之前经历了多次转换——但攻击者仍然控制着 value 键。
使用 BurpSuite 的 POST 请求:
可以使用单个键轻松控制最终的 SQL 查询。
{{< figure src="request_success.png" caption="获取所有用户信息" alt="Get all user info" >}}
生成的查询如下所示:
SELECT user_id FROM wp_usermeta WHERE meta_key IN (‘course_abc’) OR1=1– _access_from’) GROUP BY user_id LIMIT 5 OFFSET 0
·’) 转义了 IN 子句
·1=1 始终为真 → 返回 wp_usermeta 中的所有用户 ID
函数的其余部分检索所有返回用户的元数据:
$formatted_users=array_map( 函数 ($user) { $user->usermeta =array_map( 函数 ($user_data) { returnreset($user_data); }, get_user_meta($user->ID) ); return$user; }, $contacts );
结论
WordPress Mail Mint 插件(版本 1.18.6 之前)中的 CVE-2025-58604 漏洞源于执行 SQL 查询时未使用 $wpdb->prepare()。 相反,用户输入被直接拼接到 SQL 语句中——导致了典型的 SQL注入 漏洞。
补丁现在使用 $wpdb->prepare() 来安全地构建 SQL 查询,从而缓解了此问题。
关键要点:
·与 WordPress 数据库交互时,始终使用 $wpdb->prepare() 来防止 SQL注入。
·定期更新您的插件并进行安全审查,以避免被利用。
加内部交流群:
#
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:天启攻防实验室 匆匆过客 匆匆过客《WordPress Mail Mint 插件 SQL注入》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论