
核心要点(TL;DR)
网站突然被搜索引擎标红、用户访问跳转到博彩页面,或者服务器CPU莫名飙升——这些都是网站被挂马的典型症状。作为运维或站长,面对这种紧急情况,你需要快速定位并清除恶意代码,恢复网站正常访问。本文基于实战经验,提供从nginx日志分析到webshell清理的完整步骤,帮你有条不紊地完成排查与恢复。
一、紧急隔离与证据保留
发现挂马后,第一要务是防止影响扩大,同时保留现场证据。
- 隔离网站:将服务器从负载均衡中摘除,或修改nginx配置返回503,避免用户访问被感染的页面。
- 备份日志:立即备份nginx访问日志和错误日志,这些是溯源的关键。命令:
cp /var/log/nginx/access.log /tmp/access.log.bak - 备份网站文件:使用tar打包网站目录,注意不要遗漏隐藏文件。命令:
tar -czf /tmp/site_backup.tar.gz /var/www/html - 记录异常现象:如被篡改的页面URL、跳转代码片段、异常进程等,便于后续分析。
注意:不要急于删除可疑文件,以免破坏攻击痕迹。
二、分析nginx日志定位攻击入口
nginx日志记录了所有请求,通过分析可以找到攻击者上传webshell或利用漏洞的痕迹。
1. 检查访问日志中的可疑请求
使用grep筛选常见攻击特征,例如:
grep -E "(eval|base64|shell|cmd|upload)" /var/log/nginx/access.log重点关注POST请求到非常规路径(如/uploads/、/images/)且返回200的状态码。也可以统计访问频率异常的IP:
awk '{print }' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -202. 关联文件修改时间
找到可疑请求的时间点后,检查该时间前后被修改的文件:
find /var/www/html -type f -mtime -1 -ls这能快速缩小范围,定位被上传的webshell。
3. 检查错误日志
错误日志可能包含攻击者尝试失败的信息,如文件包含错误、权限拒绝等:
grep -i "failed" /var/log/nginx/error.log三、查找并清除webshell
webshell是攻击者留在服务器上的后门,必须彻底清除。
1. 使用find命令按时间筛选
结合入侵时间,查找最近修改的文件:
find /var/www/html -type f -mtime -7 -name "*.php" -exec ls -l {} \;2. 搜索webshell特征代码
常见webshell包含eval、assert、base64_decode等函数,使用grep批量扫描:
grep -r --include=*.php -E "(eval|assert|base64_decode|system|passthru|shell_exec)" /var/www/html注意:部分正常程序也可能使用这些函数,需结合文件路径和内容判断。
3. 检查隐藏文件和大文件
攻击者常将webshell命名为图片或隐藏文件,查找异常大或近期创建的文件:
find /var/www/html -type f -size +100k -mtime -304. 使用专业工具辅助
可下载开源工具如河马webshell查杀(注:此处不添加链接)进行扫描,但需从官方渠道获取。
5. 清除与验证
确认恶意文件后,将其移动到隔离目录而非直接删除,以便后续分析:
mkdir /tmp/quarantine && mv /path/to/shell.php /tmp/quarantine/然后访问网站,确认恶意跳转是否消失。
四、修复漏洞与恢复网站
清除webshell只是治标,修复漏洞才能防止再次入侵。
- 更新CMS和插件:确保使用最新版本,修复已知漏洞。
- 检查文件上传功能:限制上传类型,重命名上传文件,并将上传目录设置为不可执行。在nginx中增加配置:
location ~* /uploads/.*\.(php|php5)$ { deny all; }- 修改所有密码:包括数据库、FTP、SSH和后台管理员密码。
- 检查计划任务和启动项:攻击者可能留下定时任务:
crontab -l和ls -la /etc/cron*。 - 恢复网站文件:从备份中恢复被篡改的文件,或使用版本控制系统回滚。
五、加固与监控建议
恢复后需加强防护,避免重蹈覆辙。
- 部署WAF:使用AegisX等WAF拦截恶意请求,提供虚拟补丁防护。
- 设置文件完整性监控:使用工具如AIDE监控关键文件变化。
- 定期备份:确保备份离线存储,并测试恢复流程。
- 最小权限原则:Web目录权限设置为755,文件644,属主为运行用户。
六、检查清单
| 步骤 | 操作 | 命令/工具 |
|---|---|---|
| 1 | 隔离网站 | 修改nginx配置返回503 |
| 2 | 备份日志和文件 | cp, tar |
| 3 | 分析访问日志 | grep, awk |
| 4 | 查找webshell | find, grep |
| 5 | 清除恶意文件 | mv到隔离目录 |
| 6 | 修复漏洞 | 更新、配置修改 |
| 7 | 恢复文件 | 从备份还原 |
| 8 | 加固监控 | WAF、文件监控 |
行动建议:立即按照上述步骤排查,若技术能力有限,可寻求专业安全团队协助。平时做好备份和监控,才能临危不乱。
常见问题(FAQ)
网站被挂马了,第一步应该做什么?
立即隔离受感染的网站或服务器,防止恶意代码扩散或数据泄露。同时备份nginx访问日志和网站文件,为后续分析保留证据。不要急于删除文件,以免破坏现场。
如何通过nginx日志找到攻击入口?
重点分析访问日志中异常请求,如大量404、POST请求到非常规路径、包含可疑参数的URL。使用awk、grep等命令筛选高频IP和可疑User-Agent,结合时间点关联文件修改时间。
webshell通常藏在哪些目录?
常见于上传目录、缓存目录、图片目录及可写权限的文件夹。攻击者常将webshell伪装成图片或正常文件,需结合文件内容特征(如eval、base64_decode)进行扫描。
清除webshell后网站仍然有问题怎么办?
可能还存在其他后门或漏洞未修复。建议全面扫描系统文件,检查计划任务、启动项和数据库中的恶意代码,并修复导致入侵的漏洞(如文件上传漏洞、弱口令)。
如何预防网站再次被挂马?
定期更新CMS和插件,使用强密码,限制文件上传类型,部署WAF(如AegisX)拦截恶意请求,并设置文件完整性监控,及时发现异常改动。