文件删除漏洞
某次渗透测试,文件目标站点的删除文件上传功能过滤了后缀名,我绕过了它,漏洞上传了一个jpg。文件然后我试着把路径改成`../../../../tmp/shell.php`,删除服务器居然把文件写到了/tmp目录下。漏洞这不是文件上传漏洞,这是删除删除漏洞——攻击者可以删除服务器上任意文件。
文件删除漏洞听着不如RCE唬人,漏洞但危害一点不小。文件删除`install.lock`就能重装系统,删除删除`.user.ini`或`.htaccess`能瘫痪整个目录的漏洞解析规则,删除`index.php`直接让站点白屏。文件更阴险的删除是配合竞争条件——删除临时文件、日志文件,漏洞或者删掉认证凭证文件,让管理员被迫重置密码,然后你拿着新密码登录。
这类漏洞多半出在“下载文件”功能里。开发者图省事,直接用`unlink($_GET['file'])`,以为加个`../`过滤就安全了。可过滤总有绕法——URL编码、双写、Unicode规范化,或者直接用绝对路径。我见过一个站,它把文件名base64编码后再传参,结果解码后没做任何校验,直接拼进`unlink()`。等于给攻击者递了一把万能钥匙。
还有一种更隐蔽的触发点:图片裁剪、压缩、转码功能。有些库会生成临时文件,处理完再删。如果文件名来自用户输入,且没有严格白名单,攻击者就能让程序删掉任意路径。比如某CMS的缩略图功能,文件名参数直接进`unlink($tmp_dir . $filename)`,攻击者把`$filename`改成`../../config.php`,站点配置就没了。
修复思路其实很朴素——别信任何用户输入。用随机字符串重命名临时文件,删除时只操作固定目录下的文件,用`realpath()`解析后检查前缀。更简单的做法是:干脆别用`unlink()`,把文件移到隔离区,让管理员手动确认。牺牲点便利性,换来的是一整类漏洞的根除。
我见过不少团队花大价钱买WAF、上扫描器,却忽略了自己代码里的`unlink()`。漏洞不挑地方,就怕你没想到。文件删除看似小事,真被删了核心文件,哭都来不及。








