当我们在手机上访问网页时,经常会看到一些不属于网页本身的内容,常见的是在网页中加入一些别人的广告,这种情况很明显是被劫持了。如果调试网页的话,大概会出现类似于下面的网页代码:
<script type="text/javascript" id="wf_float_url" src="http://ssp.0531kt.com/l7.js"></script>
<link rel="stylesheet" href="http://api.youxiaoad.com/css/adnoclosedown.css" type="text/css">
<script src="http://api.youxiaoad.com/js/adapi.js" type="text/javascript"></script>
很明显,这就是广告服务商提供内容的地方了。那它是怎么来的呢,下面我们就先分析下网页劫持的种类吧。
网页劫持的分类
网页劫持是目前黑帽SEO或者说黑产最喜欢的一种网页引流方式,此手法往往通过入侵网站,修改网站源代码、放寄生虫程序、设置二级目录反向代理等实现。网页劫持可以分为服务端劫持、客户端劫持、百度快照劫持、百度搜索劫持等等;表现形式可以是劫持跳转,也可以是劫持呈现的网页内容,目前被广泛应用于私服、博彩等暴利行业。 大致分类如下:
1、被浏览的网站域名泛解析
所谓“泛域名解析”是指:利用通配符* (星号)来做次级域名以实现所有的次级域名均指向同一IP地址。在域名前添加任何子域名,均可访问到所指向的WEB地址。也就是客户的域名#.com之下所设的*.#.com全部解析到同一个IP地址上去。比如客户设1.#.com就会自己自动解析到与#.com同一个IP地址上去。
域名恶意泛解析则是域名被黑客或其它别有用心的操作并泛解析到其它服务器上制作许多垃圾页面。这些被恶意泛解析的页面大多数为赌博、足球等恶意非法内容。
域名被恶意泛解析后,会对网站的权重和流量有直接性的影响,导致权重降低,流量减少。进而导致恶意信息被收录,被误认为是恶意欺诈性非法网站,不利于网站的用户体验。如果恶意泛解析如果不能及时处理,则会对网站SEO及用户体验造成致命的影响。
对于此问题,首先是检查域名解析是否被泛解。看见恶意域名泛解析后不要删除泛解析, 先修改泛解析(*.xxx.com)到自己的服务器IP上;然后,修改域名账号密码。域名被恶意解析,肯定是账户密码信息泄露或者是dns域名服务器被攻击,避免再次被修改;之后是制作404页面。因为泛解析被修改,之前百度收录的内容用户无法访问,通过404处理降低损失,提高用户体验。当然,如果已经收录的泛二级域名太多而不好处理时,可以将被恶意泛解析的域名重新解析到自己的空间,统一处理成404错误页;最后向百度站长提交死链。统计百度已收录的恶意二级页面链接地址(可以使用抓取工具提取),最后制作成一个txt格式的文件上传到网站空间,在百度站长工具里提交给百度处理。
2、用户浏览的浏览器被劫持
当你打开一个浏览器进行网页内容浏览的时候,这个网页会自动出现一个浏览器的广告新闻,实际上浏览器本身没有投放任何的广告,这个是被别人恶意利用劫持了浏览器,只要用户打开浏览器就会蹦出来这个广告。
3、黑客入侵
黑客入侵就是把用户所浏览的网站给侵入后植入一些木马程序,也就是我们平时所说的黑客入侵,挂马,把你的网站植入一些寄生虫病毒等。本来想进入“京东”的网站,结果进入了“天猫”的网站,那么这个就是被黑客入侵了。很多是黑客入侵这个主站以后,在他的上面挂上了木马病毒,寄生虫病毒等,这个东西不会长久,但是会不停的繁衍更新,可能你搜索完这次,展现给你,下次你再搜索,它又在这个网站的另外一个页面出现。
4、运营商劫持
假设你的页面不是泛解析,也不是你网站程序被黑客侵犯,那么就归于这个“不可描述”的劫持了,也就是运营商被劫持了,网页被非法的修改拦截了。使用HTTP请求请求一个网站页面的时候,网络运营商会在正常的数据流中插入精心设计的网络数据报文,让客户端(通常是浏览器)展示“错误”的数据,通常是一些弹窗,宣传性广告或者直接显示某网站的内容。
用户浏览的浏览器被劫持和运营商劫持同属于客户端劫持,大概分为以下类型:
I、跳转型劫持:用户输入地址A,但是跳转到地址B。如常见的header劫持:
<meta http-equiv=“refresh“ content=“10; url=http://thief.one“>
利用的就是Meta Refresh Tag(自动转向),将流量引走。
II、注入型劫持:在正常的网页中注入广告代码(js、iframe等),实现页面弹窗提醒或者底部广告等。
1),注入js类劫持:在正常的页面注入js代码实现劫持。
2),iframe类劫持:将正常网页嵌套iframe或者页面增加iframe。
3),篡改页面类劫持:正常页面出现多余的劫持网页标签,导致页面整体大小发生变化。
客户端劫持的实现方式
客户端劫持的实现方式有链路劫持攻击等,TCP链路劫持其实就是指网络链路上侦听、伪造TCP包,达到控制目标网络链路的行为。最常见的就是某些设备实现的对非法站点的访问拦截,以及一些地区运营商的网页植入广告行为。目前发现的TCP链路劫持攻击一般有两种形式:中断访问型(分为单向发包和双向发包)和替换页面型。
防范链路劫持比较困难,毕竟攻击者控制着网络链路。不过并非不可能,一是网站全程使用SSL,再一个就是在客户端或(和)服务器丢弃伪造的TCP包。在通常的运营商的劫持中,运用https加密,可以使劫持下降90%左右!
当然,除此之外,还可以检查目标的HTTP响应头是否设置好了X-Frame-Options字段确保自己网站的内容没有被嵌到别人的网站中去,也从而避免了点击劫持的攻击。
deny:标示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许
sameorigin: 表示该页面可以在相同域名页面的 frame 中展示。
allow-from uri:表示该页面可以在指定来源的 frame 中展示。
还可以检查目标网站是否有javascript的Frame Busting机制。通常可以写一段JavaScript代码,以禁止iframe的嵌套。这种方法叫frame busting。如:
if ( top.location != location ) {
top.location = self.location;
}
但是frame busting也存在一些缺陷。由于它是用JavaScript写的,控制能力并不是特别强,因此有许多方法可以绕过它。比如针对parent.location的frame busting,就可以采用嵌套多个iframe的方法绕过。此外,像HTML 5中iframe的sandbox属性、IE中iframe的security属性等,都可以限制iframe页面中的JavaScript脚本执行,从而可以使得frame busting失效。
客户端过滤
对于网页劫持,客户端所能做的非常有限。现在iOS端一般使用WKWebView实现网页的加载,目前的处理方式大概有两种,一种是具体问题具体分析,一种是使用内容过滤规则。
对于第一种方案,如果网页中被加入了广告,首先分析当前展现的网页源码,找到问题所在,具体分析。一般就是做一些对应的JS处理。实现起来并不是很好。
对于第二种方案,iOS11后WKWebView增加了内容过滤规则。原理上就是提供一个 JSON 给 WebKit,这个 JSON 包括内容的触发规则(trigger)和对应的处理方式(action),WebKit 会把拦截规则编译成高效的二进制码。
可使用的处理方式有,block:放弃加载资源,如果该资源已经缓存也忽略缓存;block-cookies:所有发送的请求的header中都会过滤掉cookie;css-display-none:隐藏使用 CSS selector 的页面元素,同时还有关联的selector;ignore-previous-rules:前面触发的规则不执行;make-https:把网页里的 http 请求改为 https 请求。
可以通过配置规则拦截页面里的资源请求、隐藏页面里的指定元素、将http请求转换成https等,实现以前的广告过滤的功能。
因为这个功能是iOS11加入的,对于iOS11之前的设备可以参考adblock的实现。有机会了下次再聊。