当前位置: 当前位置:首页 > 焦点 > 目录遍历漏洞防护正文

目录遍历漏洞防护

作者:时尚 来源:娱乐 浏览: 【大 中 小】 发布时间:2026-10-17 06:08:41 评论数:

一个晴朗的目录下午,某电商平台的遍历运维日志里突然出现了一连串奇怪的请求:/images/../../etc/passwd、/static/..%2f..%2fconfig.php。漏洞攻击者正用自动化脚本扫描目录穿越点。防护如果当时没有拦截,目录数据库配置文件的遍历明文密码就会暴露——这通常是一连串灾难的起点。

目录遍历漏洞,漏洞说白了就是防护服务器没拦住../这种向上跳转的路径。攻击者通过构造特殊URL,目录能读取服务器上任意文件,遍历甚至执行命令。漏洞这类漏洞在老旧系统、防护自研框架、目录文件下载功能里尤其常见。遍历我见过一个案例:某政府网站的漏洞文件预览功能,因为直接拼接了用户输入的文件名,导致整个/etc/shadow文件被下载——虽然密码是加密的,但配合弱口令爆破,后果不堪设想。

防护思路其实很朴素:别信任任何用户输入,别让用户控制文件路径的层级。具体操作分三层。

第一层,输入校验。过滤掉../、..\、百分号编码后的%2e%2e%2f等变形。但黑名单永远有漏网之鱼,比如用....//绕过简单替换,或者利用操作系统对Unicode的兼容性差异。所以更靠谱的是白名单——只允许指定文件名或ID,比如file_id=123,后端根据ID去映射真实路径,而不是直接拼接用户给的字符串。

第二层,路径规范化。即使做了过滤,也要用系统函数做最终检查。Java里用File.getCanonicalPath(),Python用os.path.realpath(),然后判断得到的绝对路径是否以允许的根目录开头。这一步必须放在文件操作之前。有个朋友踩过坑:他过滤了..但没处理符号链接,攻击者先上传一个指向/etc的软链接,再请求链接内的文件——规范化函数能拆穿这个把戏。

第三层,权限与架构兜底。Web应用运行账户用最小权限,别用root。把上传目录和代码目录分离,并且关闭目录浏览。更彻底的做法是,文件读取功能走独立服务,只暴露HTTP接口,内部用对象存储的key而非服务器路径——这样即使被绕过,攻击者拿到的也只是无意义的随机字符串ID。

光有技术不够。我见过太多系统,防护代码写得漂亮,但配置不当——比如Nginx的alias配置末尾少了个斜杠,直接导致/files../secret.txt能跳到上级目录。这类问题靠代码审计难发现,得用自动化扫描工具定期打一遍。开源工具比如dirsearch、w3af,或者商业的Burp Suite Pro,都能测出大多数常见绕过。但记住,工具只能证明“存在”,不能证明“不存在”。

最后说个反直觉的事:有时候修漏洞比不修更危险。某团队为了防目录遍历,在代码里加了个全局过滤器,结果误伤了正常业务——一些合法的路径参数被强制替换,导致用户头像加载失败。上线当天就收到几百条工单。所以任何改动都要回归测试,尤其是涉及路径处理的逻辑。宁可慢一点,也别半夜被电话叫醒。

目录遍历不是那种炫技型漏洞,但它像一扇没锁的后门——攻击者不急着进来,但一旦摸清门路,就能翻遍整栋楼。把上面三层做到位,再配合定期的渗透测试,基本就能堵住99%的路径穿越尝试。剩下的1%,留给那些愿意花三天时间琢磨一个百分号编码变体的偏执狂——但说实话,他们通常有更值钱的目标。