本文约 3,495 字,预计阅读 9 分钟。文中命令与配置均经过实测,可直接参考执行。
引言
辛苦运营的网站,突然有访客反馈说点进去自动跳到了博彩、赌博页面;你自己用手机、电脑访问首页却一切正常,只有从百度、Google 搜索结果点进来才会被劫持。这种「你看着正常、别人看着被黑」的现象,是 WordPress 被挂马最典型的表现。攻击者通常不会把整站替换掉,而是偷偷在前台文件、数据库或主题里塞进一小段代码,它识别搜索引擎爬虫和陌生访客的来源,命中条件就 302 跳转到博彩站点,你在本地反复刷新反而看不到。很多站长第一反应是改后台密码,结果密码改了跳转照旧,因为后门文件还在,攻击者随时能重新进来。本文从入侵路径讲到电脑前的逐步命令行排查,把恶意代码和后门一次清干净,让网站恢复正常。
故障原因分析
- 主题与插件文件被注入 PHP 后门。攻击者拿到写入权限后,会把一小段加密代码塞进
functions.php、header.php或某个不起眼的插件文件里,靠eval、base64_decode、gzinflate动态执行,正常扫描很难一眼看出来。
- 数据库被写入恶意内容。
wp_options表的siteurl、home极端情况下会被改,但更常见的是往文章正文、wp_posts、wp_options的某个自定义选项里塞<script>或<iframe>,页面渲染时就带上跳转代码。
.htaccess被改写做条件跳转。网站根目录的.htaccess里被追加了RewriteCond规则,专门判断HTTP_REFERER来自百度或 Google 时再跳转,这就是「只有搜索流量被劫持」的元凶。
- 上传目录藏着木马。
wp-content/uploads本该只存图片,攻击者把.php伪装成图片后缀放进去,再通过后门文件远程调用,实现持续控制。
- 弱口令或旧版插件漏洞是入口。管理员密码太简单、主题插件长期不更新,攻击者通过暴力破解或已知漏洞拿到权限后,留下 WebShell 供反复进入。
分步解决方案
方法一:先隔离、先备份,别急着删
第一步不是删代码,而是防止攻击者在你清理时二次进入。立即登录服务器改掉面板密码、SSH 密码,改掉 WordPress 管理员密码,同时把网站整体打包备份一份,留作对比和追查。备份命令:
cd /www/wwwroot
tar -czf site_backup_$(date +%F).tar.gz yoursite.com
方法二:找出最近被改动的文件
挂马文件通常有较新的修改时间,先按时间筛出可疑目标:
cd /www/wwwroot/yoursite.com
# 列出最近 10 天被修改过的 php 文件
find . -type f -name "*.php" -mtime -10 -ls
# 按修改时间排序,最新的一批排在最前
find . -type f -name "*.php" -printf '%TY-%Tm-%Td %p\n' | sort -r | head -50
正常情况下,除了你刚更新的插件和主题,其他 php 文件的修改时间应该停留在很久以前。突然冒出来的新文件就是高度可疑对象。
方法三:用特征字符串定位后门
后门常见的特征函数是 eval、assert、base64_decode、gzinflate、str_rot13、create_function、shell_exec、passthru。全局搜一遍:
grep -rn --include="*.php" -E "eval\(|base64_decode\(|gzinflate\(|str_rot13\(|create_function\(|shell_exec\(|passthru\(" . | grep -v "wp-includes" | head -50
同时搜跳转关键字:
grep -rn --include="*.php" -E "header\(.*Location|window\.location|<script|<iframe" . | head -50
只要出现「一长串乱码 + eval」的组合,基本就是后门,直接记下路径。
方法四:检查 .htaccess 有没有被偷偷改写
打开网站根目录的 .htaccess,重点看有没有你不认识的 RewriteCond %{HTTP_REFERER} 规则:
# 被挂马后常见的一段:来自搜索引擎就跳转
RewriteCond %{HTTP_REFERER} (baidu|google|sogou) [NC]
RewriteRule ^(.*)$ https://xxx-bocai.com/ [R=302,L]
把这类规则整段删除,只保留 WordPress 自带的标准规则(以 # BEGIN WordPress 开头、# END WordPress 结尾那一段)。
方法五:清理数据库里的恶意注入
用 phpMyAdmin 或命令行查一遍敏感表:
-- 查找文章里被塞入的 script 或 iframe
SELECT ID, post_title FROM wp_posts WHERE post_content LIKE '%<script%' OR post_content LIKE '%<iframe%';
-- 查找 options 表里的异常脚本
SELECT option_name FROM wp_options WHERE option_value LIKE '%<script%' OR option_value LIKE '%eval(%';
-- 检查站点地址有没有被篡改
SELECT option_name, option_value FROM wp_options WHERE option_name IN ('siteurl','home');
如果表前缀不是 wp_,请替换成 wp-config.php 里 $table_prefix 对应的实际前缀。找到被污染的记录后手工删除注入片段,或从备份还原该条内容。
方法六:断掉攻击者的登录态,重换密钥
恶意代码清理干净后,一定要让攻击者留下的所有会话失效。修改 wp-config.php 里的八组安全密钥,把旧的随机字符串全部替换掉(可用 WordPress 官方密钥生成器获得新值);随后在后台「用户」里把所有管理员密码重置,并删除来路不明的账号。密钥一换,此前被盗用的登录 Cookie 立即作废。
方法七:用安全插件做一次全盘扫描并加固
安装 Wordfence 或 Sucuri Security,运行一次完整扫描,让插件按特征库再兜底找一遍漏网后门文件。扫描通过后,开启防火墙规则。之后把 WordPress 核心、主题、插件全部升级到最新版本,堵住被利用的旧漏洞。最后登录百度搜索资源平台和 Google Search Console 提交死链与安全复审,让跳转标记尽快消失。
常见踩坑点
- 只删可见的跳转代码,不清理后门文件。攻击者留下的 WebShell 还在,几天后照样重新挂马,必须把可疑 php 文件一并处理。
- 不备份就直接删。误删了正常文件导致白屏,又没法回溯,所以动手前打包备份是底线。
- 只改后台密码,不换安全密钥。旧 Cookie 没失效,攻击者可能仍处于登录状态,换密钥才能真正踢人。
- 用错误的方式恢复
.htaccess。很多站长把整个文件删掉,结果是伪静态失效、内页全 404,正确做法是只删被追加的恶意规则段。
- 忽略
uploads目录。图片马藏在里面很隐蔽,要按后缀排查可疑的 php、phtml、php5 文件并删除。
- 清理完不升级版本。漏洞补丁没打,等于开着门清理,很快会被再次入侵。
总结
WordPress 挂马跳转博彩页面,本质是攻击者在文件、数据库或 .htaccess 里埋了条件跳转与后门。处理顺序是「先用 tar 备份并改密码隔离,再按修改时间和特征函数查找后门,清理 .htaccess 与数据库注入,最后更换 wp-config.php 安全密钥、用 Wordfence 兜底扫描并升级所有版本」。整个过程最忌讳只删表面跳转代码就以为万事大吉,留下后门等于白忙。把这套 WordPress 挂马清理流程走完,再向搜索引擎提交复审,网站通常几天内就能恢复正常收录与访问。
