標籤:

如何為開發人員演示DOM型XSS漏洞利用過程

如何為開發人員演示DOM型XSS漏洞利用過程

來自專欄嘶吼RoarTalk4 人贊了文章

我的工作是設法讓開發人員編寫出安全的代碼,而安全教育則是實現該目標的關鍵部分。雖然有很多方法可以實現安全教育的目的,但是,如果為開發人員直觀展示攻擊者是如何利用軟體漏洞發動攻擊的話,他們一定會對安全隱患帶來的危害留下深刻的印象,從而提高其責任心。

在做這些演示時,我發現了兩個具有相似XSS漏洞的測試站點:Altoro Mutual和OWASP Juice Shop。事實上,如果只是從表面上看的話,這些漏洞完全相同,但是它們是有區別的:Altoro Mutual網站存在的是反射型XSS,而Juice Shop網站的漏洞則是DOM型XSS。事實證明,在企業環境中演示DOM型XSS要更加方便一些,同時,這種類型的漏洞通常對攻擊者更有利。

在這篇文章中,不僅解釋了為什麼要向開發者演示黑客攻擊,同時,還講解了如何炫酷的演示針對OWASP Juice Shop的DOM型XSS漏洞的攻擊過程。這個過程中,需要用到一個惡意伺服器,為了節約讀者的時間,這裡提供了現成的代碼和示例伺服器。在這個攻擊場景中,攻擊者將利用惡意伺服器竊取受害者的cookie,並從中獲取受害者的密碼。

關於XSS

本節內容適合不熟悉XSS的讀者,對於已經熟悉該漏洞的讀者,可以跳過。

簡單來說,利用XSS漏洞,攻擊者可以讓自己的JavaScript代碼在別人的網站上執行,特別是從一個或多個受害者用戶瀏覽器中執行。

據我所知,最著名的XSS攻擊當屬MySpace蠕蟲「Samy is my Hero」。當年,Samy Kamkar在MySpace上創建了一個腳本,該腳本不僅會迫使所有訪問其個人頁面的人加他為好友,還會在其個人頁面的 "我的英雄" 分類下加上一句話:"but most of all, samy is my hero",並將該腳本複製到受害者的MySpace個人資料中。不到20個小時,就有100萬個用戶請求加Samy為好友。

Samy蠕蟲是持久型XSS,這意味著該腳本將永久存儲在資料庫中。持久型XSS漏洞是最糟糕的,因為所有訪問該站點的MySpace用戶都會被感染。

除了持久型XSS之外,還有反射型和DOM型XSS漏洞,在本文中,我們將對這兩種類型的漏洞進行深入的分析。由於這兩種類型的漏洞需要設法哄騙受害者通過點擊來觸發漏洞(即社會工程),所以,在危險性方面它們要弱一些,然而,就像大家將要看到的那樣,一旦受到它們的攻擊,後果將會非常嚴重。到目前為止,我沒有見過關於兩者的嚴重程度的比較,不過在我來看,DOM型XSS的危害要比反射型XSS更大一些。

DOM型XSS與反射型XSS

讓我們從Altoro Mutual網站開始吧。您可以在搜索欄中鍵入一個腳本,例如在起始和結束<script>標籤中插入alert(「hello」) ,如下所示:

當您點擊回車鍵時,該腳本將會執行(反射型XSS),這時會看到:

但是,您也可能看不到彈出的內容。例如,如果在公司環境中,那麼公司代理可能會阻止該腳本的運行。如果您使用的是Chrome,則可能會發現Chrome會將其屏蔽(請參見下面的截圖)。這兩種情況都有相應的解決辦法,但如果該漏洞只在特殊情況下才有效的話,這個漏洞的嚴重性就會明顯降低。

現在讓我們嘗試一下OWASP Juice Shop中的XSS漏洞。在搜索欄中輸入腳本:

按回車鍵後,就會看(DOM型XSS):

在我的實驗過程中,公司代理和Chrome都沒有阻止它,說明這個漏洞非常嚴重。

深入考察

首先,讓我們來確認一下Altoro Mutual漏洞是否為反射型XSS、OWASP Juice Shop的漏洞是不是DOM型XSS。為此,可以利用代理來截取相應的流量。對於Altoro Mutual,截取的數據如下所示:

我們看到,搜索欄中輸入的腳本作為html的一部分反射了回來。

現在,看看從Juice Shop那裡截取的數據:

從這裡可以看到,輸入的內容並沒有反射回來。

現在,我們進一步深入考察。如果打開瀏覽器開發工具,會發現搜索值是通過客戶端JavaScript放入html中的。Juice Shop網站默認的html代碼裡面有一個輸入表單,其中包含:

ng-model="searchQuery"

ng-model是AngularJS的功能。默認情況下,AngularJS會對相關的內容進行轉義來防止XSS,除非您以一種令人無語的方式來編寫JavaScript代碼,就像Juice Shop故意為之的那樣:

r.searchQuery = t.trustAsHtml(e.search().q)

trustAsHtml是一種Angular方法,它不會進行默認的轉義處理。

