Apache Tomcat CVE-2025-55752 CTF Writeup

Apache Tomcat CVE-2025-55752 CTF 详细 Writeup

题目基础信息

靶场地址:

text 复制代码
http://8.147.132.32:36646/

题目提示:

  • 漏洞编号:CVE-2025-55752
  • 影响组件:Apache Tomcat RewriteValve
  • 漏洞类型:路径遍历
  • 核心原因:URL 规范化发生在 URL 解码之前
  • 结果:攻击者可以通过 URL 编码的路径 绕过对 /WEB-INF/ 等敏感目录的保护

最终拿到的 flag:

text 复制代码
flag{1357e9ad-03bf-4c15-8c1e-ca63af11e875}

一、这道题考什么

这题考的不是 Tomcat 普通目录遍历,而是:

  1. 目标启用了 RewriteValve
  2. 某个 rewrite 规则把外部参数映射成内部路径
  3. Tomcat 处理顺序有问题
  4. 导致经过 URL 编码的敏感路径在错误的时机被放行
  5. 最终可以访问本来不该访问的 WEB-INF 目录

对于新手来说,这题最重要的理解点是:

不是你"直接访问 /WEB-INF/web.xml 成功了",而是你"通过一个重写入口,把编码后的敏感路径交给了后端",最后由于处理顺序问题,后端把它当成合法路径处理了。


二、第一步:先确认目标是什么服务

先访问首页:

bash 复制代码
curl -i http://8.147.132.32:36646/

返回页面标题中出现:

text 复制代码
Apache Tomcat/9.0.108

这一步说明:

  • 目标确实是 Tomcat
  • 版本信息直接暴露了出来
  • 题目提示与目标环境是一致的

如果你看到的是默认欢迎页,这通常说明:

  • 当前根目录没有复杂业务页面
  • 题目很可能把利用入口藏在某个单独路径
  • 需要主动枚举或根据题目提示推断入口

三、第二步:验证敏感目录是否直接可访问

按照常规思路,先直接访问敏感目录:

bash 复制代码
curl -i http://8.147.132.32:36646/WEB-INF/web.xml

返回的是 404

这里不要误判为"没有这个文件"。

对 Tomcat 来说,WEB-INF 是受保护目录:

  • 正常情况下不能被浏览器直接访问
  • 即使文件存在,也应该被拒绝

所以我们接下来要做的不是继续硬撞 /WEB-INF/...

而是:

找 rewrite 入口


四、第三步:为什么要去找 rewrite 入口

题目提示已经把重点说出来了:

漏洞在 RewriteValve

这说明攻击面大概率不是普通静态资源路径,而是某种"重写入口"。

常见长相有:

  • /download?path=...
  • /file?name=...
  • /view?file=...
  • /assets/...
  • 某些通过 URL 参数拼路径的规则

也就是说,题目的关键不是"遍历字符串长什么样",而是:

哪个路径会触发 RewriteValve 去处理你提供的参数


五、第四步:找到真实利用入口 /download

根据这类题常见的 PoC 形态,可以优先测试:

bash 复制代码
curl -i "http://8.147.132.32:36646/download?path=/WEB-INF/web.xml"
curl -i "http://8.147.132.32:36646/download?path=%2FWEB-INF%2Fweb.xml"
curl -i "http://8.147.132.32:36646/download"

测试结果非常关键:

1. /download

text 复制代码
404 The requested resource [/download] is not available

这个现象有点迷惑,但很正常。

它说明:

  • /download 本身不是一个真实存在的物理资源
  • 它很可能只是 rewrite 规则的一个入口形式
  • 参数不同,结果会完全不同

2. /download?path=/WEB-INF/web.xml

这个请求失败。

说明未编码的敏感路径没有成功触发漏洞。

3. /download?path=%2FWEB-INF%2Fweb.xml

这个请求成功返回了 web.xml 内容:

xml 复制代码
<description>
      flag{1357e9ad-03bf-4c15-8c1e-ca63af11e875}
</description>

到这里题目就已经结束了。


六、最终利用请求

核心请求只有这一条:

bash 复制代码
curl "http://8.147.132.32:36646/download?path=%2FWEB-INF%2Fweb.xml"

返回内容里直接包含:

text 复制代码
flag{1357e9ad-03bf-4c15-8c1e-ca63af11e875}

所以最终 flag 为:

text 复制代码
flag{1357e9ad-03bf-4c15-8c1e-ca63af11e875}

七、为什么编码后能成功

这一点是本题最核心的原理。

正常的安全逻辑应该是

服务器收到路径后,理想顺序应该是:

  1. 先 URL 解码
  2. 再做路径规范化与安全检查
  3. 再判断是否访问了敏感目录,比如 /WEB-INF/

这样的话:

text 复制代码
%2FWEB-INF%2Fweb.xml

会先变成:

text 复制代码
/WEB-INF/web.xml

然后被安全规则拦住。

漏洞条件下的错误逻辑

题目提示说得很明确:

URL 规范化发生在 URL 解码之前

这意味着处理顺序变成了:

  1. 先对"还没解码的字符串"做规范化/检查
  2. 检查时没识别出真正的敏感路径
  3. 后面再解码
  4. 解码后才变成真正的 /WEB-INF/web.xml
  5. 这时已经绕过了前面的保护

也就是说:

  • 安全检查看的是"编码前的表面字符串"
  • 真正访问文件时用的是"解码后的真实路径"

这两者不一致,就造成了绕过。


八、为什么这条 payload 这么短

