
兄弟们今天咱们来盘一个经典但永远能要命的漏洞——文件上传。很多开发觉得“我加了后缀校验应该没事了吧”结果被黑客用个图片马或者解析漏洞直接拿下服务器权限。处置文件上传攻击先把四条红线刻在脑子里严禁执行以下操作不要直接删除恶意文件了事删了就没法取证了你不知道黑客是怎么传进来的也不知道他传了几个更不知道他有没有留其他后门。不要只加后缀黑名单.php禁了他传.php5、.phtml、.Php黑名单永远绕得完堵不干净的。不要忽略已上传的其他恶意文件黑客传WebShell往往不止传一个他可能传了个连接用的又传了个提权用的只删你看到的那个等于没清。不要只看扩展名不看文件内容现在伪造文件头太容易了看着是个.jpg里面其实全是PHP代码。处置总原则“先确认上传入口与恶意文件范围再隔离清除先溯源利用方式再修复校验”。一、 正确开局先搞清楚文件是怎么进来的接到告警说服务器有异常文件第一件事是确认恶意文件的进入途径。是上传功能本身有漏洞还是配合了后台弱口令或者是其他漏洞比如SSRF把文件写进来的先摸清上传功能全貌系统里有哪些接口/页面能传文件文件最终存到了哪个目录是本地磁盘还是OSS按“上传入口 → 文件落地 → 执行利用”三层往下收敛明确区分三类情况恶意文件已执行最严重WebShell已经跑起来了直接按主机入侵事件流程处置。恶意文件已上传未执行文件躺在目录里但没被访问过立即隔离清除。上传功能有漏洞未利用黑客在试探或者被WAF拦了赶紧加固修复。二、 排查主链路可复制的命令和操作别靠猜靠日志和系统命令。以下是排查主链路的标准动作1. 查上传目录文件找异常文件# 查找上传目录下最近1天内修改或新增的文件find/var/www/uploads-typef-mtime-1-ls# 重点筛查可疑的脚本扩展名包括各种变种find/var/www/uploads-typef\(-name*.php*-o-name*.jsp*-o-name*.asp*-o-name*.aspx*\)现象对应如果在不该有脚本的目录如图片目录发现了.php或.jsp文件100%是被传了WebShell。2. 分析恶意文件内容看是脚本还是图片马# 查看文件真实类型不只看后缀file/var/www/uploads/1.jpg# 查看文件头十六进制确认是否伪造hexdump-C/var/www/uploads/1.jpg|head-n5# 搜索文件内容里有没有PHP/JSP脚本特征strings /var/www/uploads/1.jpg|grep-iEeval|base64_decode|assert|Runtime.getRuntime|ProcessBuilder现象对应如果file命令说是PHP script但后缀是.jpg说明是纯脚本伪装如果file说是GIF image但strings搜出了eval说明是图片马文件头是图片后面拼接了代码。3. 查访问日志找上传请求和执行记录# 查上传接口的请求记录看是谁传的、传的什么文件名grep-iupload/var/log/nginx/access.log|grep-vE\.(css|js|jpg|png)# 查恶意文件是否被访问过确认是否已执行grep1.jpg/var/log/nginx/access.log现象对应如果看到上传请求的响应码是200且随后有对该.jpg文件的GET请求甚至带了POST参数说明WebShell已经被连接并执行了。4. 查文件是否被执行进程关联# 查当前正在运行的PHP/Java进程看有没有异常的脚本在执行ps-ef|grep-Ephp|java|grep-vgrep# 如果是PHP查php-fpm的慢日志或执行日志tail-n50/var/log/php-fpm/www-slow.log5. 查其他目录防遗漏# 查系统临时目录、备份目录有没有隐藏的可疑文件find/tmp /var/tmp /var/www/backup-typef-name.*-mtime-1find/tmp /var/tmp-typef\(-name*.php-o-name*.sh-o-name*.pl\)6. 拉出攻击者的完整上传时间线结合第一步找到的文件修改时间mtime和第三步的日志时间画出攻击者的操作轨迹什么时候探测的接口、什么时候传的文件、什么时候连的WebShell。三、 高频现场逐个拆1. 扩展名绕过现象传.php被拒但传.Php、.phtml、.php5、.php.Windows特性、.php%00.jpg截断成功了。排查命令find /var/www/uploads -type f -iregex .*\.ph[ppt5]*处理废弃黑名单改用严格的白名单只允许.jpg,.png,.pdf等并且统一转小写后再比对。2. 内容校验绕过图片马现象代码里校验了文件头如前几个字节必须是GIF89a但黑客在图片文件末尾追加了?php eval($_POST[cmd]);?。排查命令hexdump -C 1.jpg | tail -n 10看文件尾部处理对于图片文件不要只做字节头校验必须用图像处理库如GD库、ImageMagick进行重绘/重编码把附加的恶意代码直接“洗”掉。3. 上传目录可执行脚本现象文件确实传到了/uploads/目录后缀也是.php但原本以为这个目录不能执行脚本结果一访问直接运行了。排查命令curl -I http://yoursite.com/uploads/1.php看返回状态码和Content-Type处理在Web服务器配置中显式禁止上传目录执行脚本。# Nginx配置示例禁止uploads目录下执行PHP location ~* ^/uploads/.*\.(php|php5|jsp)$ { deny all; }[!WARNING] 生产环境风险加这条配置后一定要测试一下正常的图片上传和访问是否受影响别把正则写错了导致全站图片403。4. 前端校验绕过现象前端页面用JS限制了只能传.jpg但黑客用Burp Suite抓包把文件名改成1.php直接发过去后端居然也接收了。排查命令查Web日志看该请求的Content-Type和文件名确认后端没做二次校验。处理前端校验只是为了用户体验绝对不能当安全措施后端必须重新校验扩展名和文件内容。5. 配合解析漏洞现象传了1.php.jpg在老版本IIS下被当成PHP解析或者传了.htaccess/.user.ini改变了目录的解析规则导致普通图片被当脚本执行。排查命令# 查有没有上传这些特殊配置文件find/var/www/uploads-name.htaccess-o-name.user.ini-o-nameweb.config处理白名单里绝对不要放行.htaccess、.user.ini等配置文件后缀及时升级中间件修复解析漏洞。6. 批量上传自动化工具现象同一个IP或IP段短时间内高频发起上传请求User-Agent可能是Burp、sqlmap或空。排查命令# 统计上传接口访问最频繁的IPgrepupload/var/log/nginx/access.log|awk{print $1}|sort|uniq-c|sort-nr|head-n10处理上传接口必须加图形验证码或滑块验证对高频IP限流WAF开启防自动化扫描策略。7. 上传文件被用来钓鱼或挂马存储型现象黑客传了个带有恶意宏的.docx或者伪造的.exe、假PDF诱导其他用户下载运行。排查命令查下载日志看哪些用户下载了这些文件提取文件Hash去微步在线/ VirusTotal 查杀。处理文件存储到OSS或独立域名不要和主站同域防止Cookie被偷接入云沙箱或杀毒引擎上传后异步扫描有毒直接删。8. 上传即WebShell上传入口就是后门入口现象传了冰蝎、哥斯拉、蚁剑的Shell流量特征明显如特定的加密Payload或者固定的密码参数。排查命令# 查流量里有没有WebShell连接特征以哥斯拉为例查特定参数名和Base64特征grep-iEpass|pwd|antSword|Behinder|Godzilla/var/log/nginx/access.log处理按主机入侵处置。清除WebShell排查系统账号、计划任务、SSH公钥有没有被篡改修复上传漏洞。四、 处置与修复分场景给策略第一档隔离停上传功能/禁止目录执行如果攻击正在发生立刻在网关层把上传接口封掉或者在Nginx层把上传目录的脚本执行权限干掉参考上面的Nginx配置。把上传目录的权限改为755或750属主设为www绝对不要给777。第二档清除删恶意文件先取证把恶意文件拷贝到隔离区如/tmp/evidence/记录好文件Hash、大小、修改时间。然后批量删除# 确认无误后批量删除上传目录下的所有PHP文件find/var/www/uploads-typef-name*.php-delete[!WARNING] 生产环境风险执行-delete前一定要先用-ls打印出来看看别把正常业务的PHP文件如果有的话给误删了。第三档修复校验存储策略修复优先级能直接传.php并执行的 能传图片马的 只能传文件但不能执行的。修复后验证用各种绕过Payload.php5、.phtml、图片马、.htaccess重新传一遍确认全部被拦截。如果恶意文件已执行别光删文件了直接走主机入侵处置流程查权限维持有没有留后门账号、查横向移动有没有扫内网、查数据影响有没有拖库。五、 根因分析到底是怎么漏的用日志时间线文件mtime代码git blame一抓一个准只校验扩展名不校验内容后缀对了里面是啥不管图片马就是这么进来的。黑名单过滤可绕过只禁了.php没禁.php5、.phtml。上传目录可执行脚本Web服务器没配置禁止上传目录解析脚本。存储与执行未分离上传的文件和Web代码放在同一个域名、同一个目录下一旦传了脚本就能直接访问执行。文件类型判断不可靠只信前端传的Content-Typeimage/jpeg或者只看了文件头没做深度检测。前端校验被当安全措施以为加了JS限制就万事大吉后端直接“裸奔”。定位责任拉出恶意文件写入磁盘的时间点去Git里查对应上传接口文件的最后修改人直接定位到具体开发。六、 事后加固要点吃一堑长一智处置完必须做系统性加固白名单校验扩展名白名单 文件内容深度检测 文件头校验三管齐下。随机文件名上传后的文件必须重命名用UUID或时间戳随机数绝对不要保留用户原始文件名防止文件名包含特殊字符导致解析漏洞或目录穿越。上传目录禁止执行脚本Nginx/Apache/Tomcat 必须配置禁止上传目录执行任何脚本。存储与Web服务分离上传的文件存到OSS、CDN或独立的静态资源域名不要和业务系统同域从物理上切断执行路径。图片类文件重编码处理如果是图片后端用GD库或ImageMagick重新读取并保存一次洗掉所有附加代码。访问控制敏感的上传接口如后台管理系统的文件上传必须加严格的登录鉴权和RBAC权限控制。防护规则WAF开启文件上传防护规则拦截常见的WebShell特征和危险后缀。上传日志留存与告警记录每次上传的操作人、IP、文件名、文件Hash。配置HIDS或云安全中心上传目录出现新增脚本文件立刻报警。七、 总结处置过程中高频踩坑最后盘点几个咱们在现场经常踩的坑大家引以为戒只删文件不修校验删了1.php没修代码黑客换个名字传个2.php继续拿权限。黑名单绕过方式没堵全禁了.php没禁.php.Windows或.php::$DATAIIS被轻松绕过。上传目录能执行脚本以为传到了uploads目录就安全了结果Nginx没配禁止解析脚本照样跑得欢。没查其他恶意文件只清了告警报出来的那一个文件没去扫整个目录漏了黑客留的第二个后门。文件类型判断只看后缀被Content-Type: image/jpeg骗了后端没做二次校验。把前端校验当安全措施前端JS限制形同虚设抓包改个后缀直接传。存储执行不分离上传的文件直接放在Web根目录下和代码混在一起一旦传了脚本直接就能访问执行。文件上传漏洞核心就在于“永远不要信任用户上传的任何东西”。把上面这套排查和处置流程跑熟下次遇到服务器被传了奇怪文件照着做快速止血把损失降到最低。觉得这篇复盘实用的话点个赞、收藏一下后续还会继续更新一线实战系列。有遇到过奇葩文件上传绕过手法的兄弟欢迎评论区聊聊咱们一起交流