直接查 wp_options 表可快速定位被篡改字段:siteurl 和 home 控制根地址,thememods* 存隐蔽 js 注入,blogdescription 和 widget_text 常塞黑链,wp_posts id=1 的 post_content 也可能被植入恶意代码。
直接查 wp_options 表里被篡改的字段,比翻文件快得多——首页被黑、后台菜单消失、莫名跳转,90% 都是这里动了手脚。
查 siteurl 和 home 是否被改成恶意域名
这两项控制 WordPress 的根地址,黑客常把它改成带 JS 加载外链的 URL,比如 http://102.61.123.45/bot.js。在 phpMyAdmin 里进 wp_options 表 → 点「搜索」→ option_name 列填 siteurl 或 home:
- 如果值不是你自己的域名,尤其是含 IP、陌生二级域或
document.write字样,基本就是它 - 别只看开头——有些会伪装成正常域名,末尾拼接
?a=1再加载远程脚本 - 改之前先导出该行:选中 →「导出」→ 格式选 SQL → 勾「仅所选行」
重点扫 theme_mods_* 开头的记录
这是最隐蔽的注入点,theme_mods_twentytwentyfour 这类字段存的是主题自定义设置,但黑客会把混淆 JS 塞进 option_value 里,和正常 JSON 混在一起:
- 在
wp_options表搜索option_name LIKE 'theme_mods_%' - 点开每条,看
option_value是不是一长串 base64(含base64_decode、eval(、document.write) - 复制那段字符串,在本地 PHP 执行
echo base64_decode('xxx');确认内容——是 JSON 就删末尾 JS;是纯跳转脚本就整段清空 - 清空前务必备份:导出整行 SQL,或用
INSERT INTO wp_options_backup SELECT * FROM wp_options WHERE option_name = 'theme_mods_xxx';
别漏掉 blogdescription 和 widget_text
前者通过 bloginfo('description') 输出到 header,后者是文本小工具内容,都常被塞黑链:
-
blogdescription的值如果含<script></script>、<iframe src="</code"> 或乱码 URL,直接删掉异常部分</iframe> -
widget_text可能有多个,搜索option_name = 'widget_text',逐个点开看option_value里有没有onload=、eval(、可疑域名 - 注意:有些
widget_text是序列化数组,不能整段删,得解码后手动剔除恶意片段再重序列化
顺手检查 wp_posts ID=1 的页面内容
如果首页设为「静态页面」,黑客可能把恶意代码直接塞进 wp_posts 表里 ID=1 的 post_content 字段,改 wp_options 完全没用:
- 执行 SQL:
SELECT ID, post_title, post_status, post_content FROM wp_posts WHERE ID = 1 AND post_type = 'page'; - 如果返回结果且
post_status = 'publish',重点检查post_content - 搜
<script></script>、<iframe>、<code>eval(、base64—— 这些不是主题自带的,一律删 - 改完立刻清浏览器缓存,用隐身窗口验证,避免旧 JS 缓存干扰判断
真正难的不是找到哪几行,而是分辨哪些字符是主题设置、哪些是硬塞进去的恶意 payload——base64 解码那一步跳不过,也别信“看起来不像就没事”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











