当前位置: 首页 > 科技观察

Web前端页面劫持与反劫持

时间:2023-03-12 16:59:24 科技观察

常见劫持方式根据劫持方式不同,我将劫持分为以下两种:跳转式劫持:用户输入地址A,但跳转到地址B注入式劫持:不同对于跳转式劫持,是指注入广告代码(js、iframe等)劫持,通过将被劫持的js代码注入到页面中。iframe劫持:将普通页面嵌入iframe或在页面中添加iframe页面篡改页面。劫持:正常页面出现冗余的被劫持网页标签,导致页面整体大小发生变化。跳转劫持为了获取流量,一些像百度这样需要流量合作的电商或者网站都会有自己的联盟??体系,通过给予一些奖励来获得导流。比如百度或者电商都会有渠道共享。为了区分哪些是第三方重定向的,通常在url地址中加上source、from等参数,或者在进入页面前传递“中间页”cookies。这样,当用户输入一个正常的URL时,劫持方就会使其跳转到“中间页面”或网络层带有频道号的页面。这样,劫持方就会在用户下单或搜索时获得“佣金”。以上案例都还算友好,至少用户一般不会体验到页面变化,也有类似跳转到钓鱼网站的案例,也有不正当竞争的案例:用户进入baidu.com跳转到so.com或sm.cn,故意将对方网站做成与百度搜索相似的样子。当时也帮法务做了很多案例的收集工作。题外话:几年前,当用户使用百度搜索某些医疗查询时,他们会立即接到推销医院的电话。不少网友吐槽,不明真相的人也纷纷指责百度。实际上,这些类型的关键字是由运营商放置在url中的。卖给医疗机构,百度就是躺着。..当时另一个项目是加密查询。..注入式劫持页面在传输过程中被网络层“重新处理”。常见的例子有:注入js、iframe、篡改页面等。注入js注入js的方式可以是通过document.write或者直接修改html代码片段等方式,给页面添加外部js。有些运营商为了增加检测难度,会编造一个不存在的url地址,使其不被过滤检测。情况一:运营商会使用自己识别的ip或域名作为jsURL,wap.zjtoolbar.10086.cn只会在浙江移动的网络下解析,同样的ip也是情况二:运营商是很聪明,知道页面可以检测到所有外部js的域名,例如:m.baidu.com我只允许m.baidu.com/static外部js,其他js会被记录并反馈;为了不被发现,我遇到了一个案例,电信会访问一个不存在的地址,比如:m.baidu.com/static/abc.js,这个地址会在运营商中直接返回被劫持的js代码,并且该请求不会发送到百度的服务器。放在一个iframe或者iframe的其他页面中的情况比较少见,但是一些边缘网站或者没有内容的垃圾网站会使用这种方式。他们通常通过热门关键词之类的方式来做SEO,打开网站后实际上是去看广告的。该类没有任何实际内容,但该页面嵌入了另一个网站。如果我们认识到它不是嵌入的,我们需要检测它。篡改页面内容的情况很少见。一般是在页面底部加一个js以外的div,然后显示一些非网站的内容。劫持检测方法讲了常见的劫持手段,下面就来看看如何识别上面提到的劫持吧。上图是2015年8月11日某百度页面被劫持的情况,当天的数据还不错。之前浙江移动的网络劫持率高达40%+,而且大部分劫持来自域名zjtoolbar.10086.cn,也就是移动流量。提示符(还专门启用了一个域名zjtoolbar,浙江工具栏)。..跳转式劫持跳转式劫持仅靠网页很难检测出来。当时我们是在手机百度(Handbai)做检测,所以比较简单。用户输入搜索词(query),打开百度页面的URL,页面加载时,APP比较访问的URL是否为之前要访问的URL,如果URL不一致,记录并上报.注入js类页面并重写document.write方法遍历页面的script标签,为外链js添加白名单,报告js外链是否不在白名单中,检测是否被嵌套框架。通过比较父对象,如果页面是嵌套的,那么parent!==window,获取我们页面的URL地址,可以使用如下代码:functiongetParentUrl(){varurl;if(parent!==window){try{url=parent.location.href;}catch(e){url=document.referrer;}}returnurl;}上面提到的特殊方法类似于电信在白名单中伪造jsurl,篡改页面内容.我们无法使用上述方法检测到此信息。如果是在APP里面,可以做的事情就更多了。除了上述之外,您还可以比较页面的内容长度。当时手百的做法是:当用户开始输入查询时,APP访问的是一个空白页面,该页面只有html、title、head、body和script,script标签中的主要代码是嗅探它是否被劫持。因为一般的劫持不会针对某个页面,而是整个网站域名,所以我们的空白页面也会被劫持。一旦被劫持,如此简单的页面结构很容易做页面劫持分析。分析劫持手段后,报告casescript中的核心代码如下:functionhiJackSniffer(){varfiles=$.toArray(D.querySelectorAll('script[src]'));vararr=[];for(vari=0,len=files.length;i4e3){vartmp={};varheadjs=$.toArray(D.head.querySelectorAll('script'));varunknownCode=[];if(headjs.length){unknownCode=unknownCode.concat(headjs.map(function(v){returnv.innerHTML;}).filter(function(v){return!!v;}));}varbody=$.toArray(D.body.querySelectorAll('*'));if(body.length>1){unknownCode=unknownCode.concat(body.map(function(v){returnv.outerHTML.split('\n').join('');}).filter(function(str){if(/^/.test(str)){returnfalse;}returntrue;}));}returnsendImg(unknownCode,3);}sendImg([],0);}除了检测冗余的js链,还可以检测tam等情况pering页面内容。除了检测域名劫持,在用户输入查询时访问空白页面也可以提前完成DNS解析。此外,还可用于劫机防御,正所谓“一石三鸟”!最简单粗暴的劫持防御就是直接上HTTPS,一劳永逸。然后就是取证,上法庭或者警告渠道骗子。此外,我们还可以继续使用空白页面进行劫持检测。在没有全量https的时期(毕竟全站https涉及的工作量不小),在使用空白页面嗅探当前网络环境下的劫持风险时,再调用客户端接口告诉客户端使用https不仅可以降低被劫持的风险,还可以通过本页面的小流量来测试https数据。以后在完整https后,也可以通过空白页面打开旧版APP的完整https。【本文为专栏作家“三水清”原创稿件,转载请微信♂联系作者获得授权】点此查看该作者更多好文