點擊劫持(clickjacking)又稱為界面偽裝攻擊 (UI redress attack)是一種在網頁中將惡意代碼等隱藏在看似無害的內容(如按鈕)之下或者將透明的iframe覆蓋在一個正常的網頁上,並誘使用戶點擊的手段。也可以與 XSS 和 CSRF 攻擊相結合,突破傳統的防御措施,提升漏洞的危害程度。
攻擊原理
攻擊者實施攻擊的一般步驟是:
- 黑客創建一個網頁利用iframe包含目標網站;
- 隱藏目標網站,使用戶無法察覺到目標網站存在;
- 構造網頁,誘騙用戶點擊特定按鈕 (圖1中的PLAY!按鈕);
- 用戶在不知情的情況下點擊按鈕,觸發執行惡意網頁的命令。
防御方法
服務端防御
X-FRAME-OPTIONS 機制
X-FRAME-OPTIONS是微軟提出的一個http頭,專門用來防御利用iframe嵌套的點擊劫持攻擊。並且在IE8、Firefox3.6、Chrome4以上的版本均能很好的支持。這個頭有三個值:
- DENY // 拒絕任何域加載
- SAMEORIGIN // 允許同源域下加載
- ALLOW-FROM // 可以定義允許frame加載的頁面地址
如果瀏覽器使用了這個安全機制,在網站發現可疑行為時,會提示用戶正在瀏覽 網頁存在安全隱患,並建議用戶在新窗口中打開。這樣攻擊者就無法通過 iframe 隱藏目標的網頁。
例如github添加了這個頭並且設置為deny,因此不能被嵌套到其他iframe中。
而百度沒加,因此能被嵌套到其他iframe中。
stackoverflow加入了X-Frame-Options : SAMEORIGIN,以stackoverflow為例,在測試頁面中用iframe嵌入stackoverflow:
<iframe src ="http://stackoverflow.com/"></ iframe>
打開這個頁面,得到下面錯誤:
Java中設置x-frame-options:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
//必須
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
//實際設置
response.setHeader("x-frame-options", "SAMEORIGIN");
//調用下一個過濾器(這是過濾器工作原理,不用動)
chain.doFilter(request, response);
}
Nginx配置:
add_header X-Frame-Options SAMEORIGIN
Apache配置:
Header always append X-Frame-Options SAMEORIGIN
使用 FrameBusting 代碼
使用 JavaScript 腳本阻止惡意網站載入網頁。如果檢測到網頁被非法網頁載入,就執行自動跳轉功能。Frame Busting代碼是一種有效防御網站被攻擊者惡意載入的方法,網站開發人員使用Frame Busting代碼阻止頁面被非法載入。
使用認證碼認證用戶
點擊劫持漏洞通過偽造網站界面進行攻擊,網站開發人員可以通過認證碼識別用戶,確定是用戶發出的點擊命令才執行相應操作。識別用戶的方法中最有效的方法是認證碼認證。例如,在網站上廣泛存在的發帖認證碼,要求用戶輸入圖形中的字符,輸入某些圖形的特征等。
客戶端防御
升級瀏覽器
最新版本的瀏覽器提供很多防御點擊劫持漏洞的安全機制,對於普通的互聯網用戶,經常更新修復瀏覽器的安全漏洞,能夠最有效的防止惡意攻擊。
NoScript 擴展
對於Firefox的用戶,使用 NoScript 擴展能夠在一定程度上檢測和阻止點擊劫持攻擊。利用 NoScript 中 ClearClick 組件能夠檢測和警告潛在的點擊劫持攻擊,自動檢測頁面中可能不安全的頁面。