任意文件下载漏洞

 人参与 | 时间:2026-10-17 07:06:55

一个不起眼的任意下载按钮,可能让攻击者拿到你服务器的文件整个文件系统。这不是下载危言耸听。某次渗透测试中,漏洞我仅靠修改一个参数,任意就从目标网站的文件附件下载功能里,直接拉出了/etc/passwd。下载对方还是漏洞家知名电商平台。

漏洞原理简单得让人发指。任意开发者图省事,文件把用户传入的下载文件名直接拼进路径,download?漏洞file=report.pdf,后端就老老实实去读这个文件。任意没人想到有人会传../../../../etc/passwd。文件路径穿越,下载一层层往上跳,直到根目录。更狠的还能读file:///C:/Windows/win.ini,或者配合php://filter把源码也扒出来。

真正可怕的是,这类漏洞往往藏在最不起眼的地方。导出报表功能、图片预览接口、甚至一个favicon.ico的获取接口,都可能成为突破口。我见过一个OA系统,下载附件时用base64编码文件名,看似安全,结果解码后没做任何校验,照样被穿越。安全从来不是表面功夫。

攻击者读到你服务器上的数据库配置文件,拿到账号密码,接着连上内网数据库,拖走所有用户数据。整个过程可能用不了十分钟。而你还在纳闷,日志里怎么多了一条奇怪的下载记录。更麻烦的是,如果服务器上还跑着root权限的服务,那/root/.ssh/id_rsa一旦被读走,整个服务器就等于裸奔了。

有些开发觉得,只要限制文件后缀为jpg或pdf就万事大吉。太天真了。攻击者可以读.env文件,里面躺着各种密钥;读web.xml,分析出框架版本找已知漏洞;甚至读/proc/self/environ,把进程环境变量里的敏感信息全捞出来。后缀限制只能挡住最笨的攻击者。

修复方案倒是不复杂。最稳妥的是把文件名映射成数据库里的ID,用户只能传ID,后端自己去查真实路径。如果非要传文件名,那就做白名单校验,把允许下载的文件列个清单。再不行,用正则过滤掉所有../和绝对路径,但记住,过滤黑名单永远不如白名单可靠。

写这段的时候,我特意去翻了几个开源项目的代码,发现有些项目至今还在用Path.GetFileName()这种半吊子过滤。这种函数在Windows下能过滤掉路径,换到Linux服务器上就失效了。跨平台的坑,踩的人前赴后继。

最后说句实在话,每次测出这种漏洞,我都替企业捏把汗。修起来就几行代码的事,但如果不修,黑客拿到的东西可能比你想象的还要多。别等被脱裤了才想起补漏洞,到那时候,数据早就挂在暗网上论斤卖了。

顶: 496踩: 15777