环境搭建:
下载 3.2.1 漏洞版本
https://archive.apache.org/dist/tika/3.2.1/tika-app-3.2.1.jar
创建本地项目如下:
pom.xml
1 | <dependency> |
Main.java
1 | package org.example; |
漏洞分析:
查看漏洞补丁:在 XMLReaderUtils.getXMLInputFactory() 方法中,只设置了基本属性,但没有禁用DTD和外部实体
https://github.com/apache/tika/commit/bfee6d5569fe9197c4ea947a96e212825184ca33
跟踪漏洞流程:parseToString() 方法作用就是将一个文件解析为字符串
初始化阶段:创建WriteOutContentHandler(限制输出)和ParseContext(配置容器)
解析阶段:通过this.parser.parse()方法,将内容处理器和上下文传递给解析器
内容处理:解析器将提取的文本内容写入WriteOutContentHandler
结果返回:最终通过handler.toString()获取限制长度的解析结果
org.apache.tika.Tika#parseToString(java.io.InputStream, org.apache.tika.metadata.Metadata, int)
跟进 this.parser.parse 方法(org.apache.tika.parser.AutoDetectParser#parse) -> org.apache.tika.parser.CompositeParser#parse,此处会根据上传文件类型选择对应的 Parser

继续跟进到 PDFParser,负责PDF文件的一系列配置、文档加载、元数据提取、内容解析等处理,然后进入到PDF2XHTML.process 分支
org.apache.tika.parser.pdf.PDFParser#parse
org.apache.tika.parser.pdf.PDF2XHTML#process
org.apache.pdfbox.text.PDFTextStripper#writeText
最终跟进到 this.endDocument,此处会调用 this.extractAcroForm(pdf)
org.apache.tika.parser.pdf.AbstractPDF2XHTML#endDocument
extractAcroForm 负责从PDF文档中提取并处理 XFA(XML Forms Architecture)表单:
获取文档目录和表单
XFA表单处理
创建XFA数据流
解析XFA数据:xfaExtractor.extract()
org.apache.tika.parser.pdf.AbstractPDF2XHTML#extractAcroForm
跟进可以看到调用 XMLReaderUtils.getXMLInputFactory 来处理表单,而该方法在补丁前是没有禁止外部实体。
org.apache.tika.parser.pdf.XFAExtractor#extract
漏洞复现:
