head -c 2 suspicious.jpg | xxd
file --mime-type -b suspicious.jpg
find uploads -type f -exec file {} \; | grep -i executable
安全扫描在附件目录扫出 3 个 PE 文件,文件名都是 .jpg,上传时 Content-Type 报的是 image/jpeg,服务端只看了后缀和请求头就放行。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,后缀和 Content-Type 都由客户端决定,改起来没有成本。真正的类型要看文件头魔数,JPEG 固定以 FF D8 FF 开头,PE 是 4D 5A。校验只做在扩展名这一层,等于没有校验。
「魔数校验」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
处理上按这个顺序:上传落盘前读前 8 个字节 按魔数表判断真实类型;白名单只留业务需要的几种 其余直接拒绝;落盘后的文件名重写成随机串 不带原扩展名参与路径;把那 3 个文件重新传一次确认被拦。
改完只确认一件事:同一文件上传返回 415 附件目录里不再出现非图片文件。
