从一次真实的应急响应说起:我们是如何通过异常图片上传流量发现被入侵的JunAMS服务器
从异常图片上传流量溯源一次企业级Web入侵应急响应实录那天凌晨3点17分值班手机突然响起刺耳的告警声。监控系统显示某台Web服务器出现异常流量波动Nginx日志中频繁出现对/admin.php/common/add_images.html的POST请求——这本该是后台管理员上传图片的接口却在非工作时间被大量调用。更可疑的是请求中混杂着.php后缀文件。这个异常信号最终让我们发现了一台已被植入Webshell的JunAMS服务器。以下是完整的应急响应过程与技术复盘。1. 异常现象捕捉与初步分析任何安全事件调查都始于异常信号的发现。当时我们的ELK日志系统触发三条关键告警非常规时间访问凌晨2:30-3:30期间连续17次访问后台接口非常规文件类型.php文件通过图片上传接口提交非常规IP行为来自荷兰阿姆斯特丹的IP首次访问系统通过以下Nginx日志片段可以清晰看到攻击特征45.129.56.72 - - [18/Nov/2022:03:21:47 0800] POST /admin.php/common/add_images.html HTTP/1.1 200 312 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 45.129.56.72 - - [18/Nov/2022:03:22:13 0800] POST /admin.php/common/add_images.html HTTP/1.1 200 297 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36关键排查步骤使用grep过滤异常时间段的POST请求grep -E 18/Nov/2022:03:[0-5][0-9]:[0-5][0-9] /var/log/nginx/access.log | grep POST /admin.php检查文件上传目录的最近修改时间find /var/www/html/public/upload -type f -mtime -1 -ls2. 漏洞原理深度剖析JunAMS是基于ThinkPHP开发的内容管理系统其1.2.1版本存在编号CNVD-2020-24741的文件上传漏洞。该漏洞的核心在于两处设计缺陷权限验证缺失common/add_images接口未继承后台权限基类Backend的验证机制文件检测缺陷仅检查文件头标识而忽略后缀名过滤攻击者利用方式非常典型构造包含PHP代码的图片文件如GIF头PHP代码直接上传.php文件绕过检测通过返回的路径访问Webshell以下是对比正常与异常上传请求的差异特征项正常请求攻击请求Content-Typeimage/jpegapplication/octet-stream文件后缀.jpg/.png.php请求时间工作时间段凌晨时段User-Agent内部浏览器标识伪造浏览器标识3. 入侵痕迹定位与清除发现异常后我们立即启动三级应急响应预案。通过以下步骤确认入侵事实Webshell定位# 查找最近修改的PHP文件 find /var/www/html -name *.php -mtime -1 -exec ls -la {} \; # 检查可疑文件内容 grep -r eval( /var/www/html/public/upload/攻击者活动痕迹/tmp目录下发现.cache隐藏目录MySQL历史命令中存在非常规SELECT * FROM admin查询crontab中被添加了反向Shell任务紧急处置措施立即封禁攻击IPiptables -A INPUT -s 45.129.56.72 -j DROP删除确认的Webshell文件重置所有系统账号密码创建系统快照供后续取证重要提示在删除Webshell前务必先取证记录文件的md5值、创建时间等元数据这是后续法律追责的关键证据。4. 系统加固与长效防护事件处理后我们实施了多层次防护策略代码层加固升级JunAMS到最新版本重写文件上传类增加后缀白名单校验$allowed_ext [jpg, png, gif]; if (!in_array($ext, $allowed_ext)) { die(Invalid file type); }系统层防护文件上传目录禁用PHP执行Directory /var/www/html/public/upload php_flag engine off RemoveHandler .php /Directory设置严格的目录权限chown www-data:www-data /var/www/html/public/upload chmod 750 /var/www/html/public/upload监控增强方案在Nginx配置中添加异常上传检测规则location ~* /admin.php/common/add_images { if ($request_method POST) { access_log /var/log/nginx/upload_attack.log; } }部署OSSEC实时监控关键目录变更5. 事件复盘与经验沉淀这次事件暴露出三个典型问题开源系统版本更新滞后仍在使用2019年版本文件上传功能缺乏多层校验机制凌晨时段的异常流量监控灵敏度不足我们后来在内部wiki记录了完整的应急checklist文件上传漏洞自查清单[ ] 是否实施文件后缀白名单机制[ ] 上传目录是否禁止脚本执行[ ] 是否定期审计上传文件内容[ ] 是否监控非常规时间的上传行为[ ] 是否记录完整的上传操作日志在安全运维中最危险的往往不是漏洞本身而是对异常信号的忽视。那次事件后我们养成了每周审计Web日志的习惯任何对/admin.php的非管理IP访问都会触发二级告警。安全就像氧气存在时感觉不到它的重要一旦缺失就会立即危及生命。