
核心要点(TL;DR)
- 先隔离取证再删除:保留快照与日志,否则无法定位入口,清理后极易二次被挂。
- webshell定位靠三件事:异常文件时间线、可疑PHP函数特征、访问日志中的POST异常路径。
- 根除不等于删文件:要同步排查计划任务、SSH公钥、数据库触发器与cron后门。
- 复查至少观察72小时:监控新增文件、外连请求与登录记录,确认无回连再恢复业务。
凌晨收到监控告警,首页被插入博彩链接,后台多出陌生管理员——这是典型的网站被挂马场景。很多运维的第一反应是删文件、改密码,结果几天后再次被挂。本文给出一套可落地的网站被挂马后门清理全流程:从隔离取证、定位webshell,到根除持久化后门与复查,每一步都给出命令和检查清单,照着做即可完成一次规范的应急响应。
第一步:隔离与取证快照,先别急着删
删除是不可逆操作,而webshell文件本身、访问日志、进程信息是定位入口的唯一线索。正确顺序是先隔离、再取证、最后清理。
- 将站点切到维护页或暂停解析,避免攻击者继续操作;
- 对云主机创建快照,物理机用
tar -czf /backup/site-$(date +%F).tar.gz /var/www /etc/nginx /etc/cron*打包关键目录; - 导出数据库:
mysqldump -uroot -p --all-databases > /backup/db.sql; - 保存日志:
cp /var/log/nginx/access.log /backup/,同时记录ps aux、ss -antp、crontab -l输出。
取证完成后,把备份文件移出Web目录,避免备份本身成为可下载的数据泄露源。
第二步:定位webshell的三种有效手段
1. 按文件时间线筛异常
攻击者落地文件的时间通常集中在某个窗口,用修改时间排序能快速缩小范围:
find /var/www -type f -newermt '2024-01-01' -printf '%TY-%Tm-%Td %TH:%TM %p\n' | sort -r | head -50
重点看上传目录(uploads、attachment)、缓存目录、图片目录中的.php文件,以及文件名伪装成index.php.bak、.htaccess的可疑文件。
2. 按危险函数特征扫描
grep -rEn 'eval\(|assert\(|base64_decode\(|gzinflate\(|system\(|passthru\(|preg_replace.*/e' /var/www --include='*.php'
框架和正常插件也可能命中,必须人工打开复核上下文,确认是否为可控输入拼接执行,不要批量删除。
3. 从访问日志反查入口
awk '{print }' access.log | sort | uniq -c | sort -rn | head -30
grep -i 'POST' access.log | grep -Ev '\.(js|css|png|jpg)' | head -50关注POST到非常规路径、单IP高频请求、User-Agent异常(如sqlmap、curl)的记录,往往能直接定位到webshell路径与上传入口。
第三步:根除后门,别只删webshell文件
只删webshell等于没清理。攻击者通常留有多处持久化后门,按下面清单逐项排查:
| 位置 | 检查命令/方法 | 处置 |
|---|---|---|
| 计划任务 | crontab -l、ls /etc/cron.* | 删除陌生任务 |
| SSH公钥 | cat ~/.ssh/authorized_keys | 移除未知公钥 |
| 系统账号 | awk -F: '==0' /etc/passwd | 锁定非root的UID 0账号 |
| 数据库 | 检查管理员表、触发器、UDF | 删除异常账号与触发器 |
| Web配置 | 检查nginx/apache的include与auto_prepend_file | 还原被篡改配置 |
同时更换所有相关凭据:CMS后台密码、数据库密码、SSH密钥、云账号AK/SK,并升级CMS与插件到最新版本,修补已知漏洞。若发现系统命令被替换或存在rootkit迹象,建议直接重装系统并从干净备份恢复。
第四步:复查与防复发清单
清理完成后至少观察72小时,确认没有回连与新增文件:
- 建立文件基线:
find /var/www -type f -exec md5sum {} \; > baseline.txt,每日对比差异; - 监控外连:
ss -antp | grep -v ':80\|:443',排查陌生IP连接; - 检查登录记录:
last、lastb,确认无异常登录; - 限制上传目录执行权限,在nginx中配置
location ~* /uploads/.*\.php$ { deny all; }; - 开启WAF与文件完整性监控,对Web目录变更实时告警。
在防护建议上,可借助AegisX的Web防护与文件完整性监控能力,对webshell上传特征、异常外连和目录变更做持续检测,把应急从被动救火前移到主动拦截。
行动建议
现在就做三件事:第一,为站点建立文件哈希基线并每周对比;第二,把本文的取证命令整理成应急脚本,出事时一键执行;第三,限制上传目录执行权限并开启WAF。网站被挂马不可怕,可怕的是删完文件就以为结束——只有完成取证、根除、复查闭环,才算真正清理干净。
常见问题(FAQ)
网站被挂马后,第一件事应该做什么?
第一件事是隔离与取证,而不是立刻删文件。先把站点切到维护页或下线解析,对服务器做快照或打包备份(含网站目录、数据库、日志),再开始排查。原因是被删除的webshell和访问日志是定位入侵入口的唯一线索,删掉后往往只能重装系统,成本更高。取证完成后再进入清理环节。
怎么快速判断服务器上有没有webshell?
用文件时间线加特征扫描两步走。先执行find /var/www -type f -newermt '2024-01-01' -ls按修改时间筛出近期变动文件,重点看上传目录与缓存目录;再用grep -rEn 'eval\(|assert\(|base64_decode\(|system\(|passthru\('定位可疑函数调用。注意正常框架也可能命中,需要人工复核上下文,不要直接批量删除。
清理完webshell后网站又被打挂了怎么办?
说明入口没堵住或存在未发现的后门。重点复查四类持久化位置:cron计划任务、SSH authorized_keys、数据库中的触发器与管理员账号、Web容器配置中的自动加载项。同时核对CMS与插件版本是否仍有已知漏洞,改掉所有后台与数据库密码,并检查是否有隐藏的管理员账号被创建。
没有专业安全设备,个人站长怎么做复查?
用系统自带工具做基线对比即可。记录当前所有文件哈希(find /var/www -type f -exec md5sum {} \; > baseline.txt),之后每天对比新增与变更文件;用netstat -antp或ss -antp观察异常外连;定期查看access.log中POST到非常规路径的请求。坚持观察72小时以上,确认无新增可疑文件再结束应急。
被挂马后必须重装系统吗?
不一定,但要满足条件才可不重装。如果确认入侵仅通过Web应用层、未拿到系统权限、且已完整排查持久化位置并更换全部凭据,可以在清理后继续使用。若发现rootkit迹象、系统命令被替换或无法确认入侵深度,建议重装系统并从干净备份恢复数据,这比反复清理更省时间。