Apache Tomcat RewriteValve目录遍历漏洞 | CVE-2025-55752 复现

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环境复现

2.项目配置

  • 配置RewriteValveContext
  • 编辑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 &quot;%r&quot; %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
  • 启用PUTWebDAV功能后才可以实现远程代码执行
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 修复建议

修复方案

  1. 升级到安全版本:厂商已提供漏洞修补方案
    • 升级到 Apache Tomcat 11.0.11 或更高版本
    • 升级到 Apache Tomcat 10.1.45 或更高版本
    • 升级到 Apache Tomcat 9.0.109 或更高版本
  2. 临时缓解措施:
    应用层增加路径合法性校验
    检查是否启用了 RewriteValvePUT,若非必要,建议禁用
    使用 WAF 规则拦截 %2e%2e、%2f 等可疑编码

免责声明:本文仅用于安全研究目的,未经授权不得用于非法渗透测试活动。

相关推荐
JAVA面经实录91724 分钟前
企业级java+LangChain4j-RAG系统 限流熔断降级
java·开发语言·分布式·langchain
Drug29 分钟前
Struts2 从入门到放弃?不,这些核心知识你依然需要掌握
java
Slow菜鸟36 分钟前
Codex CLI 教程(五)| AI 驱动项目从零到一:面向 Java 全栈工程师打造个人 ECC(V2版)
java·开发语言·人工智能
月落归舟1 小时前
java基础之拷贝、单例
java·单例·拷贝
鬼蛟1 小时前
什么是 Git
java
直奔標竿1 小时前
SpringAI + RAG + MCP + Agent 零基础全栈实战(完结篇)| 27课完整汇总,Java开发者AI转型必看
java·开发语言·人工智能·spring boot·后端·spring
云烟成雨TD1 小时前
Spring AI 1.x 系列【31】向量数据库:进阶使用指南
java·人工智能·spring
jikemaoshiyanshi1 小时前
如何选择防护面罩?告别国内品牌单纯对比,回归工业呼吸防护体系本质
经验分享·健康医疗
W.W.H.2 小时前
嵌入式系统硬件接口全景图
经验分享·uart·iic·gpio·spi
逍遥德2 小时前
SpringBoot数据库连接池HikariCP,Druid,Tomcat JDBC,DBCP2,c3p0配置使用
数据库·spring boot·tomcat