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 普通目录遍历,而是:
- 目标启用了
RewriteValve - 某个 rewrite 规则把外部参数映射成内部路径
- Tomcat 处理顺序有问题
- 导致经过 URL 编码的敏感路径在错误的时机被放行
- 最终可以访问本来不该访问的
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}
七、为什么编码后能成功
这一点是本题最核心的原理。
正常的安全逻辑应该是
服务器收到路径后,理想顺序应该是:
- 先 URL 解码
- 再做路径规范化与安全检查
- 再判断是否访问了敏感目录,比如
/WEB-INF/
这样的话:
text
%2FWEB-INF%2Fweb.xml
会先变成:
text
/WEB-INF/web.xml
然后被安全规则拦住。
漏洞条件下的错误逻辑
题目提示说得很明确:
URL 规范化发生在 URL 解码之前
这意味着处理顺序变成了:
- 先对"还没解码的字符串"做规范化/检查
- 检查时没识别出真正的敏感路径
- 后面再解码
- 解码后才变成真正的
/WEB-INF/web.xml - 这时已经绕过了前面的保护
也就是说:
- 安全检查看的是"编码前的表面字符串"
- 真正访问文件时用的是"解码后的真实路径"
这两者不一致,就造成了绕过。
八、为什么这条 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。
更细一点可以拆成四步:
- 识别 Tomcat 版本和题目提示对应的漏洞
- 判断攻击面在 RewriteValve,而不是普通静态路径
- 找到重写入口
/download?path=... - 通过编码后的敏感路径绕过对
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"