利用CSS注入(無iFrames)竊取CSRF令牌
CSS相信大家不會陌生,在百度百科中它的解釋是一種用來表現HTML(標準通用標記語言的一個應用)或XML(標準通用標記語言的一個子集)等檔案樣式的計算機語言。那麼,它僅僅只是一種用來表示樣式的語言嗎?當然不是!其實早在幾年前,CSS就已被安全研究人員運用於滲透測試當中。這裡有一篇文章就為我們詳細介紹了一種,使用屬性選擇器和iFrame,並通過CSS注入來竊取敏感資料的方法。但由於該方法需要iFrame,而大多數主流站點都不允許該操作,因此這種攻擊方法並不實用。
這裡我將為大家詳細介紹一種不需要iframe且只需10秒,就能為我們有效地竊取CSRF token的方法
一旦使用者的CSRF token被竊取,由於受害者已經在攻擊者的網站上,因此攻擊者可以繼續攻擊並完成對使用者的CSRF攻擊操作。
背景
正如原文所描述的那樣,CSS屬性選擇器開發者可以根據屬性標籤的值匹配子字串來選擇元素。 這些屬性值選擇器可以做以下操作:
- 如果字串以子字串開頭,則匹配
- 如果字串以子字串結尾,則匹配
- 如果字串在任何地方包含子字串,則匹配
屬性選擇器能讓開發人員查詢單個屬性的頁面HTML標記,並且匹配它們的值。一個實際的用例是將以“https://example.com”開頭的所有href屬性變為某種特定的顏色。
而在實際環境中,一些敏感資訊會被存放在HTML標籤內。在大多數情況下CSRF token都是以這種方式被儲存的:即隱藏表單的屬性值中。
這使得我們可以將CSS選擇器與表單中的屬性進行匹配,並根據表單是否與起始字串匹配,載入一個外部資源,例如背景圖片,來嘗試猜測屬性的起始字母。
通過這種方式,攻擊者可以進行逐字猜解並最終獲取到完整的敏感數值。
想要解決這個問題受害者可以在其伺服器實施內容安全策略(CSP),防止攻擊者從外部載入CSS程式碼。
無iFrames
要做到無iFrame,我將使用一種類似於之前我討論過的方法:我將建立一個彈窗,然後在設定計時器後更改彈出視窗的位置。
使用這種方法,我仍然可以載入受害者的CSS,但我不再依賴於受害者是否允許iFrame。因為最初的彈出是通過使用者事件觸發的,所以我並沒有被瀏覽器阻止。
為了強制過載,我在CSS注入間彈出一個虛擬視窗,如下:
var win2 = window.open(`https://security.love/anything`, `f`, "top=100000,left=100000,menubar=1,resizable=1,width=1,height=1")
var win2 = window.open(`https://security.love/cssInjection/victim.html?injection=${css}`, `f`, "top=100000,left=100000,menubar=1,resizable=1,width=1,height=1")
沒有後端伺服器
在CureSec的文章中描述了將資料傳輸到後端伺服器,但由於CSRF是針對客戶端的攻擊,因此如果我們能想出一種不需要伺服器的方法,那麼就可以為我們節省大量的開銷和簡化我們的操作。
為了接收受害者客戶端載入資源,我們可以利用Service Workers來攔截和讀取請求資料。Service Workers目前只適用於同源請求,在我的演示中受害者和攻擊者頁面已處於同一源上。
不過不久後,chrome很可能會合並這個實驗性的功能,允許Service Workers攔截跨域請求。
這樣,就可以確保我們在客戶端的攻擊100%的執行,並強制使用者在10秒內點選連結執行CSRF攻擊,演示如下:
Demo
如上所述,因為我並不想執行一個web伺服器,所以我使用service workers攔截和模擬伺服器端元件。目前,該演示只適用於Chrome瀏覽器。
首先,我建立了一個易受攻擊的目標,它存在一個基於DOM的CSS注入漏洞,並在頁面放置了一個敏感token。我還對指令碼標籤新增了一些保護措施,對左尖括號和右尖括號進行了編碼。
<form action="https://security.love" id="sensitiveForm">
<input type="hidden" id="secret" name="secret" value="dJ7cwON4BMyQi3Nrq26i">
</form>
<script src="mockingTheBackend.js"></script>
<script>
var fragment = decodeURIComponent(window.location.href.split("?injection=")[1]);
var htmlEncode = fragment.replace(/</g,"<").replace(/>/g,">");
document.write("<style>" + htmlEncode + "</style>");
</script>
接下來,我們將強制載入受害者的CSS,並且使用上述方法,可一次竊取(猜解)一個敏感字元。
在接收端,我已經定義了一個攔截請求的service worker,並通過post-message將它們傳送回域,然後我們將token儲存在本地儲存中以供後續使用。你也可以想象一個後端Web伺服器,通過Web套接字或輪詢將CSRF token回發給攻擊者域。
目前該測試僅支援CHROME:
如果你的瀏覽器支援的話,只需點選開啟頁面任意位置,你將看到CSRF token將逐一被猜解出來。
結語
有趣的是,反射型CSS注入實際上比儲存型CSS注入更致命,因為儲存型CSS注入需要一個伺服器在受害者渲染之前來更新CSS。
一段時間以來,CSS注入在嚴重程度上來回變化。過去IE瀏覽器是允許使用者在CSS中執行Javascript程式碼的。這個演示也從某種程度上表明瞭CSS注入,以及在你的域上渲染不受信任的CSS仍會導致嚴重的安全問題。
相關文章
- Metasploit之令牌竊取
- Windows令牌竊取提權和爛土豆提權學習Windows
- GitHub:黑客竊取 OAuth 令牌攻擊了數十家公司!Github黑客OAuth
- iOS逆向(4)-程式碼注入,非越獄竊取微信密碼iOS密碼
- 利用insert,update和delete注入獲取資料delete
- Web安全攻防(一)XSS注入和CSRFWeb
- CSRF, XSS, Sql注入原理和處理方案SQL
- 黑客利用“Simjacker”漏洞竊取手機資料,或影響十億人黑客
- AgentTesla病毒解析:利用釣魚郵件竊取終端隱私資料
- 黑客技術—QQ竊取黑客
- 黑客向熱門JavaScript庫注入惡意程式碼 竊取Copay錢包的比特幣黑客JavaScript比特幣
- 盜號木馬瘋狂竊取遊戲幣,竟還利用搜尋引擎打廣告?!遊戲
- 駭客利用Firefox惡意擴充套件竊取Gmail和瀏覽器資料Firefox套件AI瀏覽器
- 密碼是如何被竊取的密碼
- 黑客第三次攻擊Cream Finance 利用程式碼漏洞竊取1.3億美元黑客NaN
- Coinbase智慧合約被曝漏洞,使用者可無限量竊取以太幣
- csrf
- XSS 從 PDF 中竊取資料
- [翻譯]利用程式碼注入脫殼
- JWT 令牌JWT
- DedeCMS v5.7 通過檔案包含和CSRF的配合利用
- 竊取加密貨幣的新型木馬:InnfiRAT加密
- 蘋果開發者中心被黑:開發者資訊或被竊取蘋果
- 加密技術解決資料被竊取加密
- Python Django進階教程(六)(快取機制,CSRF)PythonDjango快取
- Vue3 style CSS 變數注入VueCSS變數
- CSRF(原理)
- 竊取終端資料成本低,謹防Formbook惡意軟體入侵竊密ORM
- 安全令牌JWTJWT
- 如何有效防止網站資料被竊取、篡改?網站
- 後臺 daemon 非法竊取使用者 iTunesstore 資訊
- LLM-文心一言:執行緒竊取執行緒
- 瞞天過海:某APT組織利用魚叉郵件滲透多個行業竊取敏感資料APT行業
- 無需hacking,新的WiKI-Eve攻擊能夠透過WiFi竊取數字密碼WiFi密碼
- 【譯】利用.LESS來提高CSSCSS
- 前端安全 - CSRF前端
- csrf問題
- CSRF 攻擊