网站暗链怎么检测和清除?我的网站被偷偷挂了两百多条暗链之后

2024 年 11 月,我的百度自然流量在一周内掉了 62%。

没有告警,没有宕机,网站打开速度正常,文章也照常更新。就是流量像被人拧开了个阀门,哗哗往下掉。

我先查了收录,首页和几篇主力文章都还在。又翻了下核心词的排名,也没怎么掉。当时我一脸问号——各项指标看着都正常,流量到底跑哪去了?

后来是一个做安全的朋友远程看我站点,随口问了一句:“你这网站底部……什么时候加了这么多乱七八糟的链接?”

我打开首页源代码,往下拉,拉到最底下。一堆我从来没见过的关键词,密密麻麻,全是指向外面网站的链接,字小得几乎看不见,颜色跟背景差不多一个色。

那是暗链。 有人在我完全不知情的情况下,往我的网站里塞了两百多条这种隐藏链接。

这篇文章,我把这次从“发现”到“清理干净”的整个过程,连同后来总结出来的检测方法和清除步骤,完整写下来。如果你也遇到过流量莫名下滑,建议对着本文自查一遍。


先搞清楚:暗链到底是什么

暗链,顾名思义,就是“看不见的链接”。

攻击者通过某种方式,把一大堆外站链接塞进你的网页里,再用 CSS 把这些链接藏起来。藏的手法五花八门:

  • 字号设成 0,肉眼看是空的,搜索引擎照样读得到
  • 颜色设成和背景一模一样,白底白字,你根本不会注意
  • 用 position: absolute 把链接挪到屏幕外的空白区域
  • 直接上 display:none,元素整个不显示

为什么要挂?说白了就是借你的权重,给别人抬排名。

黑帽 SEO 手里有一批垃圾站,想让它们被收录、有排名,最快的路子就是找一批“被搜索引擎信任”的站点,把链接挂上去。百度蜘蛛爬到你的站,顺着这些链接爬过去,权重就分给了那些垃圾站。

而你的站,就是那个被薅羊毛的倒霉蛋。

危害也不只是掉流量。 我那次掉了六成,回头看还算轻的。更麻烦的情况是——如果挂上去的链接指向不良内容,你的站可能被直接判成“低质”甚至“作弊”,整站降权,几个月都缓不过来。这个代价,比少来几百个 IP 严重多了。


暗链一般是从哪钻进来的

这里得说个扎心的事实:能挂上暗链,其实说明你的站已经被入侵了,至少某个入口已经失守。

那次我排查下来,可疑的方向有这么几个:

被入侵的 CMS 或插件。 最典型的路径。攻击者利用老插件、老主题的漏洞,拿到后台或者文件写入权限,然后往主题文件里批量插入链接。我那次的暗链,主要就藏在主题的 footer.php 和几个被注入的字段里。

服务器层面的后门。 有些木马会常驻在服务器里,攻击者随时能通过它往网站文件里写东西。我在网站被挂马清理那篇里讲过怎么找后门文件,暗链和挂马往往是结伴来的。

第三方脚本被动过手脚。 页面里引用的某个外部 JS,某天被人改了,加载时顺手往页面注入链接。这种最阴,因为你自己服务器上的文件翻烂了都干干净净。

弱密码被人直接登了进来。 后台密码太简单,被撞库或爆破进去了,然后装个来路不明的插件就开始挂。相关的坑我在密码安全那篇里踩过一次。


检测:我用了这几招,把暗链全揪了出来

发现暗链之后,怎么“系统性地”找全才是关键。只看到首页底部那几条,不代表只有那几条。我那两百多条,散落在十几个文件里,还有几条藏在数据库。

第一招,site 指令看收录。

在百度里搜 site:你的域名,重点看收录页面的标题里,有没有出现跟你网站八竿子打不着的词。黑帽 SEO 很爱干一件事——给每个页面注入不同的关键词,好让页面能被更多奇怪的词搜到。要是 site 出来的标题里冒出你没写过的词,就得警惕了。

第二招,直接看页面源代码。

别只看浏览器里显示的样子。右键“查看网页源代码”(或者按 Ctrl+U),然后搜这几样:

  • 有没有 <a> 标签指向你不认识的域名
  • 有没有 display:none、font-size:0、跟背景同色这类可疑样式
  • 页面里有没有大段你压根没写过的关键词

我那次就是靠搜 display:none 和 font-size,一步步定位到插入点的。

第三招,命令行批量扫文件。

站点大起来,手动翻文件根本翻不完。我后来用命令,在所有 PHP、JS、HTML 文件里搜可疑特征:

grep -rn "display:none" /www/wwwroot/你的站点/ --include="*.php" --include="*.js" --include="*.html"
grep -rn "font-size:0" /www/wwwroot/你的站点/ --include="*.php" --include="*.js"

再把全站外链统计出来,看看有没有一批来自同一个陌生域名:

grep -rhoE "https?://[a-zA-Z0-9./-]+" /www/wwwroot/你的站点/ | sort | uniq -c | sort -rn | head -30

那次跑完,陌生域名全浮上来了——其中一个我听都没听过的域名,出现了两百多次。基本可以实锤了。

第四招,查数据库。 有些暗链不写进文件,而是塞进数据库字段里,比如文章内容、评论、主题设置。我那次就在一个主题设置字段里,翻出来一段隐藏链接。


清除暗链:先堵入口,再清现场

找到只是第一步。清不干净,过几天它又长出来。顺序很重要,千万别搞反。

先断入口。 别急着删链接。后门还在的话,你删了他再挂。所以先把可疑的插件、主题停掉,把密码全换一遍——后台、数据库、服务器,一个都别落,把服务器里的后门文件一起清掉。完整的排查步骤我在网站被黑自救那篇里写过,照着走就行。

再备份。 动手清理之前一定先备份,删错了还有得回。备份这件事的重要性我不啰嗦了,这篇讲得很透。

然后清文件和数据库。 把注入的代码删掉。如果文件已经被改得面目全非,最省事的办法是拿同版本的干净文件覆盖回去——主题、核心文件都能重新下载,比一行行抠快得多。数据库里的恶意内容,手动删或者用备份回滚。

最后善后。 清理完,去百度搜索资源平台提交一下,让百度重新抓取。有安全相关的反馈提示,按它说的处理。


清完之后,我补的长期防护

被人挂过一次之后我才明白,防暗链的根子,其实是防入侵。 站进不来人,暗链自然挂不上。

我把下面这几件事做了,之后一年多再没中过招:

插件、主题、核心,全部保持最新。有更新就点,尤其是打着“安全修复”那几个字的,别拖。弃坑一年以上的插件,能换就换。

后台加了登录失败锁定,密码换成了一长串随机字符,再配上两步验证。想暴力破解我这后台,成本高到他不如换一家。

服务器上开了文件完整性监控。核心文件一旦被改动,我这边会收到提醒。这一条特别管用——暗链要写文件,就一定会改动文件,先一步就会暴露。

还有,静态资源尽量走 CDN。看着跟暗链没关系,实际上网站真实 IP 被藏起来之后,被人精准盯上的概率小了很多。


每周五分钟,对着这份清单过一遍

  • 百度 site: 一下自己的域名,看看标题里有没有陌生词
  • 首页源代码拉到底,看有没有隐藏链接
  • 核心、插件、主题是否都更新到了最新
  • 后台有没有登录失败告警
  • 有没有一份能用的异地备份

暗链这东西,攻击者赌的就是你没空看源代码。你把这份自查变成习惯,他就没得赌了。

首发于 wujianzhan.com。