当前位置:首页 > 知识

路径遍历漏洞

去年有个做企业官网的径漏洞朋友找我,说服务器上突然多了几个从没见过的遍历文件,文件名是径漏洞一串乱码,内容倒是遍历很规整——全是系统配置信息。他以为是径漏洞中了什么高级病毒,折腾了一整天才定位到问题:一个下载接口没做参数过滤,遍历被人用../../一路翻到了系统根目录。径漏洞

这就是遍历路径遍历漏洞,说白了就是径漏洞程序本该只让你访问A目录,结果你用一堆"回到上一层"的遍历符号,硬是径漏洞跑到了B目录、C目录,遍历甚至整个磁盘随便逛。径漏洞

它怎么发生的遍历

想象一个文件服务器,URL长这样:/download?径漏洞file=report.pdf。后端代码拿到report.pdf这个参数,直接拼到某个基础路径后面,然后去读文件。逻辑上没毛病,用户要什么就给什么。

问题出在,用户不一定老实。

如果请求变成/download?file=../../../etc/passwd,而代码又没有对..做任何检查,服务器就会老老实实把/etc/passwd的内容吐出来。攻击者不需要什么高超技术,浏览器地址栏改几个字符就行。

更隐蔽的变体是用URL编码绕过。比如%2e%2e%2f解码后就是../。有些防护代码只检查明文的..,遇到编码过的就瞎了。还有用....//这种嵌套写法的,过滤逻辑一替换../,剩下的字符又重新拼成了../。这类绕过手段在漏洞报告里一抓一大把,本质上都是过滤逻辑写得不够彻底。

危害不只是"看到文件"

读取敏感文件是最直接的后果。/etc/passwd算轻的,SSH私钥、数据库配置文件、应用程序源码里的硬编码密码——这些东西一旦泄露,攻击面瞬间扩大几个量级。

但路径遍历不止于读。如果目标接口支持文件上传或写入,配合遍历就能把恶意文件丢到任意位置。往Web目录写一个webshell,往定时任务目录写一个脚本,从"信息泄露"直接升级成"远程代码执行"。这个跳变才是路径遍历真正危险的地方。

我见过一个案例,某CMS的模板编辑功能允许管理员保存文件,但没限制保存路径。攻击者通过遍历把PHP文件写进了Web根目录,然后直接访问触发。整个链条没有任何"高深"技术,全是基本功不到位的锅。

防御的核心思路

最有效的做法其实很朴素:不要让用户输入直接参与路径拼接。如果业务只需要访问特定目录下的文件,那就用文件名去查数据库或白名单,拿到真实的存储路径再读取。用户输入永远不碰文件系统。

实在需要拼接的,两步走。先对输入做规范化——把../、编码变体、多余斜杠统统处理掉,得到绝对路径。然后检查这个绝对路径是否在以允许目录开头的范围内。注意,是规范化之后再做前缀匹配,顺序反了等于没做。

还有个小细节容易被忽略:不同操作系统的路径分隔符不一样,Windows认\也认/,Linux只认/。如果防护只考虑了Linux的写法,部署到Windows上就是个筛子。

框架层面,大多数现代Web框架都提供了安全的文件访问API,比如Java的Path.normalize()配合startsWith()检查,Python的os.path.realpath()加前缀验证。用框架给的轮子,比自己手写字符串替换靠谱得多。

说到底,路径遍历不是什么新漏洞,OWASP Top 10里挂了快二十年。但它一直活着,因为总有人觉得"用户不会那么干"。用户会不会那么干不重要,扫描器一定会。

分享到: