1.確定站點(diǎn)及其功能--與開發(fā)人員和PM交流
繪制一些簡單的數(shù)據(jù)流圖表,對站點(diǎn)上的頁面及其功能進(jìn)行描述。此時,可以安排一些與開發(fā)人員和項(xiàng)目經(jīng)理的會議來建立威脅模型。在會議上盡可能對應(yīng)用程序進(jìn)行深入探討。站點(diǎn)公開了Web服務(wù)嗎?是否有身份驗(yàn)證表單?有留言板嗎?有用戶設(shè)置頁面嗎?確保列出了所有這些頁面
2.找出并列出所有由用戶提供輸入的點(diǎn)
對站點(diǎn)地圖進(jìn)行進(jìn)一步細(xì)化。我通常會為此創(chuàng)建一個電子表格。對于每個頁面,列出所有查詢字符串參數(shù)、cookie值、自定義HTTP標(biāo)頭、POST數(shù)據(jù)值和以其他形式傳遞的用戶輸入。不要忘記搜索Web服務(wù)和類似的SOAP請求,并找出所有允許用戶輸入的字段。
分別列出每個輸入?yún)?shù),因?yàn)橄旅嫘枰?dú)立測試每個參數(shù)。這可能是最重要的一個步驟!如果閱讀下面的電子表格,您會看到我已經(jīng)在示例站點(diǎn)中找出了一大堆這樣的東西。如forwardURL和lang這樣的查詢字符串。如name、password、msgBody、msgTitle和這樣的POST數(shù)據(jù),甚至某些Cookie值。所有這些都是我們感興趣的重要測試內(nèi)容
3.認(rèn)真思考并列出測試用例
4.開始測試并注意輸出結(jié)果
在查找漏洞的過程中,最重要的部分并不是您是否找到了漏洞。而是您是否真正知道究竟發(fā)生了哪些事情。對于XSS,只需檢查HTML輸出并看看您輸入的內(nèi)容在什么地方。它在一個HREF標(biāo)記中嗎?是否在IFRAME標(biāo)記中?它在CLSID標(biāo)記中嗎?在IMG SRC中嗎?某些Flash內(nèi)容的PARAM NAME是怎樣的?
我會檢查所有這些情況,如果您對所輸入內(nèi)容的目的十分了解,可以調(diào)整您的測試來找出問題。這意味著您可能需要添加一個額外的封閉括號“>”來讓某個標(biāo)記變得完整,或者添加一個雙引號來關(guān)閉標(biāo)記內(nèi)的一個元素。或者,您可能需要使用URL或HTML來編碼您的字符,例如將雙引號變?yōu)?22或"。
5.這個站點(diǎn)看來防范比較嚴(yán)密。現(xiàn)在該怎么辦呢?
那么,也許您的簡單測試用例alert(‘hi’)并不能產(chǎn)生期望中的警告對話框。仔細(xì)想想這個問題并在可能的情況下與開發(fā)人員進(jìn)行交流。也許他們對輸入中的尖括號、單引號或圓括號進(jìn)行了過濾。也許他們會過濾“scrīpt”這個詞。重新研究為何輸入會產(chǎn)生這樣的輸出,并理解每個值(查詢字符串、cookie、POST數(shù)據(jù))的作用。“pageId=10”這樣的查詢字符串值可能對輸出沒有影響,因此不值得花費(fèi)時間測試它。有時,最好試著注入單個字符(例如尖括號、雙引號標(biāo)記或者圓括號),看看應(yīng)用程序是否過濾這些字符。然后,便可以知道您面對的過濾級別究竟如何。接著,可以調(diào)整測試方法,對這些字符進(jìn)行編碼并重試,或者尋找其他注入辦法。
改變測試用例
我恐怕無法充分對此進(jìn)行說明:研究輸入的值會輸出什么樣的HTML頁面非常重要。如果它們不能產(chǎn)生輸出,那么不要在它們上面浪費(fèi)時間。如果可以,請進(jìn)行研究,因?yàn)槟枰鶕?jù)輸出對測試進(jìn)行相應(yīng)的修改。我使用了各種變化形式來找出能接受和顯示腳本代碼的參數(shù)。因?yàn)檫@涉及太多內(nèi)容,因此在這里無法一一進(jìn)行討論,但是請務(wù)必注意以下幾種情況:

有許多變化形式可以嘗試。關(guān)鍵在于了解程序究竟使用何種方式處理輸入和顯示輸出頁面。如同這些例子所展示的,常見的變化形式經(jīng)常是在腳本代碼前面加上“>””,以嘗試封閉網(wǎng)站可能在輸出中生成的標(biāo)記。還可以對代碼進(jìn)行URL編碼,嘗試?yán)@過服務(wù)器端的輸入過濾功能。此外,因?yàn)榧饫ㄌ枴?lt;>”通常會在輸入時被過濾和從輸出中刪除,所以還必須嘗試不需要尖括號的XSS,例如”&{alert('XSS')};”
持久和動態(tài)
找出一個成功的XSS頗費(fèi)周折,因?yàn)樵陂_始時XSS攻擊可能并不是那么顯而易見的。隨便舉一個例子,如果向網(wǎng)站添加一條新留言并在“msgTitle”值中注入代碼,在提交數(shù)據(jù)后,您可能不會立即看到腳本代碼
被執(zhí)行。但是,當(dāng)您訪問留言板的時侯,將會在HTML頁面中使用“msgTitle”值并將其作為腳本代碼執(zhí)行。這種情況被稱作持久性XSS攻擊,如果包含腳本代碼的值將被保存到客戶端或者后端系統(tǒng)并在稍候的時間被執(zhí)行,便會發(fā)生此種攻擊。
而與此相對的是動態(tài)XSS攻擊,這種攻擊會立即執(zhí)行并只發(fā)生一次。比如,如果某個鏈接或GET請求在某個用來控制頁面輸出的查詢字符串中包含了腳本代碼,那么在點(diǎn)擊鏈接后會立即顯示輸出。