很多新手看到"路径遍历"会本能地去尝试:

text 复制代码
../../../../WEB-INF/web.xml

但这题的关键不一定是传统 ../

这里目标本身已经提供了一个内部映射入口:

text 复制代码
/download?path=...

因此你不需要从当前目录往上跳很多层。

你要做的只是:

  • 让后端把你的 path 当成内部文件路径
  • 再利用编码绕过敏感目录拦截

所以最短 payload 就是:

text 复制代码
%2FWEB-INF%2Fweb.xml

这也是本题很适合新手的地方:

  • payload 不复杂
  • 重点都在"理解处理顺序"

九、完整复现过程

下面给出一套完整的新手复现步骤。

步骤 1:访问首页确认版本

bash 复制代码
curl -i http://8.147.132.32:36646/

关注点:

  • 页面标题是否是 Apache Tomcat/9.0.108

步骤 2:确认 WEB-INF 不能直接访问

bash 复制代码
curl -i http://8.147.132.32:36646/WEB-INF/web.xml

关注点:

  • 返回 404 或禁止访问,说明正常保护存在

步骤 3:测试重写入口

bash 复制代码
curl -i "http://8.147.132.32:36646/download?path=/WEB-INF/web.xml"

关注点:

  • 普通写法失败

步骤 4:使用 URL 编码后的敏感路径

bash 复制代码
curl -i "http://8.147.132.32:36646/download?path=%2FWEB-INF%2Fweb.xml"

关注点:

  • 返回 200
  • 内容类型是 application/xml
  • 能看到 Tomcat 默认 web.xml

步骤 5:从 web.xml 中提取 flag

返回内容中有:

xml 复制代码
<description>
      flag{1357e9ad-03bf-4c15-8c1e-ca63af11e875}
</description>

提取即可。


十、这题的思路总结

可以把这题总结成一句话:

利用 Tomcat RewriteValve 在"先规范化、后解码"的错误处理顺序下,通过 /download?path=%2FWEB-INF%2Fweb.xml 读取受保护的 WEB-INF/web.xml,并在文件内容中得到 flag。

更细一点可以拆成四步:

  1. 识别 Tomcat 版本和题目提示对应的漏洞
  2. 判断攻击面在 RewriteValve,而不是普通静态路径
  3. 找到重写入口 /download?path=...
  4. 通过编码后的敏感路径绕过对 WEB-INF 的访问限制

十一、新手最容易踩的坑

坑 1:一直盯着 ../

看到"路径遍历"就只会测:

text 复制代码
../
../../
../../../

这题不一定需要传统目录跳转,真正关键是 rewrite 入口 + 编码绕过

坑 2:只测试直接访问敏感目录

如果你只打:

text 复制代码
/WEB-INF/web.xml

那你会觉得"没漏洞"。

但漏洞不在"直接访问",而在"通过重写规则访问"。

坑 3:不做 URL 编码

不编码时,安全检查更容易识别真实路径,所以可能失败。

本题成功的关键就是:

text 复制代码
%2FWEB-INF%2Fweb.xml

坑 4:看到 /download 返回 404 就放弃

很多重写入口本身就是"伪路径"。

它没有参数时可能是 404,但带参数后却会触发 rewrite 逻辑。

所以不能因为:

text 复制代码
/download

返回 404,就认定它没用。


十二、如果在比赛中继续深入,还可以做什么

拿到 WEB-INF/web.xml 后,通常还可以继续做这些事:

  • 看是否暴露了其他 servlet 路由
  • 看是否有敏感初始化参数
  • 找应用真实上下文路径
  • 继续尝试读取:
    • /WEB-INF/web.xml
    • /META-INF/context.xml
    • 配置文件
    • JSP / 模板文件

但这道题里,题目作者已经把 flag 直接放进了 web.xml,所以到这一步就够了。


十三、最终答案

最终 flag:

text 复制代码
flag{1357e9ad-03bf-4c15-8c1e-ca63af11e875}

最终利用请求:

bash 复制代码
curl "http://8.147.132.32:36646/download?path=%2FWEB-INF%2Fweb.xml"
相关推荐
27669582921 小时前
某白山小程序限制PC端调试
python·小程序·apache·小程序逆向·某白山·限制pc调试
0xDevNull3 小时前
Tomcat 运行原理与架构深度解析
java·架构·tomcat
杰建云1673 小时前
商家小程序怎么做?
大数据·apache·小程序制作
非凡ghost1 天前
完美解码最新版(完美解码播放器)
windows·智能手机·pdf·firefox·软件需求
小冷爱学习!1 天前
Apache Shiro 1.2.4 反序列化漏洞Shiro-550(CVE-2016-4437)
服务器·网络·python·安全·网络安全·apache
有趣灵魂1 天前
Java Spring Boot根据Word模板和动态数据生成Word文件
java·spring boot·word·apache
phltxy1 天前
分布式链路追踪实战:Apache SkyWalking 从入门到精通
分布式·apache·skywalking
0和1的搬运工2 天前
基于Java+SpringBoot+Vue+HTML5高校教师电子名片系统(源码+LW+调试文档+讲解等)/高校教师/电子名片/系统/教育科技/教育信息化/名片管理/电子身份/教师信息管理/校园信息化
spring cloud·tomcat·log4j·maven·intellij-idea·dubbo·java-consul
铁皮哥2 天前
【后端开发】@Resource 和 @Autowired 到底有什么区别?为什么现在更推荐构造方法注入?
java·ide·spring boot·tomcat·log4j·idea·intellij idea