加载中...
路径穿越攻击利用 ../ 序列或绝对路径跳出应用程序预期的目录范围,读取服务器上的任意文件,如 /etc/passwd、应用配置文件甚至私钥,是文件服务类接口最常见的高危漏洞之一。

| 攻击核心 | ../ 序列跳出允许目录,读取任意文件 |
| 典型目标文件 | /etc/passwd、.env、application.properties、private.key |
| 正确防御 | realpath() 规范化后验证是否在白名单目录内 |
典型场景:一个图片下载接口接受文件名参数 /download?file=photo.jpg,服务端拼接成 /var/www/uploads/photo.jpg 后读取。攻击者把参数改为 ../../../etc/passwd,服务端拼接后变成 /var/www/uploads/../../../etc/passwd,解析后等于 /etc/passwd,成功读取系统用户文件。
防御方往往做了简单过滤(删除 ../),攻击者随即发展出各类绕过变形:
%2e%2e%2f%252e%252e%252f..%c0%af(早期 Tomcat 曾受此影响)../../etc/passwd%00.jpg(欺骗语言层面的后缀检查,PHP 5.3 以前有效)正确防御不应依赖过滤 ../(因变形太多),而应在操作文件前规范化路径后验证其是否在允许的目录内。
Python 示例:先用 os.path.realpath() 解析所有符号链接和 ../,再检查结果是否以 /var/www/uploads/ 开头。Java 用 Path.normalize().toAbsolutePath() + startsWith 检查。PHP 用 realpath() + strpos()。
更进一步,文件访问逻辑应与文件名解耦:用数据库存储「文件 ID → 物理路径」映射,接口只接受不透明的 ID,服务端查表得到路径,用户无法控制路径字符串。这彻底消除了路径穿越的攻击面。
2021 年,GitLab 的 CVE-2021-22205 通过 ExifTool 处理图片元数据触发命令注入,但漏洞链的起点正是一个路径处理不当,再次提醒即使是成熟产品也需重视文件路径的规范化验证。

| 攻击核心 | ../ 序列跳出允许目录,读取任意文件 |
| 典型目标文件 | /etc/passwd、.env、application.properties、private.key |
| 正确防御 | realpath() 规范化后验证是否在白名单目录内 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