最近发现我的另一个小站(爱Radio网)频繁弹出广告,被QQ浏览器拦截,起初以为是被人挂马了,仔细找了找也没发现异常。后来想想是不是DNS劫持了,可惜换了本地DNS弹窗广告依旧。后请教Jason分析说说isp劫持,尼玛这就尴尬了,这是神马玩意。百度可以下,还是不懂,毕竟是学机电的,理解这玩意有些难度。最后解决方法就是投诉运行商或者加证书用https访问,这俩对我来说都不简单,就只能先这样了,蓝瘦香菇!
另外,我的网络是山东移动无线网络(CMCC),坑爹的玩意。
文章源自两天的博客-https://2days.org/3032.html
以下转载:
本文遵从GPL协议,欢迎转载。文章源自两天的博客-https://2days.org/3032.html
1、现象是什么?文章源自两天的博客-https://2days.org/3032.html
大约从今年年初开始,很多人就发现,在浏览一些网站的时候,地址栏的url后面会被莫名其妙地加上“?curtime=xxxxxxxxxx”(x为数字),并且弹出广告窗口。很多人以为这是网站自己弹出的广告,也就没有在意。文章源自两天的博客-https://2days.org/3032.html
我是属于很在意的那些人之一。文章源自两天的博客-https://2days.org/3032.html
2、这是怎么回事?文章源自两天的博客-https://2days.org/3032.html
经过测试和分析,我们发现,上述现象与使用何种浏览器无关(我们测试了各种流行的http客户端),与使用何种操作系统也无关(linux用户也有相关报告)。我对出现该现象的IE浏览器进程进行了跟踪调试,没有发现任何异常。可以断定,并不是系统被安装了adware或者spyware。文章源自两天的博客-https://2days.org/3032.html
那么是不是那些网站自己做的呢?后来发现,访问我们自己管理的网站时也出现了这种情况,排除了这个可能。文章源自两天的博客-https://2days.org/3032.html
那么剩下唯一的可能就是:有人在某个或某几个关键网络节点上安装了inject设备,劫持了我们的HTTP会话——我实在是不愿相信这个答案,这个无耻、龌龊的答案。文章源自两天的博客-https://2days.org/3032.html
伟大的谢洛克·福尔摩斯说过:当其他可能都被排除之后,剩下的,即使再怎么不可思议,也一定是答案。文章源自两天的博客-https://2days.org/3032.html
为了验证这个想法,我选择了一个曾经出现过上述现象的网站附近网段的某个IP。直接访问这个IP的HTTP服务,正常情况下是没有页面的,应该返回404错误。我写了一个脚本,不断访问这个IP,同时记录进出的数据包。在访问进行了120次的时候,结束请求,查看数据。120次请求中,118次返回的都是正常的404错误:
- HTTP/1.1 404 Object Not Found
- Server: Microsoft-IIS/5.0
- Date: Mon, 19 Jul 2004 12:57:37 GMT
- Connection: close
- Content-Type: text/html
- Content-Length: 111
- <html>
- <head>
- <title>Site Not Found</title>
- </head>
- <body>
- No web site is configured at this address.
- </body>
- </html>
但是有两次,返回了这个:
- HTTP/1.1 200 OK
- Content-type: text/html
- <html>
- <meta http-equiv='Pragma' content='no-cache'>
- <meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'>
- <script>
- window.open('http://211.147.5.121/DXT06-005.htm', '', 'width=400,height=330');
- </script>
- <head>
- <title></title>
- </head>
- <body>
- </body>
- </html>
更进一步分析数据包,可知劫持流程如下:
A、在某个骨干路由器的边上,躺着一台旁路的设备,监听所有流过的HTTP会话。这个设备按照某种规律,对于某些HTTP请求进行特殊处理。
B、当一个不幸的HTTP请求流过,这个设备根据该请求的seq和ack,把早已准备好的数据作为回应包,发送给客户端。这个过程是非常快的,我们的HTTP请求发出之后,仅过了0.008秒,就收到了上面的回应。而任何正常的服务器都不可能在这么短的时间内做出回应。
C、因为seq和ack已经被伪造的回应用掉了,所以,真正的服务器端数据过来的时候,会被当作错误的报文而不被接受。
D、浏览器会根据〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉这一行,重新对你要访问的URL进行请求,这一次,得到了请求的真正页面,并且调用window.open函数打开广告窗口。
在google中以“php?curtime”、“htm?curtime”、“asp?curtime”为关键字搜索,出现的基本上是国内网站,这表明,问题出在国内。用于inject的设备插在国内的某个或某几个大节点上。
真相大白。我们被愚弄了,全中国的网民都成了某些人的赚钱工具。
3、现在怎么办?
在坏家伙被捉出来之前,我们要想不受这个玩意的骚扰,可以考虑下面的方法:
A、请各单位的网络管理员,在网络的边界设备上,完全封锁211.147.5.121。
B、在你自己的个人防火墙上,完全封锁211.147.5.121。
C、如果你的浏览器是FireFox、Opera、GreenBrowser、或者MyIE,可以把“http://211.147.5.121/*”丢到弹出窗口过滤列表中去。
绝不只是广告那么简单,这涉及到我们的选择,我们的自由,这比垃圾邮件更加肮脏和无耻。今天是广告,明天就可能在你下载软件的时候给你加个adware或者加个病毒进去,谁知道呢?我们的HTTP通信完全控制在别人手里。
4、如何把坏家伙揪出来?
如果你是一个有权力调查和处理这件事的人,从技术上,可以考虑下面的手段:
方法1、
伪造的回应数据中并没有处理TTL,也就是说,我们得到的回应数据中TTL是和inject设备位置相关的。以我收到的数据包为例,真实的服务器端回应TTL是107,伪造的回应TTL是53。那么,从我们这里到被请求的服务器之间经过了21(128-107)个节点,从我们这里到inject设备经过了11(64-53)个节点。只需要traceroute一下请求的服务器,得到路由回溯,往外数第11个节点就是安插inject设备的地方!
方法2:
假如坏家伙也看到了这篇文章,修改了TTL,我们仍然有办法。在google上以下面这些关键字搜索:php?curtime,htm?curtime,asp?curtime,可以得到大量访问时会被inject的网址。编写脚本反复访问这些网址,验证从你的ip访问过去是否会被inject。将确实会被inject的结果搜集起来,在不同的网络接入点上挨个用traceroute工具进行路由回溯。分析回溯的结果。
上面我们已经说明了,坏家伙是在某个或者某些重要节点上安插了inject设备,那么这个节点必然在被inject的那些网址到我们的IP之间的某个位置上。例如有A、B、C、D四个被inject到的网站,从四个地方进行路由回溯的结果如下:
MyIP-12-13-14-15-65-[89]-15-57-A
MyIP-66-67-68-69-85-[89]-45-68-84-52-44-B
MyIP-34-34-36-28-83-[89]-45-63-58-64-48-41-87-C
MyIP-22-25-29-32-65-45-[89]-58-D
显然,inject设备极大可能就在“89”所在的机房。
方法3:
另一方面,可以从存放广告业面的211.147.5.121这个IP入手,whois查询结果如下:
inetnum: 211.147.0.0 - 211.147.7.255
netname: DYNEGY-COMMUNICATION
descr: DYNEGY-COMMUNICATION
descr: CO.LTD
descr: BEIJING
country: CN
admin-c: PP40-AP
tech-c: SD76-AP
mnt-by: MAINT-CNNIC-AP
changed: hui_zh@sina.com 20011112
status: ALLOCATED PORTABLE
source: APNIC
person: Pang Patrick
nic-hdl: PP40-AP
e-mail: bill.pang@bj.datadragon.net
address: Fl./8, South Building, Bridge Mansion, No. 53
phone: +86-10-63181513
fax-no: +86-10-63181597
country: CN
changed: ipas@cnnic.net.cn 20030304
mnt-by: MAINT-CNNIC-AP
source: APNIC
person: ShouLan Du
address: Fl./8, South Building, Bridge Mansion, No. 53
country: CN
phone: +86-010-83160000
fax-no: +86-010-83155528
e-mail: dsl327@btamail.net.cn
nic-hdl: SD76-AP
mnt-by: MAINT-CNNIC-AP
changed: dsl327@btamail.net.cn 20020403
source: APNIC
5、我为什么要写这篇文章?
新浪为我提供桃色新闻,我顺便看看新浪的广告,这是天经地义的;或者我安装某某网站的广告条,某某网站付给我钱,这也是天经地义的。可是这个211.147.5.121既不给我提供桃色新闻,又不给钱,却强迫我看广告,这就严重伤害了我脆弱而幼小的心灵。事实上,你可以敲诈克林斯·潘,**克里奥·佩德拉,咬死王阳明,挖成吉思汗墓,我都不会计较,但是现在你既然打搅了我的生活,我就不得不说几句了。
6、我是谁?
如果你知道MyName,又知道MyCount的话,那么,用下面这段perl可以得到:2f4f587a80c2dbbd870a46481b2b1882。
- #!/usr/bin/perl -w
- use Digest::MD5 qw(md5 md5_hex md5_base64);
- $name = 'MyName';
- $count = MyCount;
- for ($i=0; $i〈$count; $i++)
- {
- $name = md5_hex($name);
- }
- print $name;
以下签名,用于以后可能出现的关于此文的交流:
1 6631876c2aea042934a5c4aaeabb88e9
2 a6a607b3bcff63980164d793ff61d170
3 6a58e8148eb75ce9c592236ef66a3448
4 ded96d29f7b49d0dd3f9d17187356310
5 cc603145bb5901a0ec8ec815d83eea66
彻底解决办法就是打电话给ISP骂人,要他们把你的帐号列入广告推送黑名单。前面有个和帖子说更换DNS,其实换DNS根本没有用。更换DNS连DNS劫持都不能解决,别说http会话劫持了。
【HTTP劫持和DNS劫持】腾讯的实际业务分析
简单介绍一下HTTP劫持和DNS劫持的概念,也就是运营商通过某些方式篡改了用户正常访问的网页,插入广告或者其他一些杂七杂八的东西。
首先对运营商的劫持行为做一些分析,他们的目的无非就是赚钱,而赚钱的方式有两种:
1、对正常网站加入额外的广告,这包括网页内浮层或弹出广告窗口;
2、针对一些广告联盟或带推广链接的网站,加入推广尾巴。例如普通访问百度首页,被前置跳转为http://www.baidu.com/?tn=90509114_hao_pg
在具体的做法上,一般分为DNS劫持和HTTP劫持。
DNS劫持:
一般而言,用户上网的DNS服务器都是运营商分配的,所以,在这个节点上,运营商可以为所欲为。
例如,访问http://jiankang.qq.com/index.html,正常DNS应该返回腾讯的ip,而DNS劫持后,会返回一个运营商的中间服务器ip。访问该服务器会一致性的返回302,让用户浏览器跳转到预处理好的带广告的网页,在该网页中再通过iframe打开用户原来访问的地址。
HTTP劫持:
在运营商的路由器节点上,设置协议检测,一旦发现是HTTP请求,而且是html类型请求,则拦截处理。后续做法往往分为2种,1种是类似DNS劫持返回302让用户浏览器跳转到另外的地址,还有1种是在服务器返回的HTML数据中插入js或dom节点(广告)。
在用户角度,这些劫持的表现分为:
1、网址被无辜跳转,多了推广尾巴;
2、页面出现额外的广告(iframe模式或者直接同页面插入了dom节点)。
处理办法:
1、先对外网做检测,上报被劫持的情况。
对于我这个业务而言,加推广尾巴没意义,那么就剩下植入广告的问题了。页面广告可能通过iframe方式,也可以通过dom节点方式,需要在首页检查这两种情况。
- window.addEventListener('DOMNodeInserted', checkDivHijack);
- function checkDivHijack(e) {
- var html = e ? (e.srcElement.outerHTML || e.srcElement.wholeText) : $('html').html();
- var reg = /http:\/\/([^\/]+)\//g;
- var urlList = html.match(reg);
- if (!urlList || urlList.length == 0) {
- return;
- }
- reg = /^http:\/\/(.*\.qq\.com|.*\.gtimg\.cn|.*\.qlogo\.cn|.*\.qpic\.cn|.*\.wanggou\.com)\/$/;
- var hijack = false;
- for (var i = 0; i < urlList.length; i++) {
- if (!reg.test(urlList[i])) {
- hijack = true;
- break;
- }
- }
- }
(注:事后发现这个url检查不够严谨,虽然劫持的情况都能发现,但也把产品原有的一些正常插入做劫持误报了。例如,不过这个是小细节,把正则表达式完善一下就ok了)
2、针对被iframe加载的情况,需要先找到运营商设置的劫持规律。
在iframe中的网页能正常打开,而不是又被拦截加iframe,可能是因为请求的url上或cookie上运营商做了标记。我们可以利用这个规则,躲过劫持。
3、针对注入dom节点的情况,初始化时做检查,而且后续dom注入也做检查。可以检查dom中是否含有白名单以外的http链接,如果有,就可以判定为http劫持。
4、在前端以外的处理办法还有
a) 终端拦截所有返回包,判断ip来自黑名单(劫持的中间ip)则丢弃返回包。
这种做法的原因是,运营商劫持http请求后,并不是完全丢弃请求包,而是做了复制,一份继续发给目标服务器,另外一份做劫持处理直接返回302。因为这个302会比目标服务器的正常返回早得多,所以用户浏览器会只认第一个302,而丢弃后到的正常返回。
如果先把第一个302丢弃,等待后续正常返回,则问题解决。
b) 终端拦截请求包,并拆包发送。
运营商一般判断是否劫持,通过判断是否HTTP请求。 一般只会检测TCP连接建立后的第一个数据包,如果其是一个完整的HTTP协议才会被标记;如果并非是一个完整的HTTP协议,由于无法得到足够多的劫持信息,所以并不会被标记为HTTP协议。
所以,只要把请求包切得足够细,就能躲过一部分劫持(如果运营商学习“墙”大力气做多包拦截就没辙了)。
5、当然,最终,根本解决办法是使用HTTPS,不过这个涉及到很多业务的修改,成本较高。如果劫持比例小,也许通过适当的补救做法会更好。
来看看检测到的劫持情况:
总体1500万pv的业务,一天竟然有100万的劫持上报,即使排除一半的误报,也代表说20个用户中,就接近有1个用户出现被劫持的情况。
可见,各种小运营商(尤其是移动)的心是有多黑!胆子是有多大!
各种劫持的手段都有:
1、直接返回一个带广告的HTML;
2、在原html中插入js,再通过js脚本安插广告;
3、iframe展示原来正常网页.
本站文章大部分始于原创,用于个人学习记录,可能对您有所帮助,仅供参考!
北京市 32F
可以删掉与讨论无关的评论么?看着很尴尬啊。。
还有下面的“回复时通知”旁边的on到底是指现在已经是on的状态还是在说我需要点击打开?
类似的开关总是让我摸不着头脑。
安徽省淮北市 31F
我的日子,原本过的很平静,但渐渐的,村里有人开始说我了。是柳树告诉我的。原因是,我没能给青生个孩子。我觉得很奇怪,我原本就是朵青莲,为什么要有孩子?青什么都没有说,可我也有看到他的叹息。娘也问过我,我什么都不知道。我觉得心中不再是平静的了。我又开始回想在忘忧河的日子。我记得佛跟我说过,只要我真正获得了一个人的爱,他就来接我。可那是什么时候呢。我问过柳树,有没有见过佛,柳树什么都没说。我觉察到,柳树的时间不多了。原本我想问柳树,什么是爱的。于是我没有问
安徽省淮北市 30F
青对我很好。他总是尽早的回来陪我,他常常和我回娘家,跟爹下棋,娘疼我,不要我下橱。我就看爹和青下棋。青总是让着爹,青有教我下棋,我看得出青很巧妙的让着爹。青的公事很多,他总是在灯下奋笔急书。我只能给他端一杯茶,给他磨墨。每到这时,青总是放下手中的笔,把我抱在他怀里,把他的头靠在我肩上,在我耳边轻轻的唤着水莲,水莲。青总喜欢叫我水莲,说是他的水莲。他说我身上有淡淡的莲香。殊不知,我原本就是佛跟前的青莲。
安徽省淮北市 29F
青说,先立业,后成家。爹和娘对他很满意,也赞同他的说法。两家为我们办了定亲酒。我不大明白为什么大伙都很高兴的样子,跟他们平时那种高兴不大一样的。娘开始教我一些事,说是女人份内的。我去看荷花的日子就少了。柳树告诉我,没有了我,荷塘变的很寂寞。寂寞,这是什么,我不大懂。我的生活,并没有发生太大的变化。
安徽省淮北市 28F
后来,我再去看荷花的时候,就常常遇到他,慢慢的,我知道,他叫青。他总是拿着书,然后我看荷花的时候,他看书,我知道他也在看我,是柳树告诉我的。慢慢的,我们开始说话,他教我很多东西,他教我的第一首古风便是:蒹葭苍苍,白露为霜,所谓伊人,在水一方……他常常念的是,关关雎鸠,在河之洲,窈窕淑女,君子好逑。…… 然后就反反复复的吟哦 求之不得,寤寐思服,悠哉悠哉,辗转反侧。我不明白那是什么意思。我只是有那个清晨的感觉,像被那雾拥抱着。后来有一天,他有些紧张的看着我,伸出他的手,对我说:死生契阔,与子相悦;执子之手,与子偕老。我其实并不懂,我只觉得,那句话说出来时,就像佛平时跟我说话一般。于是我知道了,这个人,是佛为我选的。于是,我轻轻的,把手放在他手上。那年,我十六岁,青二十二岁。
安徽省淮北市 27F
我还记得当时有一阵微风,吹得我的裙摆飘飘,在我拂过挡了我眼睛的头发时,一回眸看到了他,他穿着一袭青衫,如同几百年前那场雾,淡淡的。他看到我的时候,手中的书掉在了地上,我也忘记了回过头来,一直看着他。直到柳树轻轻的用它的枝条拂过我的手臂,我这才想起,娘说,女子不可以这样做的。我提着裙摆,匆匆的走了。那年,我十四岁。
安徽省淮北市 26F
我偏爱淡淡的紫色,我总能想起在忘忧河的时候,我是淡淡的紫色。我常常忆起那梵唱,清风,幽竹,明月。我常常在下午的时候,到村前的大池塘边去看着那满塘的荷花。
我还记得那是个夏的下午,我坐在那棵柳树下,娘说那柳树有五百年的年岁了,我知道其实它有八百岁了,它也知道我是佛前的青莲,我每次去的时候,它都会跟我说话,我看着那满池的荷花,静静的,一如我当初微绽时般。
安徽省淮北市 25F
我成为了一个人,一个女子。娘告诉我,生我的那年夏天,村前大池塘的莲池突然冒出了很多荷花的荷苞,我出世的那天早上,荷花全开了,于是爹给我取名叫菡萏。娘还说,我出生后第三天,有个道行很高的高僧来看过我,说我有慧根,……娘还有话说,可被爹的眼光制止了。我没有问,我只默默的听着。我知道,我是佛前的一朵青莲。我没有告诉爹和娘。
安徽省淮北市 24F
我静静的绽放在忘忧河上,一年年的过去,看着人世的聚散离和,不知道过了多少年,也许是几十年,也许是几百年。终于有一天,我对佛说,我想去人间。佛依旧爱怜的看着我,问我是否真的决定好了,离开他身边去人间。我其实也不知道,我只是看着佛。佛轻声的说,注定的孽缘是逃不过的。佛说,不让我喝忘忧河的水,让我保留这里的记忆。佛说,他会接我回来的。佛说,当我真正获得一个人的爱的时候,就接我回来。佛说,不让我受到人间的玷污和伤害。我正要问佛,什么是爱。佛把我捧在掌心,送我进入了红尘。
安徽省淮北市 23F
我是佛前的一朵青莲,静静的看着人间,一天又一天,看着那么多人一次次的在轮回,重复着前世的故事。我不明白,为什么有机缘在他们跟前的时候,他们不愿意放弃红尘。我问佛,佛爱怜的掬着我四周的水,说你美丽的绽放吧。
安徽省淮北市 22F
我还记得那个早晨,从未见过的景象出现在我眼前。淡淡的,青色的,温柔的事物轻轻的笼罩了整个忘忧河,爱怜的抱着我,如同佛注视我一般。我只记得佛低声的说着,孽缘,孽缘。我不明白这两个字。我问佛那是什么,佛说,那是雾。我问佛,什么是孽缘,佛爱怜的看着我,如同那雾抱着我一般,说我总有明白的一天的。
安徽省淮北市 21F
我是佛前的一朵青莲,沐浴着清幽的梵唱,静静的微绽在忘忧河上。几乎静止的河水清澈明晰。佛说,忘忧河映射出的,便是人世间的喜怒哀乐。于是,我常常看着那些男男女女,笑着,哭着,开心着,忧伤着。我不明白,为什么他们总是笑的时候少,哭的时候多,开心的时候少,忧伤的时候多。我问佛,佛爱怜的对我说:人生在世就是一种修炼,只有看破红尘之后,才能大彻大悟。我还是不明白,佛说我不需要明白。更多的时候,我就静静的微绽着,听风,看雨,醉月。