有人告诉你:你的网站在你眼里一切正常,但在 Google、必应和所有手机访客眼里,它正偷偷加载一个陌生域名的脚本——你信吗?
我不信。直到我亲手把它从服务器里挖出来。
这是一次真实的排查实录:从”为什么我的首页死活不被 Google 收录”,一路挖到一个藏在 nginx 里、专门骗搜索引擎的 root 级注入马。它躲过了我所有常规检查——换主题、关插件、扫 WordPress,全都查不出来。如果你也有个站,这篇能帮你看清一种你可能从没设防过的攻击。
我站里的内容页都能被 Google 收录,唯独首页,死活不进索引。
我在 Google Search Console 用”网址检查”,看它抓到的首页 HTML——就在这里,我看到一行不属于我的东西:
<script src="https://www.aoqmx.xyz/bootstrap.js"></script>
aoqmx.xyz。我从没听过这个域名,也从没往首页加过任何外部脚本。
我立刻用无痕窗口打开首页、查看源代码——干净的,没有那行脚本。换个浏览器,还是干净的。
诡异就在这:同一个页面,我看是干净的,Google 看却是带毒的。
这不是普通挂马,是”看人下菜碟”——专业叫法 cloaking(伪装 / 斗篷):只在特定条件下才注入,对着你时藏得死死的。它的逻辑长这样——
按常规,挂马先查 WordPress:
.php 文件 —— 干净;wp-config、主题、插件 —— 干净;大多数人到这一步会懵:代码里明明没有,它从哪冒出来的?答案是:它根本不在 WordPress 层。
我上服务器,直接 grep "aoqmx"——什么都没搜到。可脚本明明在输出里。这只能说明一件事:这个域名在源码里,压根不是完整拼写的。
果然,真凶里它是这么写的(示意):
"htt".."ps://www.a".."oqmx.xy".."z/bootst".."rap.js"
把域名拆成一段段字符串、运行时才拼起来。你 grep 完整域名,永远搜不到。这是它躲过扫描的第一招。
最后我把范围缩到 nginx。宝塔的 nginx 主配置里有一句:
include /www/server/panel/vhost/nginx/*.conf;
它会加载这个目录下所有 .conf。而目录里,躺着一个我从没建过的文件:__.conf,属主 root,改动时间几周前。打开它,是两段 Lua:
header_filter_by_lua:把响应的 Content-Length 和 Content-Security-Policy 头删掉——为注入腾地方、顺便绕过 CSP 防护;body_filter_by_lua:在页面 body 里,按条件注入那段拼接域名的脚本。而”按条件”,就是它的斗篷:只对非 Windows、非 Macintosh 的 UA(搜索引擎、手机)下发,只对 200/404 的 text/html,还避开后台路径。安卓 → 注入 aoqmx.xyz 脚本;iOS → 换成另一个域名的 iframe。而用 Windows/Mac 的你我,永远看不到。
也正因为它这么藏,我前面每一步排查才会全部扑空——
这也解开了最初的谜——为什么首页死活不被收录。
搜索引擎爬到的,是一个被注入了陌生脚本、面向移动端的垃圾版本,跟真人看到的完全不是一个东西。而 cloaking 是搜索引擎明令禁止的作弊:一旦被识别,轻则不收录,重则降权。
换句话说:这匹马不只是在你站上偷挂广告、劫持流量,它还顺手把你的站在搜索引擎眼里搞臭了。而这一切,你在自己浏览器里,完全看不见。
__.conf 完整备份(万一要追溯/报案)。chattr +i 给文件加不可修改属性,攻击者想重新写入会直接失败。body_filter_by_lua/注入特征,立刻隔离 + reload。如果你也有个站,花五分钟自查——尤其别只看浏览器:
curl -A "Mozilla/5.0 (Linux; Android 10)" https://你的站/ | grep -iE "script src|iframe"
再用普通桌面 UA 请求一次,两者不一样 → 高度可疑。
include ... *.conf 目录里有没有你不认识的文件、有没有 lua/body_filter 字样。挂马最可怕的地方,从来不是它多高级,而是它专门被设计成让你看不见。你的站,可能此刻正两副面孔地活着,而你毫不知情。
如果你的网站也遇到:被挂马、突然不被收录、被爬虫刷崩,或者你隐约觉得不对劲却查不出来,可以找我聊。这类”藏在浏览器背后”的问题,我踩过,也挖出来过。