网站被挂马怎么办?木马查杀、后门清理与安全加固一次讲清


网站被挂马,很多站长第一次遇到时第一反应是“先把首页恢复”,结果文件改回去第二天又被改,搜索引擎的风险提示还一直挂着。挂马从来不是一个文件的问题,而是服务器上已经留下了后门:攻击者通过插件漏洞、弱口令、过期程序拿到的权限并没有被收回。这篇按“止损、定位、查杀、加固、恢复”的顺序,把一次完整的木马清理流程讲清楚,命令可以直接照着执行。

一、先止损:保留现场,别急着删文件

发现网站被挂马后,先做三件事:把站点切换到维护页或暂停外网访问,避免继续被利用;给整站和数据库做一份快照或压缩备份,保留原始证据,后面排查日志和对比文件都要用到;立刻修改 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 已经给出风险提示,需要在站长平台提交安全检测申请,等待重新抓取。同时检查搜索结果里是否还有被注入的赌博、色情标题,发现后提交死链或快照更新。

恢复访问后的几天要盯着日志和文件修改时间,确认没有新的后门被写入。有条件的话装一个文件完整性监控,核心目录一有变动就告警。

七、最后总结

挂马处理的核心不是把首页改回来,而是找到入口、清掉后门、补上漏洞。顺序反了,就会出现删了又挂、挂了又删的死循环。日常把程序升级、权限、备份和防护这四件事做好,绝大多数批量扫描和脚本小子都进不来。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

Nginx 502 Bad Gateway 排查实战:PHP-FPM、超时与上游配置一次讲清

测试标题

评 论