当前位置:首页 > 知识

文件包含漏洞的危害

一个不起眼的文件图片上传框,可能让整个服务器沦陷。包含这不是漏洞危言耸听。2019年,文件某省政务系统遭遇攻击,包含攻击者只是漏洞往一个看似无害的“头像上传”功能里塞了一段PHP代码——文件被原样保存,后缀改成了.jpg,文件但服务器解析时却执行了其中的包含指令。数据库被拖走,漏洞后台权限易主,文件整条业务线瘫痪了三天。包含事后排查发现,漏洞漏洞根源就是文件典型的文件包含:系统在加载页面模块时,直接引用了用户可控的包含文件路径,没有做任何过滤。漏洞

文件包含漏洞的核心危险在于,它把“读取文件”升级成了“执行代码”。如果开发者写了类似`include($_GET['page'])`的代码,攻击者就能把`page`参数指向服务器上的任意文件——比如`/etc/passwd`,或者日志文件、临时上传目录。更狠的是,配合PHP的`data://`或`php://input`协议,攻击者可以直接在请求体中塞入恶意代码,让服务器当场执行。这跟SQL注入类似,但危害面更广——SQL注入好歹还有数据库权限限制,文件包含经常直接拿到Web服务的系统权限。

我见过一个真实案例,某电商网站后台的报表功能需要加载模板文件,程序员图省事,把文件名直接拼在URL里。结果攻击者用`../../../../etc/shadow`遍历目录,拿到了系统用户哈希。虽然密码没被立即破解,但配合弱口令爆破,两天后root权限就被拿下了。整个过程没触发任何安全告警——因为流量看起来就是正常的HTTP请求。

还有个隐蔽的坑:日志文件包含。攻击者往User-Agent头里写PHP代码,然后让服务器包含访问日志文件。日志里全是恶意代码,一旦被include,就相当于把后门种进了服务器。这种攻击连文件上传都不需要,只要目标有一个文件包含点,就能远程执行命令。很多运维人员根本想不到日志文件也能成为攻击媒介。

文件包含漏洞的可怕之处还在于它很难被彻底防御。黑名单过滤文件后缀?攻击者可以用空字节截断(老版本PHP)或者URL编码绕过。限制包含路径?`php://filter`能读取任意文件内容,配合`data://`甚至能直接执行代码。最稳妥的办法是白名单——只允许包含预先定义好的文件,但这要求开发者在设计阶段就考虑安全,很多遗留代码根本做不到。

更麻烦的是,这种漏洞经常藏在第三方组件里。某个开源CMS的插件,某个论坛系统的附件预览功能,都可能存在文件包含点。一旦组件被弃更,漏洞就永远躺在那里。我见过不少企业,内部系统用了七八年的老框架,代码里到处是`include($_GET['module'])`这种写法——不是他们不懂安全,是业务迭代太快,根本没时间重构。

所以别小看任何一次文件上传或参数传递。攻击者不需要什么高深技巧,只要找到一处文件包含,配合点耐心,就能把服务器翻个底朝天。修复方案其实简单:禁用动态包含、使用绝对路径白名单、对上传文件做内容校验。但真正难的是让每个开发者在写下一行代码时,脑子里都绷着这根弦——毕竟漏洞的代价,往往是整个系统的沦陷。

分享到: