Ktor XML XXE漏洞复现与分析(CVE-2023-45612)

本文详细分析了JetBrains Ktor框架在2.3.5版本之前存在的XML外部实体注入漏洞(CVE-2023-45612),包含完整的漏洞复现环境搭建、攻击测试脚本和防护建议,涉及文件读取、SSRF攻击等安全风险。

Ktor XML XXE漏洞复现(CVE-2023-45612)

研究作者: Luka Andghuladze
项目: JetBrains Ktor安全研究实习 2025-2026

Ktor框架2.3.5之前版本存在XML外部实体(XXE)漏洞。该漏洞存在于配置了XML序列化默认设置的ContentNegotiation插件中。


前提条件

  • Java 11或更高版本
  • Gradle 8.0+
  • Python 3.7+

验证安装:

1
2
3
java -version
gradle --version
python3 --version

设置和安装

进入项目目录:

1
cd jetbrains-ktor-xxe-poc

安装Python依赖:

1
pip3 install -r requirements.txt

构建项目:

1
gradle build

运行演示

终端1 - 启动漏洞服务器:

1
gradle run

等待显示:Responding at http://0.0.0.0:8080

终端2 - 运行漏洞利用测试:

1
python3 exploit_tester.py

脚本测试四种场景:

  1. 正常XML请求(基线)
  2. 读取/etc/hostname的XXE攻击
  3. 读取/etc/passwd的XXE攻击
  4. 通过XXE进行SSRF攻击

项目结构

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
jetbrains-ktor-xxe-poc/
├── build.gradle.kts                      
├── settings.gradle.kts                   

├── requirements.txt                      
├── exploit_tester.py                     
├── src/main/kotlin/com/jetbrains/ktor/security/
   ├── ServerApplication.kt              
   └── RequestModel.kt                   
├── src/main/resources/
   └── logback.xml                       
└── payloads/
    ├── legitimate_request.xml            
    └── xxe_attack_passwd.xml             

技术细节

漏洞概述

CVE-2023-45612影响Ktor 2.3.5之前版本。ContentNegotiation插件中的默认XML解析器配置允许:

  • DTD处理
  • 外部实体解析
  • 无限制实体扩展

这使得攻击者能够:

  • 读取服务器上的任意文件
  • 执行服务器端请求伪造(SSRF)
  • 执行拒绝服务攻击
  • 在特定配置下可能实现远程代码执行

漏洞代码

服务器使用默认XML配置:

1
2
install(ContentNegotiation) {
    xml()  // Ktor中的不安全配置

XML攻击载荷示例

1
2
3
4
]>

    Attacker
    &xxe;

预期结果

在漏洞服务器上(Ktor 2.3.4)

1
2
3
4
5
6
[!!!] 服务器存在以下漏洞:
  - 文件泄露(/etc/hostname)
  - 关键文件访问(/etc/passwd)
  - 通过XXE进行SSRF

[!] CVE-2023-45612已确认

概念验证截图

成功利用的可视证据:

服务器运行:

漏洞利用测试结果(第一部分):

漏洞利用测试结果(第二部分):


实现说明

ServerApplication.kt - 实现了一个Ktor服务器,包含:

  • 配置了XML的ContentNegotiation插件
  • 接受XML数据的POST /api/process端点
  • 响应反射使XXE利用可见

exploit_tester.py - 自动化测试脚本,功能包括:

  • 验证服务器连接性
  • 测试基线功能
  • 尝试多种XXE攻击向量
  • 生成漏洞报告

RequestModel.kt - 使用kotlinx.serialization进行XML反序列化的数据类


手动测试

也可以使用curl进行手动测试:

1
2
3
4
5
6
7
8
9
# 正常请求
curl -X POST http://localhost:8080/api/process \
  -H "Content-Type: application/xml" \
  -d @payloads/legitimate_request.xml

# XXE攻击
curl -X POST http://localhost:8080/api/process \
  -H "Content-Type: application/xml" \
  -d @payloads/xxe_attack_passwd.xml

防护指南

为防止Ktor应用中的XXE漏洞:

  1. 更新到Ktor 2.3.5或更高版本
  2. 配置XML解析器禁用外部实体
  3. 验证和清理所有XML输入
  4. 尽可能使用JSON替代XML
  5. 实施适当的输入验证
  6. 应用安全头部和速率限制
  7. 定期进行安全测试和代码审查

作者

Luka Andghuladze

本研究作为JetBrains Ktor安全研究实习(2025-2026)申请的一部分进行。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计