你的网站被挂马了?先别删文件,关端口比改密码还急

早上打开后台,首页变成赌博广告;客户微信问“你们网站怎么跳黄网?”;百度搜自家品牌,结果弹出“该网站可能存在风险”——这种事我见过太多次。不是玄学,是黑客真动手了。别慌,也别急着删文件,先按下面这几步做,能少踩80%的坑。

被挂马后,第一时间该做什么?

立即断网
不是关服务器,是掐断用户访问路径。虚拟主机?直接在控制面板暂停站点。云服务器?立刻进安全组,把80和443端口临时禁掉。
这一步不是“以防万一”,是实打实卡住黑客的手:他传不进新木马,用户也看不到污染页面。

有个电商朋友,凌晨发现首页变菠菜站,第一反应是登录后台删index.php。结果刚删完,5分钟不到又冒出来——后门早埋进wp-includes/functions.php里了。折腾三天,百度快照全标红。后来我让他先断网,再用上周的干净备份恢复,当天下午就上线了。

备份当前状态
断网后,马上把整个网站目录(含所有子文件夹)和数据库导出打包。一个字都别删,连可疑的.php.swpcache_old/都留着。这些是破案线索。
文件名带上日期和“原始”标记,比如site_raw_20240115.tar.gz

通知相关人员
公司网站?马上拉个钉钉群,@老板+客服主管,说清楚“已隔离,正在排查,推广暂停”。
帮客户维护?发一封简短邮件:“XX网站检测到异常,已临时下线,预计X小时内恢复”,别写“技术故障”这种词,客户听不懂。

如何快速定位挂马入口?

挂马从来不是随机事件。黑客只走最省力的路——你漏掉的那条缝,就是他的门。

查管理员账号
翻后台登录日志,重点看凌晨2–5点、IP地址明显异常(比如连续三次从巴西、越南、哈萨克斯坦登录)。
密码还是admin123123456、公司名+年份?基本可以确定是暴力破解进来的。马上改密码,顺手在后台启用双因素认证(WordPress插件叫Two Factor Authentication)。

找最近改过的文件
Linux服务器上跑这句:

find . -name "*.php" -mtime -7 -ls

Windows主机?进FTP软件,按“修改时间”排序,盯紧index.phpwp-config.php.htaccess、主题目录下的functions.php
我修过一个站,黑客在wp-content/themes/twentytwenty/functions.php末尾塞了半屏base64代码,表面像注释,实际是远程执行后门。

翻数据库内容
进phpMyAdmin,打开wp_posts表,按post_date倒序,看最近几条文章有没有标题正常但正文带<iframe src=<script src=的。
如果开了评论功能,顺手查wp_comments表,黑客最爱在垃圾评论里藏JS跳转代码。

扫可疑代码特征
进网站根目录,运行:

grep -r "eval(" . --include="*.php"
grep -r "base64_decode" . --include="*.php"
grep -r "shell_exec" . --include="*.php"

只要扫出结果,对应文件基本可以判死刑——别手软,先挪到/tmp/存着,别删。

清理挂马时,最容易踩的3个坑

坑一:删了文件就以为完事
看到shell.php就删?太天真。黑客更喜欢把<?php @eval($_POST['x']);?>这种代码,塞进wp-admin/includes/class-wp-upgrader.php这种系统文件里,肉眼根本没法识别。
正确做法:用Wordfence(WordPress)或MalCare(通用CMS)全盘扫描,让工具揪出隐藏后门。

坑二:改了后台密码,忘了数据库密码
改完管理员密码,转身就去喝咖啡?黑客可能早拿到你的wp-config.php,里面明文写着数据库用户名和密码。
必须同步改三处:后台管理员密码、数据库密码(改完记得更新wp-config.php)、FTP/SFTP密码。密码长度一律20位起,大小写字母+数字+符号。

坑三:拿“看起来干净”的备份来恢复
备份是三天前的?那三天里黑客可能已经埋好定时后门。我修过一个站,站长恢复了“上周一”的备份,结果第二天凌晨又挂马——那个备份本身就被植入了wp-includes/load.php里的隐蔽eval。
对策:翻出你最早的一份备份(比如上个月的),或者干脆重装CMS,只导入干净的内容数据(wp_posts表里手动清空恶意文章)。

彻底清理后,如何做一次“深度体检”?

上线前多花1小时检查,能省下下次被黑后三天的抢救时间。

扫黑名单状态
打开 Sucuri SiteCheck(免费),输你的域名,看是否还在Google/Netcraft黑名单里。
再用服务器自带的ClamAV杀毒:

sudo clamscan -r /var/www/html/ --exclude="cache\|uploads"

盯死.htaccess和权限
用文本编辑器打开.htaccess,搜索RewriteRule,看有没有指向陌生域名或IP的跳转规则。
再检查目录权限:wp-admin/wp-includes/必须是755,wp-config.php必须是644,任何目录都不该有777权限。

把能升的全升一遍
CMS核心、激活的主题、所有插件——全部点“更新到最新版”。
特别注意那些两年没更新的主题,比如Avada旧版、Divi老模板,漏洞早被公开了。宁可换主题,别留后患。

翻Apache/Nginx访问日志
Linux上跑:

sudo tail -100 /var/log/apache2/access.log | grep "POST.*wp-admin"

如果看到同一IP在10分钟内狂刷/wp-admin/admin-ajax.php,基本就是暴力破解或爆破插件接口。记下IP,加进防火墙黑名单。

如何防止下次再被挂马?

防黑不是装一堆插件,是砍掉黑客最顺手的那几条路。

强制HTTPS,现在就做
HTTP明文传输,密码、Cookie全裸奔。用宝塔面板或cPanel一键申请Let’s Encrypt证书,再勾选“强制HTTPS”。
不会操作?搜“宝塔 强制https”,5分钟搞定。

后台禁用主题/插件编辑器
打开wp-config.php,在/* That's all, stop editing! */上面加一行:

define('DISALLOW_FILE_EDIT', true);

以后黑客就算拿到后台权限,也改不了PHP文件。

登录失败3次就锁IP
装插件Limit Login Attempts Reloaded,设置“5分钟内最多尝试3次”,超限自动封IP 15分钟。暴力破解当场失效。

备份必须异地、自动、分版本
用宝塔的“计划任务”每天凌晨2点自动备份,并上传到阿里云OSS或腾讯云COS。
别把备份文件放在同服务器的/backup/目录里——黑客删你网站时,顺手就把备份一起清了。

关掉不用的功能
进WordPress后台 → 设置 → 写作,把“远程发布(XML-RPC)”关掉;
进设置 → 讨论,关闭“允许他人在文章下发表评论”(除非你真需要);
用户注册?如果不是会员制网站,直接关。

今天就能执行的1个具体步骤

现在就打开你的网站后台,进“用户→所有用户”,点开每个管理员账号,把密码改成20位随机密码
密码生成器就用浏览器自带的(Chrome右键密码框→“生成密码”),或者用Bitwarden/1Password的生成器。
改完一个,立刻登出重新登录试试——别等明天,黑客不挑工作日。
这一步做完,你网站的安全水位,已经比90%同行高了一截。