游客发表

任意文件操作漏洞

发帖时间:2026-10-17 05:02:43

某个深夜,任意某家SaaS公司的文件运维收到告警:服务器上多了一个名为“update.php”的文件,大小只有2KB。操作他打开一看,漏洞是任意一段加密的WebShell。攻击者利用的文件正是系统某个上传接口未对文件名做任何校验——上传路径直接拼接了用户传入的相对路径。他上传的操作不是头像,而是漏洞../../../../tmp/shell.php。就这么简单,任意一个“任意文件写”漏洞,文件把整台服务器变成了攻击者的操作后花园。

任意文件操作漏洞,漏洞说白了就是任意攻击者能往你服务器上写文件、读文件,文件甚至删文件。操作它不像SQL注入那样需要构造复杂的语句,也不像RCE那样需要摸清底层环境。它的成因往往极其朴素:开发者对用户输入的文件名、路径参数缺少过滤,或者对文件内容缺少校验。但后果却可以很重——写一个WebShell,等于直接拿下了服务器权限;读一个/etc/passwd或数据库配置文件,等于把家底都翻了出来。

我见过最典型的案例,是一个图片处理接口。开发者为了“灵活”,允许用户通过参数指定输出目录,代码大概是file_put_contents($dir . '/' . $filename, $data)。$dir和$filename都来自用户请求,既没过滤../,也没限制扩展名。攻击者把$dir设为../../public/,$filename设为shell.php,上传一段PHP代码——整个站就被拿下了。事后修复方案很简单:把$dir写死,或者用realpath()校验最终路径是否在允许范围内。但修复之前,数据已经被拖走了。

另一个容易被忽视的场景是压缩包解压。很多后台都支持上传zip并自动解压,比如导入模板、更新主题。如果解压时没检查压缩包内的文件名,攻击者可以构造一个包含../../../../var/www/html/shell.php的恶意zip。解压函数会老老实实把文件写到目标位置。更阴险的是,攻击者可以把文件名改成.htaccess或web.config,直接改写服务器配置。这种攻击不需要任何前置漏洞,只要后台有解压功能且没做路径穿越防护。

读文件漏洞同样致命。有些系统为了“方便”,允许用户通过参数指定下载文件名,比如download.php?file=report.pdf。如果代码直接拼路径读文件,攻击者把file改成../../../../etc/shadow,就能拿到密码哈希。更常见的是备份功能——备份目录可指定,备份文件名可注入,结果备份文件被下载到攻击者手里。这类漏洞在旧版PHP+Apache的组合里尤其普遍,因为open_basedir没配好,或者配了但路径校验写得不严。

怎么防?核心就两条:第一,所有涉及文件路径的操作,必须做白名单校验或路径归一化处理。别用黑名单,黑名单永远漏。第二,文件内容要校验,不能只靠扩展名。图片就用getimagesize()检查文件头,压缩包就逐个检查条目名称是否包含..或绝对路径。另外,上传目录别放在Web根目录下,或者干脆把执行权限关掉——用Nginx的location规则禁止该目录解析PHP。这些措施不复杂,但很多团队就是懒得做,觉得“没人会这么攻击”。现实是,扫描器每天都在全网找这种漏洞,找到就自动植入挖矿程序。

我自己测试过不少目标站点,发现一个规律:凡是文件操作漏洞多的系统,往往代码结构混乱,开发者喜欢把用户输入直接拼到文件路径里,还自以为是“灵活”。灵活是好事,但得有个度。你让用户选模板、选导出格式,这没问题;但让用户指定服务器上的任意路径,那就是在给攻击者递刀。安全不是加个WAF就完事,而是从每一行文件操作的代码里抠出来的细节。写代码时多问一句:“如果这个参数是../../../../etc/passwd,我的程序会怎样?”——能问出这一句,很多漏洞就不会存在了。

    热门排行

    友情链接