
核心要点(TL;DR)
- 先隔离取证再清理:挂马后立即快照或备份现场,直接删文件会丢失定位入口的关键线索。
- 定位入口看三处:被改文件的修改时间、同期Web访问日志中的POST上传请求、异常进程与计划任务。
- webshell排查优先查上传目录与图片目录,用grep匹配eval、assert、base64_decode等特征。
- 清理后必须改口令、打补丁、收紧目录执行权限,否则同一入口会在数天内被再次利用。
网站被挂马,很多运维的第一反应是找到恶意代码删掉、页面恢复就完事。结果往往三天内又被挂上,甚至多了几个后门。问题不在清理不彻底,而在篡改入口没定位——攻击者是怎么写进来的、从哪个文件、哪条请求进来的,没搞清楚就等于没止血。本文给出一套可直接照做的网页防篡改应急排查步骤,从取证、时间线比对、日志溯源到webshell查杀与加固,帮你把入口挖出来。
一、先隔离取证,别急着删文件
挂马处置的第一原则是保留现场。被篡改文件的修改时间、同期的访问日志、残留进程,都是定位入口的关键线索,删掉就再也找不回来。
- 对站点目录打包快照:
tar -czf /backup/site-$(date +%F).tar.gz /var/www/html,数据库同步导出。 - 记录异常文件清单:
find /var/www/html -type f -mtime -3 -ls > /tmp/changed.txt。 - 站点切维护页或暂停解析,防止继续被写入,但不要关机,内存中的进程与网络连接同样有价值。
若服务器已被植入rootkit,取证应在镜像或快照上进行,避免在受控系统里执行不可信命令。
二、用文件时间线锁定被改文件
挂马通常集中在少数文件:首页、公共引入文件、.htaccess、图片目录下的伪装php。按修改时间排序能快速圈定范围。
find /var/www/html -type f -newermt '2024-05-01 00:00' -printf '%TY-%Tm-%Td %TH:%TM %p\n' | sort
再与备份或Git版本库做差异比对:
diff -rq /backup/html_old /var/www/html | grep -v 'Only in'
重点检查以下位置:
- 各目录 index.php、header.php、footer.php 尾部是否被插入
<script>或 iframe; - uploads、images、cache 等本不该有脚本的目录中出现的 .php/.phtml 文件;
- .htaccess 是否被加入伪静态跳转或 AddType 解析规则;
- 文件属主与权限是否被改为 www-data 可写或 777。
三、从Web日志反推篡改入口
文件时间只告诉你「什么时候被改」,日志才告诉你「谁、通过什么请求改的」。围绕被篡改时间点前后30分钟筛选日志。
grep -E 'POST|upload|edit' /var/log/nginx/access.log | awk '{print ,,}' | sort | uniq -c | sort -rn | head -30关注四类信号:
- 对上传接口、编辑器、备份恢复等功能的 POST 请求,返回 200 且紧随其后出现异常文件;
- 访问
/uploads/xxx.php直接执行并带参数的请求; - 同一 IP 短时间内大量 404 扫描后突然成功,说明在找入口;
- 异常 User-Agent 或明显伪造的 Referer。
日志被清空时,检查 access.log.1、系统 /var/log/secure、auditd 记录,以及面板自带的操作日志。
四、查webshell、进程与持久化后门
入口往往伴随一个webshell。按特征扫描站点目录,再结合进程与计划任务判断是否已提权持久化。
grep -rnE 'eval\(|assert\(|base64_decode\(|gzinflate\(|$_(POST|GET|REQUEST)\[ ' /var/www/html --include='*.php'
ps aux --sort=-%cpu | head -20 crontab -l; ls -la /etc/cron.* ss -antp | grep ESTAB find / -perm -4000 -type f 2>/dev/null
特别留意:伪装成图片的文件头(GIF89a 后接php代码)、文件名含空格或双扩展名的文件、以及 /tmp 下可执行文件。发现可疑文件先复制样本再删除,便于后续分析。
五、清理与加固检查清单
| 环节 | 动作 | 验证方式 |
|---|---|---|
| 入口修复 | 升级CMS/插件、修补上传校验、删除无用后台 | 复测漏洞点返回正常 |
| 口令 | 改SSH、数据库、后台全部口令 | 旧口令登录失败 |
| 权限 | 上传目录禁止执行PHP,站点目录只读 | 访问 .php 返回403 |
| 监控 | 部署文件完整性校验与篡改告警 | 模拟改文件能触发告警 |
加固阶段可接入 AegisX 的网页防篡改能力:对站点文件建立完整性基线,任何非法改动实时告警并可自动还原,同时配合WAF拦截上传型攻击,把入口再次被利用的窗口压到最小。
行动建议
按「取证—时间线—日志—webshell—加固」五步走,每步留证据再动手。定位到入口后,先修复漏洞再恢复页面,最后用完整性监控守住成果。把本文的检查清单存成应急手册,下次被挂马时直接照着执行,比临时翻日志快得多。
常见问题(FAQ)
网站被挂马后,第一步应该做什么?
第一步是隔离与取证,而不是删文件。先对站点目录和数据库做快照或打包备份,记录被篡改文件的路径与修改时间,再把站点切到维护页或下线解析。保留现场后才能通过文件时间线和Web日志反推篡改入口,直接删除会丢失关键证据,导致同一漏洞被反复利用。
怎么快速找到被篡改的网页文件?
用文件修改时间做时间线比对最快。执行 find /var/www -type f -newermt '2024-05-01' -mmin -1440 列出近期改动文件,再与备份或版本库做 diff 校验。重点看 index.php、header/footer 引入文件、.htaccess 与图片目录下的 php 文件,挂马通常表现为页面尾部被插入 script 或 iframe。
Web日志能定位到篡改入口吗?
能,但要抓关键请求。在被篡改时间点前后筛选 POST 请求与上传路径,例如 grep -E 'POST|upload' access.log 并按状态码 200 排序,重点关注上传目录、编辑器接口和异常 UA。若日志已被清理,可查看是否存在 access.log.1 或系统 audit 日志,仍有机会还原入口。
如何判断服务器上是否留有webshell?
按特征加行为双重判断。先用 grep -rnE 'eval\(|assert\(|base64_decode\(|$_(POST|GET|REQUEST)' 扫描站点目录,再结合 find 查找近期新增的可执行文件与异常权限文件。同时用 lsof 与 ps 观察是否有可疑进程持续外连,必要时用专业查杀工具交叉验证,避免只删特征文件漏掉变种。
清理挂马后如何防止再次被篡改?
清理后必须闭环加固:修改所有后台与SSH口令、升级CMS与插件补丁、禁止上传目录执行PHP、关闭不必要的写入权限,并部署网页防篡改或文件完整性监控。AegisX 可对站点文件做完整性基线校验与篡改实时告警,配合WAF拦截上传型攻击,能在入口被再次利用时第一时间发现。