0x0 背景介绍
Apache Tomcat是一个开源的Wеb服务器和Sеrvlеt容器,广泛用于Wеb应用的部署和运行。该漏洞是修复历史漏洞CVE-2016-5388(对应Bug 60013)时引入的回归问题,导致重写的URL在解码前被规范化,Tomcat在解码百分比编码字符之前,先对重写的URL进行标准化处理。当重写规则将查询参数复制到路径中时,可能允许攻击者操纵请求URI绕过安全限制,包括对/WEB-INF/和/META-INF/的保护。如果同时启用了PUT请求,攻击者可以上传恶意文件,导致远程代码执行。
0x1 环境搭建
1. Win10环境复现
- 配置
Java环境 - 下载
Tomcattomcat-9.0.108.zip
2.项目配置
- 配置
RewriteValve和Context - 编辑
conf\server.xml文件,在Host添加规则,具体参考模板如下:
xml
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- 添加RewriteValve配置 -->
<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
<!-- 添加Context配置 -->
<Context path="" docBase="ROOT" reloadable="true">
<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
</Context>
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>

- 创建
rewrite.config文件 - 在默认项目中添加规则文件,内容如下:
bash
RewriteCond %{QUERY_STRING} ^path=(.*)$
RewriteRule ^/download$ /files/%1 [L]
RewriteRule ^/api(.*)$ /files$1 [L]

- 创建测试目录
- 在默认项目创建
files文件夹,存放一个默认文件即可 WEB-INF目录中创建俩个保护文件,待读取
3. 启动项目
-
bin目录下启动tomcat
bash
apache-tomcat-9.0.108\bin>startup.bat
-
启动后访问
8080,和txt文件

-
如有失败,查看
logs文件夹中的报错日志

0x2 漏洞复现
手动复现步骤
- 访问
xml文件

复现流量特征 (PACP)
0、读取文件web.xml

2、读取自定义xixi.xml

0x3 漏洞原理分析
错误的 URL 处理顺序
-
/(ㄒoㄒ)/~~看不太懂,只能从GitHub提交的变更入手
-
变更
前的关键代码 -
代码位置:
java/org/apache/catalina/valves/rewrite/RewriteValve.java
Java
#500-597
urlStringRewriteEncoded = RequestUtil.normalize(urlStringRewriteEncoded);
chunk.append(URLDecoder.decode(urlStringRewriteEncoded, uriCharset.name()));
- 变更
后的关键代码 - 代码位置:
java/org/apache/catalina/valves/rewrite/RewriteValve.java
java
500-597
String urlStringRewriteDecoded = URLDecoder.decode(urlStringRewriteEncoded, uriCharset.name());
urlStringRewriteDecoded = RequestUtil.normalize(urlStringRewriteDecoded);
- 在重写 URL 后,原逻辑先调用
normalize()再进行decode(),导致无法识别编码后的路径遍历字符(如%2e%2e表示..)。
漏洞利用链
前提条件
- 必须配置了并启用了
RewriteValve重写规则(server.xml) - 启用
PUT和WebDAV功能后才可以实现远程代码执行
bash
攻击请求: /b?a=%2e%2e%2fWEB-INF%2fweb.xml
↓
重写条件: %{QUERY_STRING} a=(.*) → 捕获 "%2e%2e%2fWEB-INF%2fweb.xml"
↓
重写规则: /z/%1 [QSD] → 生成 "/z/%2e%2e%2fWEB-INF%2fweb.xml"
↓
错误处理: 规范化(不识别%2e%2e%2f) → 解码(变成../) → 路径遍历成功
↓
修复后: 解码(先变成../) → 规范化(识别并阻止..) → 安全路径
0x4 修复建议
修复方案
- 升级到安全版本:厂商已提供漏洞修补方案
- 升级到 Apache Tomcat 11.0.11 或更高版本
- 升级到 Apache Tomcat 10.1.45 或更高版本
- 升级到 Apache Tomcat 9.0.109 或更高版本
- 临时缓解措施:
应用层增加路径合法性校验
检查是否启用了RewriteValve和PUT,若非必要,建议禁用
使用 WAF 规则拦截 %2e%2e、%2f 等可疑编码
免责声明:本文仅用于安全研究目的,未经授权不得用于非法渗透测试活动。