企業代理和瀏覽器(Firefox除外)可以通過檢查發送的字元串是否包含腳本並查看是否返回完全相同的字元串來輕鬆阻止反射型XSS,以此阻止黑客的入侵。

但是這種保護措施對DOM型XSS來說不起作用,因為這種攻擊完全發生在瀏覽器中,所以公司代理也愛莫能助。同時,與反射型XSS相比,瀏覽器在阻止DOM型XSS方面要困難得多。

DOM型XSS漏洞的利用場景

雖然可以向開發人員和商業人士苦口婆心地解釋XSS的危險,但沒有什麼比真正的身臨其境更令人信服了,而OWASP的Juice Shop則為我們提供了一個完美的例子。在我們的演示中,需要用到一個惡意伺服器。我為您創建了一個惡意伺服器,讀者只要花費幾分鐘就可以將其部署到Heroku上,讀者可以通過這個鏈接下載。為了省勁,也可以使用我的臨時伺服器(稍後將關閉)。

在我們的演示中,假設用戶已經登錄OWASP Juice Shop網站。隨後,用戶訪問惡意網站,其中有一個惡意鏈接,誘騙用戶說,如果點擊該鏈接,則會提供免費果汁。實際上,只要用戶點擊該鏈接,就會觸發一個XSS,從而將其cookie發送到惡意伺服器上的「/recorddata」端點。這樣的話,攻擊者就可以通過「/dumpdata」端點來顯示捕獲的cookie了。在這些cookie中包含JWT,其中存放的是用戶密碼的MD5哈希值(非常愚蠢的設計,但在現實的代碼中,我還見過更糟糕的設計)。利用Google dorking,可以通過MD5哈希值恢復出受害者的密碼。

首先打開OWASP Juice Shop網站並點擊登錄。然後,從彈出的頁面下部註冊賬號,具體請參見下圖:

然後,創建受害者用戶的帳戶:

接下來,用受害者賬戶登錄:

一切都很正常,直到受害者發現OWASP的Juice Shop網站正在贈送免費果汁,那還等什麼,趕緊去搶啊(對於我們的臨時部署來說,該鏈接為:frozen-crag-69213.herokuapp.com):

點擊鏈接後,將觸發DOM型XSS漏洞。對於非技術用戶來說,可能不知道當前已經執行了一個來自惡意站點的腳本。事實上,在這種情況下,腳本已經將受害者的cookie取出並發送到惡意網站。該惡意網站有一個「/recorddata」端點,用於將cookie記錄到一個臨時文件中(更正規的做法是使用資料庫)。

我們的惡意伺服器還有一個「/dumpdata」端點,用於顯示所有捕獲的cookie。

Cookie內部有一個JWT。現在,讓我們將該JWT複製到剪貼板中:

現在,導航至jwt.io網站,我們可以將令牌粘貼到這裡,並對其進行解碼:

天哪,用戶名和密碼都在Cookie中。但這裡並非真正的密碼,那咋整?請教谷歌大神:

點擊第一個鏈接,我們發現它是密碼的MD5哈希值。真正的密碼顯示在下面鏈接中:

總結

我發現,與給他們講解無聊的編碼準則相比,開發人員更樂於理解安全漏洞並考察這些漏洞的實際利用場景。一旦他們意識到了這些安全問題,他們就能找到正確的編碼方法。要知道,開發人員非常善於利用Google來理解他們面臨的問題,並找到相應的解決方案。

OWASP Juice Shop是展示安全漏洞的絕佳網站,只是在某些情況下,您需要添加自己的「零部件」才能完成演示。在本文中,我們提供了一個惡意伺服器,當用戶點擊鏈接時,它會發動DOM型XSS攻擊,攻擊者可以藉此獲得受害者的密碼。根據我們的經驗,在演示XSS漏洞的利用過程時候,Juice Shop站點的DOM型XSS,要比Altoro Mutual站點的反射型XSS方便得多了。

對於那些習慣於利用CVSS評估安全漏洞的人來說,其中包括一個攻擊複雜度參數,用於表示攻擊是否需要特殊條件才能成功。對於反射型XSS,上面提到了兩個特殊條件:受害者的瀏覽器沒有提供相應的防禦措施(然而,大多數瀏覽器都會阻止該攻擊),受害者需要處於不會攔截該攻擊的環境中。對於DOM型XSS,看起來沒有特殊要求(瀏覽器不會阻止DOM型XSS攻擊,並且該攻擊與環境無關)。因此,對於攻擊者來說,DOM型XSS漏洞比反射型XSS更易於利用,因此,DOM型XSS漏洞的危害性要大於反射型XSS漏洞,但是,低於持久型XSS漏洞的危害性。

本文翻譯自:littlemaninmyhead.wordpress.com如若轉載,請註明原文地址: 4hou.com/technology/122 更多內容請關注「嘶吼專業版」——Pro4hou

推薦閱讀:

一萬塊錢買回的客戶通訊錄和辦信用卡的尷尬
挖洞過程中碰到死結/死循環時,該怎麼辦?
曾入侵CIA和FBI的黑客組織「Crackas With Attitude」成員獲刑5年
WPA3:四大安全新特性技術分析

TAG:信息安全 |