【技術分享】梨子帶你刷burpsuite官方網絡安全學院靶場(練兵場)系列之客戶端漏洞篇 - 點擊劫持專題
本系列介紹
PortSwigger是信息安全從業者必備工具burpsuite的發行商,作為網絡空間安全的領導者,他們為信息安全初學者提供了一個在線的網絡安全學院(也稱練兵場),在講解相關漏洞的同時還配套了相關的在線靶場供初學者練習,本系列旨在以梨子這個初學者視角出發對學習該學院內容及靶場練習進行全程記錄并為其他初學者提供學習參考,希望能對初學者們有所幫助。
客戶端漏洞篇介紹
相對于服務器端漏洞篇,客戶端漏洞篇會更加復雜,需要在我們之前學過的服務器篇的基礎上去利用。
客戶端漏洞篇-點擊劫持專題
什么是點擊劫持?
點擊劫持,就是誘導受害者點擊頁面上透明的按鈕或鏈接以發送一些惡意的請求。我們生活中就會遇到很多點擊劫持,比如彈窗廣告之類的。這是通過iframe技術在頁面的最上層設置一個透明的按鈕或鏈接,當用戶誤以為是點擊頁面上的按鈕或鏈接時其實是點擊的透明的按鈕或鏈接,就神不知鬼不覺地觸發了某些惡意請求。它和CSRF的區別就是,點擊劫持是一定要受害者點擊才會觸發的。而且CSRF Token不能用于抵御點擊劫持攻擊,因為畢竟是受害者主動點擊導致發送的請求。
如何構造基礎的點擊劫持攻擊?
點擊劫持利用css去創建和操作圖層,然后再利用iframe將惡意鏈接或按鈕覆蓋在頁面最上層。例如
<head> <style> #target_website { position:relative; width:128px; height:128px; opacity:0.00001; z-index:2; } #decoy_website { position:absolute; width:300px; height:400px; z-index:1; }style>head>...<body> <div id="decoy_website"> ...decoy web content here... div> <iframe id="target_website" src="https://vulnerable-website.com"> iframe>body>
我們通過css讓iframe層在原本頁面層的上面,然后調整位置與頁面中的誘導物重合,為了避免透明度檢測,所以透明度設置了盡可能地最低。
配套靶場:使用CSRF Token防護的基礎點擊劫持
因為點擊劫持不管怎么看都是由用戶真實發出的請求,所以CSRF Token對于點擊劫持是沒有防護效果的。點擊劫持的重點就是要對準,因為梨子使用的是Firefox Deleoper版,有一個標尺工具可以讓我們精準地獲取按鈕的位置。

得到準確的尺寸以后我們就可以構造payload了

然后將其存儲到Exploit Server,當受害者接收到投放的頁面以后就會因為點擊劫持刪除指定用戶,這里要注意的是,千萬不要自己點,因為刪除操作只能執行一次,如果誤刪了,要等當前的靶場環境過期了才能再次開啟靶場,而且靶場過期的時間是大約20分鐘,burp并沒有給出具體過期時間,這將是非常漫長的等待。

使用預填充表單輸入的點擊劫持
有的站點允許通過GET參數的方式預填充表單,而不需要用戶再手動輸入,搭配上點擊劫持就會當用戶提交表單時提交預填充的表單。
配套靶場:使用從URL參數預填充的表單輸入數據的點擊劫持
這道靶場的利用方式與上面類似,只需要將iframe的src替換成帶有參數值的URL即可

這個位置和標準答案肯定會有出入的,需要不斷調,切記不要真的點擊,看看位置就好了

破壞框架腳本
從前面我們了解到,只要可以框架化的站點都可能遭受點擊劫持攻擊。所以我們需要編寫腳本去打破這些框架。可以通過JS附加組件或者擴展程序(如NoScript)實現。這些腳本需要實現下面功能。
- 檢查并強制將當前應用程序窗口設置為主窗口或頂級窗口
- 讓所有框架不透明化
- 阻止點擊透明的框架
- 攔截并標記潛在的點擊劫持攻擊位置
但是這種技術是特定于瀏覽器和平臺的,而且因為HTML比較靈活,攻擊者有很多方法來繞過。并且有的瀏覽器阻止運行破壞框架腳本或者不支持運行JS腳本。攻擊者采用HTML5的iframe沙箱屬性來繞過破壞框架腳本。
id</span>=<span class="code-snippet__string">"victim_website"</span> src=<span class="code-snippet__string">"https://victim-website.com"</span> sandbox=<span class="code-snippet__string">"allow-forms"</span>>
配套靶場:有破壞框架腳本的點擊劫持
我們在頁面中發現了一個破壞框架腳本

這個腳本會檢查該頁面是不是最頂層,如果不是就返回false。所以我們要利用前面提到的方法繞過這個腳本的檢測。

這樣我們又可以發動點擊劫持攻擊了。

結合點擊劫持和DOM XSS的攻擊
這是一種利用DOM XSS和iframe技術結合起來的攻擊方式。在iframe的點擊劫持中附加DOM XSS的payload,當受害者點擊時即可同時觸發DOM XSS。
配套靶場:利用點擊劫持漏洞觸發DOM XSS
我們要找一下有沒有相關DOM的操作,發現一個JS腳本(/resources/js/submitFeedback.js),我們看看里面有什么有價值的東西。

發現這里存在DOM XSS漏洞點,于是我們利用點擊劫持將DOM XSS payload預填充到name框中

這樣就可以利用點擊劫持觸發DOM XSS了

多重點擊劫持
有的時候,需要誘導用戶點擊多處隱藏的按鈕或者鏈接才能成功實現惡意的目的。下面我們通過一道靶場來講解。
配套靶場:多重點擊劫持
因為要點擊兩個地方才可以,所以我們的payload也是要設置兩個透明的按鈕

這兩個按鈕的位置也是要自己開啟標尺以后調的,非常方便。

如何緩解點擊劫持攻擊?
burp介紹了兩種從服務器端緩解點擊劫持攻擊的方法,具體能不能有效實施還要看瀏覽器層面。
X-Frame-Options
一開始這個標頭被用于IE8的非官方響應頭使用的,后面被各瀏覽器采用。我們通過設置值來限制框架化操作。例如
X-Frame-Options: deny
上面這條表示拒絕任何框架化操作,但是也可以限制框架化的來源為同源。
X-Frame-Options: sameorigin
也可以設置為指定源
X-Frame-Options: allow-from https://normal-website.com
如果將該響應頭與CSP結合使用,效果更佳。
內容安全策略(CSP)
XSS篇我們介紹過CSP,我們也可以使用CSP來緩解點擊劫持攻擊。例如
Content-Security-Policy: frame-ancestors 'self';
這條與X-Frame-Options: sameorigin效果類似,也可以設置為指定源。
Content-Security-Policy: frame-ancestors normal-website.com;