你刚打开网站,首页弹出赌博广告;用户一点击就跳转到陌生页面;浏览器地址栏闪一下就变了——别揉眼睛,这不是幻觉,是挂马了。

现在不是查原因的时候。先稳住,按下面六步走,能抢回大部分损失。

第一步:怎么判断网站真的被挂马了?

先确认是不是真被黑,不是误报。
我见过客户把联盟广告的弹窗当成挂马,折腾两天才发现是合作方新上的推广代码。

盯紧三个信号:

  • 用户直接告诉你:“点开你们网站就被拦了”“弹窗关不掉”;
  • Google Search Console 或 百度资源平台发了安全警告,标题带“恶意内容”或“危险软件”;
  • 你自己用无痕模式打开首页,看有没有跳转、有没有底部突然多出一串看不懂的 script 标签。

一个真实情况:做跨境B2B的客户,流量断崖下跌,以为是谷歌算法调整。翻了一个月日志,才在 /js/ 目录里发现一个名字像 common.min.js 的文件——其实是加密后门,每天固定时间加载外部链接。而GSC的警告,他压根没点进去看过。
所以第一件事:现在就打开 Google Search Console 和 百度资源平台,看有没有未处理的安全提醒;再顺手翻一遍服务器最近24小时的访问日志,找异常IP和高频POST请求。

第二步:用什么工具快速扫描出恶意文件?

别手动翻源码,太慢也容易漏。用现成工具,快准狠。

推荐三类:

  • 在线扫描:VirusTotal(支持URL和文件上传),它调用几十个引擎交叉比对;
  • 服务器端扫描:Linux服务器上装 ClamAV,一行命令扫全站;
  • 浏览器视角检查:用 Chrome 自带的“开发者工具 → Network”,刷新页面,看有没有加载陌生域名下的JS、iframe或重定向响应。

操作很简单:
登录服务器,执行 clamscan -r /var/www/html(路径按你实际改),把输出里标红的文件路径记下来。
动手前务必备份整个网站目录——不是“建议”,是必须。

有个做独立站的客户,用 AI-Bolit 扫出200多个异常文件,大多藏在 /wp-content/uploads//wp-admin/ 下。他还发现 .htaccess 被偷偷加了重写规则,所有访问都悄悄转向恶意域名。
所以扫描时,重点盯这些地方:.htaccessnginx.confweb.config——它们不是配文件,是挂马高发区。

第三步:怎么手动清理被篡改的文件?

扫描出可疑文件只是开始。删错一个,可能触发后门自动重建;只删表面,深层定时任务还在跑。

核心原则:别信“看起来干净”,要对比“本来什么样”。
如果你有Git,git status + git diff 就能立刻看出哪些PHP、JS文件被改过;
如果没有Git,至少拿最近一次备份,用 diff -r 备份目录 当前目录 对比关键路径(比如 /wp-includes//wp-content/themes/)。

最坑的一次:有人删了被注入的 admin-ajax.php,结果第二天又出现——因为攻击者早把恶意代码写进了数据库的 wp_options 表,每次页面加载都动态拼接。

清理动作要闭环:

  1. 先查定时任务:crontab -l,删掉不认识的条目;
  2. 再删可疑文件,但别动CMS核心文件(如WordPress的 wp-load.php);
  3. 立刻重置所有密码:数据库、FTP、主机控制面板、后台管理员账号——一个都不能漏;
  4. 最后更新:CMS主程序、所有插件、主题,全部升到最新版。旧版本漏洞,就是挂马的正门钥匙。

第四步:恢复后怎么验证网站彻底干净了?

上线前,必须自己当一回黑客,从用户角度摸一遍。

做三件事:

  • 用 Sucuri SiteCheck 扫描首页,它会模拟搜索引擎爬虫,检查页面源码、HTTP头、重定向链;
  • 手动点开每个功能页:登录页、搜索框、购物车、支付成功页——看有没有跳转、弹窗、加载非本站域名的JS;
  • 登录服务器,查日志:grep "POST.*admin-ajax\|xmlrpc" /var/log/nginx/access.log,看看还有没有异常调用。

教训很实在:一个本地服务类网站,清理完上线,一周后又中招。排查发现,他只清了文件,没查数据库。攻击者把恶意脚本存在 wp_options 表的 option_value 字段里,每次 wp_head() 都自动输出。
所以一定要进数据库执行:

SELECT * FROM wp_options WHERE option_value LIKE '%<script%' OR option_value LIKE '%eval(%' OR option_value LIKE '%base64_decode%';

删掉这些记录,或者用 UPDATE 清空字段值。
验证是否干净?就一条标准:你用手机、电脑、不同浏览器,打开所有页面,零弹窗、零跳转、零加载陌生域名资源。

第五步:如何跟搜索引擎申请恢复被标记的网站?

网站干净了,但Google和百度的“危险网站”标签还挂着,流量照样归零。

必须主动申诉:

  • Google:进 Search Console → 左侧菜单“安全问题和人工处置” → 点“请求审核”;
  • 百度:进资源平台 → “站点管理” → “站点申诉”,选“恶意软件”类型提交。

申诉信别写“已修复”,写实打实的动作:

“已用ClamAV全站扫描并删除17个后门文件;重置全部管理员及数据库密码;更新WordPress至6.5.3,禁用3个高危插件;检查并清理wp_options表中3处恶意注入;.htaccess重写规则已还原。”

额外加分项:在网站根目录放一个 security.txt 文件,内容就两行:

Contact: security@yourdomain.com  
Expires: 2025-12-31

不用复杂,让搜索引擎知道你有专人对接安全问题。

有个客户前两次申诉被拒,第三次附上了ClamAV扫描截图+修改过的 .htaccess 前后对比文本,当天通过。
提交后等3–7天,期间千万别改网站结构或上线新功能——任何变动都可能触发重新审核。

第六步:怎么预防下次再被挂马?

处理完这次,才是防患于未然的起点。

三条铁律:

  • 每周自动扫描一次:用ClamAV写个简单脚本,配合 cron 定时跑,结果邮件发给你;
  • 上传目录禁止执行:比如Nginx里给 /wp-content/uploads/ 加上 location ~ \.php$ { deny all; }
  • 日志实时告警:用服务器自带的 logwatchfail2ban,检测到高频404、500或异常POST,立刻钉钉/微信推给你。

还有一个90%人忽略的点:所有后台登录必须开双因素(2FA)。很多挂马不是靠技术漏洞,是靠“admin / 123456”这种密码暴力撞开的。
用Authy或Google Authenticator,比短信验证码更稳。
另外,定期检查你连着的第三方服务:CDN后台、邮件API密钥、支付网关回调地址——它们一旦失守,就是你的后门。

最后,备份不是“有就行”,是“随时能换”。
每天凌晨自动备份一次,保留最近7天完整包,压缩加密存到另一台服务器或对象存储(比如阿里云OSS、腾讯云COS)。被黑后,10分钟就能切回干净版本。

今天就能做的1个操作

现在就打开你的终端(或宝塔/AMH面板的SSH),执行这行命令:

tail -n 1000 /var/log/nginx/access.log | grep -E "(eval|base64_decode|wp-load\.php.*POST)"

如果有结果出来,说明极大概率已被挂马——别犹豫,按第一步立刻行动。
没结果?很好,但明天同一时间,再跑一次。安全不是“一次搞定”,是“天天盯住”。