网站被挂马,很多站长第一次遇到时第一反应是“先把首页恢复”,结果文件改回去第二天又被改,搜索引擎的风险提示还一直挂着。挂马从来不是一个文件的问题,而是服务器上已经留下了后门:攻击者通过插件漏洞、弱口令、过期程序拿到的权限并没有被收回。这篇按“止损、定位、查杀、加固、恢复”的顺序,把一次完整的木马清理流程讲清楚,命令可以直接照着执行。
一、先止损:保留现场,别急着删文件
发现网站被挂马后,先做三件事:把站点切换到维护页或暂停外网访问,避免继续被利用;给整站和数据库做一份快照或压缩备份,保留原始证据,后面排查日志和对比文件都要用到;立刻修改 SSH、面板、数据库、FTP 和后台的密码,并更新所有管理员账号的密钥。
如果服务器商提供快照功能,先打一个快照再操作。清理过程中误删文件、改坏配置都很常见,有快照才能回退。
另外,把网站日志先拷贝出来。Nginx 的 access.log、PHP 的错误日志、面板的操作日志,都是判断入侵入口的关键。
二、定位:先找异常进程和网络连接
木马最常见的行为是往外连 C2、跑挖矿、或者常驻一个陌生进程。登录服务器后先看 CPU 和网络:
ps aux --sort=-%cpu | head -20 ss -antp | grep ESTAB
看有没有陌生路径下的进程、异常的外连 IP、监听在奇怪端口的服务。再看定时任务,很多后门靠 cron 定时拉取:
crontab -l ls -la /etc/cron.* /var/spool/cron
接着找最近被修改过的文件。挂马时间通常在几天内,按修改时间排序很有效:
find /www/wwwroot -type f -mtime -7 -print | head -100
重点看 uploads、cache、runtime 这类本该只有图片和缓存的目录里,是否出现了 php、phtml、htaccess 文件。
三、查杀:按特征找后门,而不是只删首页
常见的 PHP 后门有明显的特征:eval、assert、base64_decode、gzinflate、str_rot13 加上超长混淆字符串,或者一个正常插件文件里突然多出一段看不懂的代码。可以用 grep 快速筛一遍:
grep -rn --include=*.php -E "eval\(|assert\(|base64_decode\(|gzinflate\(" /www/wwwroot
如果服务器装了 ClamAV,可以跑一次全量扫描:
apt install -y clamav && freshclam clamscan -r -i /www/wwwroot
扫描结果只能作为参考,ClamAV 对 PHP 一句话木马并不敏感,最终还是人工看代码。重点检查这几个位置:网站根目录的 index.php 是否被插入跳转代码、.user.ini 是否被改写、wp-content/uploads 下是否有可执行的 php、主题的 functions.php 是否被加料。
WordPress 站点可以用官方校验工具对比核心文件:
wp core verify-checksums --allow-root
校验不通过的文件,直接用同版本官方包覆盖,不要试图在被感染的文件上修补。
四、清理:删掉后门,重装可疑组件
确认后门文件后,先记录路径和内容再删除,方便后续判断入侵方式。然后做四件事:用官方包覆盖核心程序、重新安装所有插件和主题(不要只覆盖,直接删掉重装)、重置数据库配置里的密钥盐、检查数据库中是否有被插入的恶意脚本和陌生管理员账号。
数据库里重点看 wp_options 的 siteurl、home,wp_posts 里的 iframe、script 标签,以及 wp_users 中最近新增的账号。很多挂马会在文章内容里批量插入暗链,按 post_content 搜索关键词更彻底。
如果有多个站点跑在同一台服务器上,不要只清理出问题的那一个。同一台机器上的其他站点很可能已经被同样的漏洞拿下。
五、加固:把入口堵上,避免二次入侵
清理完成后必须补漏洞,否则几天内会再次被挂马。按优先级做这几项:
- 升级程序:核心、插件、主题、PHP 版本全部升到当前稳定版,停用不再维护的插件。
- 收紧权限:目录 755、文件 644,数据库配置文件设为 600,上传目录禁止执行 PHP。
- 禁用危险函数:在 php.ini 里设置 disable_functions,至少禁掉 exec、shell_exec、system、passthru、proc_open、popen。
- 面板与 SSH 加固:改默认端口、只允许密钥登录、开启 Fail2Ban,面板开启二次验证。
- 上防护:宝塔的网站防篡改、Nginx 层 WAF 或者 Cloudflare 的免费防护,都能挡住大部分自动化扫描。
- 做好备份:数据库和文件每天自动备份到异地,保留至少 7 天。备份是最后一道防线。
上传目录禁止执行 PHP 的 Nginx 配置可以直接加在站点配置里:
location ~* /(uploads|wp-content/uploads)/.*\.(php|phtml|php5)$ { deny all; }
六、恢复:处理搜索引擎的风险提示
站点清理干净、确认没有残留后,再恢复对外访问。如果百度或 Google 已经给出风险提示,需要在站长平台提交安全检测申请,等待重新抓取。同时检查搜索结果里是否还有被注入的赌博、色情标题,发现后提交死链或快照更新。
恢复访问后的几天要盯着日志和文件修改时间,确认没有新的后门被写入。有条件的话装一个文件完整性监控,核心目录一有变动就告警。
七、最后总结
挂马处理的核心不是把首页改回来,而是找到入口、清掉后门、补上漏洞。顺序反了,就会出现删了又挂、挂了又删的死循环。日常把程序升级、权限、备份和防护这四件事做好,绝大多数批量扫描和脚本小子都进不来。