上传成功不等于安全。后台弹个绿勾、进度条跑满,扩展名、大小、MIME 类型全过了校验,不少人到这一步就收工了,觉得上传这块已经做干净。问题在于攻击者根本不看你这一步,他们看的是服务器拿到文件之后还会拿它干什么。二次上传漏洞的杀伤点就在这儿——第一次上传挑不出毛病,第二次处理的时候才出事。

二次上传漏洞的常见套路:合规进门,二次执行
上传接口本质上就是个门卫,它只负责进门这一下。文件落地以后呢?改名、缩放、转格式、打包、解压、同步到另一台机器、再塞进对象存储——这些动作统统发生在门卫看不到的地方。只要其中某一环完整地信任了第一步的检查结论,前面那道关就等于白设。行业内把这类情况叫二次上传,也有人叫二次解析,说法不一样,本质是一回事。
举个不算新鲜的例子:一张能正常打开的 GIF,尾部拼一段代码。看图软件认它,脚本解释器也不嫌弃它是图片。第一次上传它是图,第二次某个环节把它当脚本读,就出问题。图片马这个东西玩了十几年,还是有人中招。
还有一类更容易被忽略的——编辑器里那个「粘贴网络图片自动保存」「从 URL 导入图片」。服务端自己去远端抓内容写进 uploads,这条链路压根不走上传白名单,签名、类型、大小全都不在检查范围内。另外,路径穿越也常跟它一起出现:解压模板包、素材包的时候,包里塞一个带 ../ 的条目,直接写到站点根目录去。
同名覆盖,最朴素也最常被忽略的一步
头像、封面、文章配图,很多程序保存时直接用原始文件名,或者用用户 id、时间戳拼出一个可预测的路径。路径能猜,就等于给了对方一个覆盖入口。这一步不需要任何技术含量,传一个同名文件,原来的文件就没了——看时间戳是新的,日志里也只是一条普通上传记录。
还有一种现场是这样的:老站里躺着几年前的残留文件,谁也说不清是哪个插件留下的。攻击者不新增文件,只覆盖其中一个正常文件,顺带把同目录的配置文件、入口脚本也盖掉。排查的时候看目录结构毫无异常,翻日志也翻不出「新建」行为,覆盖类问题的麻烦就在这。
缩略图和转码,把可控输入喂给了图像库
头像功能基本等于缩略图功能,缩略图又基本等于图像处理库。GD、Imagick、ffmpeg 这些组件吃的是攻击者能控制的字节。ImageMagick 过去几年出过好几次和 coder 相关的安全问题,具体影响哪些版本、修了什么,以官方安全公告和发行版补丁说明为准,别拿旧帖子里的结论当现在的结论。
常规收口办法:在 policy.xml 里把用不上的 coder 关掉(MVG、MSL、URL、EPHEV 这些默认就没必要开),处理进程用低权限用户跑,限制它只能写指定目录。还有一个容易漏的点——二次渲染之后文件内容会变,原来那套「扫过了没毒」的结论不一定还成立,二次产物也得再验一遍。
直传对象存储之后的那一次回调
现在不少站点是前端直传对象存储,后端收到上传完成的回调再处理。这条链路上,回调本身就是一个信任边界:谁都能构造一个回调请求的话,后端就会去下载一个自己没校验过的对象,再写回本地目录做压缩或者加水印。签名校验、回调来源限制、对象 key 的归属确认,这几步少一步都可能被绕。
落地目录能不能执行,决定事故的规模
这条比前面所有招数都关键。uploads 目录只要不解析脚本,上面那些花活大多只能变成「传了一堆垃圾文件」。nginx 里给上传目录单独写个 location,直接拒掉脚本后缀;Apache 可以用 .htaccess 关掉处理器的指派;再稳一点的做法是把上传目录放到 web 根外面,由程序读出来输出,open_basedir 顺手也限制一下。
最坏组合大家都熟:目录可写、同时可执行、还给了运行用户整站的写权限。真出事儿那天,人家不用什么高级手法,写个文件就落地了。上传目录和站点根目录分开,这点没什么技术含量,但能省很多事。顺带提一句,别指望清理完就结束了——有些站清干净了,恢复一次备份又把旧文件带回来,白忙一场。
文件名、可见性,还有几个容易被跳过的细节
原始文件名别直接拿来用,谁知道里面夹了什么奇怪字符,改成随机串加白名单派生的后缀更省心。上传目录把目录索引关掉,别让人一看列表就知道你有哪些文件。图片这类资源走独立域名或对象存储更稳妥,跟主站 cookie 隔开,也把 XSS 的连带损失压下去。错误提示别回显真实路径,这种小地方泄露的信息比想象中多。
已经被人玩过一手,日志里能看出什么
去 access log 里找 uploads 路径下的请求,看清楚 POST 之后紧跟着的 GET 是谁发的。有些文件从来没被页面引用过,却一直有人直接请求,这种最值得盯。再比对一遍文件哈希和上传时间,同名文件时间戳对不上就要问一句为什么。同目录里扩展名和内容明显不搭的,也别放过。
自查顺序,按这个走一遍
上传目录禁执行;文件名随机化加白名单;原始文件和缩略图分两个目录存;解压、导入、粘贴外链这些功能单独审一遍,路径穿越和解压炸弹都要防;图像处理库关掉多余 coder、低权限运行;上传目录移出 web 根、关目录索引;定期扫 uploads 和备份包;错误信息不回显路径。这一串做完,剩下的就是常规运维的事。
上传这块的安全感,往往来自「没报错」三个字。可攻击者要的正好是「没报错之后还能再走一步」。把这一步堵住,靠上传起手的入侵大多会卡在第一关。
【版权声明】:本站内容若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!