捧着一颗心来,不带半根草去。 ——陶行知
1 相关概念
1.1 SEO
SEO(Search Engine Optimization),即搜索引擎优化。是一种方式:利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。目的是让其在行业内占据领先地位,获得品牌收益。很大程度上是网站经营者的一种商业行为,将自己或自己公司的排名前移。
搜索引擎优化的技术手段主要有黑帽(black hat)、白帽(white hat)两大类。通过作弊手法欺骗搜索引擎和访问者,最终将遭到搜索引擎惩罚的手段被称为黑帽,比如隐藏关键字、制造大量的meta字、alt标签等。而通过正规技术和方式,且被搜索引擎所接受的SEO技术,称为白帽。
1.2 PR值
PR值全称为PageRank,用来表现网页等级的一个标准,级别分别是0到10,是Google用于评测一个网页“重要性”的一种方法。级别从1到10级,SEO百度排名,10级为满分。PR值越高说明该网页越受欢迎(越重要)。
1.3 暗(黑)链
暗链就是看不见的网站链接,暗链在网站中的链接做得非常隐蔽,短时间内不易被搜索引擎察觉。它和友情链接有相似之处,可以有效地提高PR值。但要注意一点PR值是对单独页面,而不是整个网站。
黑链是SEO手法中相当普遍的一种手段,笼统地说,它就是指一些人用非正常的手段获取的其它网站的反向链接,最常见的黑链就是通过各种网站程序漏洞获取搜索引擎权重或者PR较高的网站的webshell,进而在被黑网站上链接自己的网站,其性质与明链一致,都是属于为高效率提升排名,而使用的作弊手法。
一般情况下,两者实际是等价的。
2 研究样本
2.1 Referer作弊
当一些访问者要访问同一个网站页面时,网站的Cloak程序,通过识别,分类这些访问者,呈现给不同用户特定不同的页面,这个过程叫Cloaking。
而referer作弊则是黑产针对搜索引擎、大型网站做的黑帽SEO,其他点在于只有通过搜索引擎访问会跳转,直接访问则不会跳转,这是通过判断网页请求头中Referer字段实现的。网站通过搜索引擎访问跳转到博彩页面就是受到了referer作弊攻击。
2.2 User-Agent作弊
User-Agent与Referer作弊实现效果是相同的,唯一的差别就是Referer作弊是通过判断Referer字段来区分从搜索引擎点击还是直接访问,而User-Agent则是通过判断User-Agent字段。这两者都属于Cloaking技术的应用。
对于搜索引擎来说,为了区分自身和正常人的行为,爬虫会修改自己的UA为一个公共声明标识的UA如:360spider,这也为黑产对抗留下了入口,黑产从业者会通过js/后端php来进行请求头判断,如果是来自搜索引擎的流量,则展示黑产页面,如果是正常访客的UA则展示正常的页面。这样可以极大加强隐蔽自身的能力。
baiduBot: Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
360spider: 360Spider
bingBot: Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
GoogleBot: Googlebot/2.1 (+http://www.googlebot.com/bot.html)
YahooBot: Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)
2.3 CSS隐藏
CSS隐藏链接是常用的,以下为常用的暗链隐藏方式。
1.链接位于页面可见范围之外,常通过postion设置
<div style="position:absolute;left:expression_r(1-900);top:expression_r(3-999);">
<a href="暗链">关键词</a>
</div>
<div style="position:absolute; top:-999px;right:-999px;">
<a herf="暗链">关键词</a>
</div>
<div style="text-indent:-9999em; display:block;float:left">
<a herf="暗链">关键词</a>
</div> 元素向前缩进为负值,即在可见范围之外
2.修改背景颜色、大小,隐藏链接
<a herf=# style="color:#FFFFFF; ">关键词</a>
<a herf=# style="font-size:1px;">关键词</a>
<a herf=# style="line-height:1px;">关键词</a>
3.利用跑马灯marquee属性,链接以跑马灯形式迅速闪现,跑马灯的长宽设置很小,同时将闪现的频率设置很大,使得查看页面时不会有任何影响。
<marquee height=1 width=4 scrollamount=3000 scrolldelay=20000>
<a href= "暗链">关键字</a>
</marquee>
4.利用display:none和visibility:hidden隐藏区域里的内容。
<div style="display:none;"><a href="暗链">关键字</a></div>
<div style="visibility:hidden;"><a href="暗链">关键字 </a></div>
2.4 JS控制
虽然控制CSS来隐藏链接的依旧是最普遍的,但由于搜索引擎和安全厂商已经对该方法进行发现打击,效果有所下降。黑帽SEO为了避免被搜索引擎识别,使用JS写入CSS或HTML代码以隐藏自己。
1.JS写入css属性
<div id="anlian"> <a href="暗链">关键字</a></div>
<script>
document.getElementById("anlian").style.display="n"+"one"
</script>
2.利用遮挡层隐藏暗链。z-index属性可以设置元素的堆叠顺序,z-index值越小其堆叠顺序越靠后,因此可以利用其它层来遮挡暗链。
<div class="father" style="position:relative">
<div class="topLever" style="position:absolute;left:0;top:0;z-index:999; width:90%;height:100px;"> 遮挡层:可以放图片等 </div>
<div class="hideDontent">隐蔽层:可以放暗链</div>
</div>
3.利用iframe创建隐藏的内联框架
<iframe> marginWidth=0 marginHeight=0src="暗链 " frameBorder=0width="226" scrolling=no height=3 name="haitan">
</iframe>
4.利用重定向机制。在跳转之前的页面写入不相关的链接,通过快速跳转到正常页面,使用户无法察觉。
<script> setTimeout("window.location= "index.html",0.1); </script>
<body leftMargin=0 topMargin=0 scroll=no>
<div>
<a href=“暗链”>关键字</a>
</div>
</body>
5.利用标签插入链接。位于网页html源码头部内的标签,提供有关页面的元信息,是搜索引擎判定网页内容的主要根据, 攻击者可以在标签中插入大量与网页不相关的词语以及链接。
<meta http-equiv="refresh" content="1"; url="暗链"/>
<meta name="xxxx"content="黑链及描述">
3 对抗策略
目前主流的检测方式有两种,一种是基于规则的检测方法,通过经验丰富的人员收集各种样式的黑页并提取关键词、结构。传统基于经验总结的关键词规则在准确率、召回率方面都很难达到令人满意的效果,并且需要耗费许多精力收集黑页并提取规则。所以目前最新方向是基于机器学习的检测方法,通过机器学习算法训练暗链检测模型。基于规则校验的工具如: dc_find。基于机器学习的检测工具与算法,最终产物以论文为导向,并没有找到可以进行应用的场景,以后有机会可以自己训练再增添到本文中( 数据集难找…),有兴趣的可以在知网搜索暗链检测,论文还是很多的。
4 工具检测
这里就简要阐述一下dc_find
工具,该工具采用典型的基于规则的检测方法,基本就堆叠关键词。该工具更多的是着眼于网页关键词
,尤其是黑产常用的关键词比如: 棋牌、博彩等等。而暗链检测功能比较薄弱,当然我们关键词加的越多,结果就越准确。比较出色的是和fofa进行了联动,并且其中对Referer和UA的欺骗,这一点是很多机器学习算法所忽略的。总体来说,该工具还是可以的,不过想要效果好还需要对规则进行增加和修改。
按照惯例,本本节也应该开发一款检测工具,但有基于规则的检测工具dc_find和众多机器学习检测算法,就不再重复造轮子了。这里实践一下新思路: 设置不同的UA,根据网站返回内容是否一致来确认该网站是否有可能存在黑页。
小工具: cloak_find(推荐使用dc_find, 本工具测试效果极不理想…..)
# 检测函数
def check(url):
headers={
'User-Agent':'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Referer':'https://www.qq.com/'
}
try:
res=requests.get(url,headers=headers,timeout=5).text
page=len(res)
except:
return False
for bot in bots:
el=bot.split('@')
ti=el[0]
headers['User-Agent']= el[1]
headers['Referer']=el[2]
try:
res=requests.get(url,headers=headers,timeout=5).text
if len(res) != page:
print('[+]{} bot:{}'.format(url,ti))
result.append('{} bot:{}'.format(url,ti))
return True
except:
return False
5 相关案例
对于该案例的验证,可以安装Chrome插件 User-Agent Switcher
, 可以自定义User-Agent