天天看點

web安全(3)-- ClickJacking(點選劫持)

“Clickjacking(點選劫持)是由網際網路安全專家羅伯特·漢森和耶利米·格勞斯曼在2008年提出的。是一種視覺欺騙手段,在web端就是iframe嵌套一個透明不可見的頁面,讓使用者在不知情的情況下,點選攻擊者想要欺騙使用者點選的位置。”

假設你通路一個web站點并看到如下的頁面:

web安全(3)-- ClickJacking(點選劫持)

免費的午餐誰都喜歡,當你滿懷期待的點選按鈕“WIN”的時候,恭喜你,你已經被點選劫持了。你實際點選的連結如下:

web安全(3)-- ClickJacking(點選劫持)

這是登入網上銀行之後的一個轉賬連結,轉移你的全部資産給Kim Dotcom先生。但是你根本你沒有看到這個頁面,像做夢一樣。這隻是一個簡單的示例,實作上在網上銀行轉賬不會這麼簡單,但是卻告訴我們一個道理,通路網頁和看魔術表演一樣,看到的不一定都是真的。

下面我們具體讨論下點選劫持的内部機制,和防禦措施。

1.1點選劫持(clickjacking attacks)

點選劫持的表象一般是使用者點選了頁面的A元素,但是實際上接收點選事件的卻是另外一個元素。

現在改變下頁面内個元素的透明度,再來看下剛才的頁面。

web安全(3)-- ClickJacking(點選劫持)

我們可以看到,在ipad頁面是上部還有個層,實際上是一個iframe,現在的透明度為50%,實際的頁面中它的透明度為0%,雖然被隐藏不可見,但是随時都可以被激活。

在 Firefox的3D視圖下,觀察這個頁面更明顯。

web安全(3)-- ClickJacking(點選劫持)

被隐藏的iframe在IPAD頁面的上部,同時轉款的連結正好在“WIN”的上方,因為設定了透明度,使用者隻能看到“WIN”,但實際點選的是轉款。

攻擊者的頁面内容可能是這樣的:

<div style="position: absolute; left: 10px; top: 10px;">
  Hey - we're giving away iPad minis!!! Just click the WIN button and it's yours!!!
</div>
<div style="position: absolute; left: 200px; top: 50px;">
  <img src="http://images.apple.com/my/ipad-mini/overview/images/hero.jpg" width="250">
</div>
<div style="position: absolute; left: 10px; top: 101px; color: red; font-weight: bold;">>> WIN <<</div>
<iframe style="opacity: 0;" height="545" width="680" scrolling="no" src="http://mybank/Transfer.aspx"></iframe>
           

代碼就是這麼簡單,下面我們觀察一下點選“WIN”時實際上點選“轉款”連結時的http請求資訊。

web安全(3)-- ClickJacking(點選劫持)

從圖中标記的地方,可以看到請求的實際位址和身份驗證的cookie資訊。當然這樣的攻擊能成功,在于使用者已經登入的網上銀行。這樣的攻擊行為和跨站請求僞造很類似。

下面我們讨論下針對點選劫持的基本防禦方法。

1.2 Frame busting

這是在頁面上通過腳本(JS)來防止點選劫持或者iframe惡意請求的方式,本文不做介紹,詳見http://seclab.stanford.edu/websec/framebusting/framebust.pdf,烏雲有篇類似的中文文章共參考http://drops.wooyun.org/papers/104。

frame busting是指利用js判斷location以防止網頁被别人iframe内嵌的一個實作 。

<script>
if(top!=window){
  top.location=window.location
}
</script>
           

但是可以通過onbeforeunload事件來阻止這種跳轉。

<script>
window.οnbefοreunlοad=function(){
  window.onbeforeunload  = null;
  return "Maybe you want to leave the page, before you become rich?"
}
</script>
           

參考:http://javascript.info/tutorial/clickjacking

1.3 The X-Frame-Options

X-Frame-Options HTTP 響應頭,可以訓示浏覽器是否應該加載一個iframe中的頁面。網站可以通過設定X-Frame-Options阻止站點内的頁面被其他頁面嵌入進而防止點選劫持。

1.3.1 X-Frame-Options

X-Frame-Options共有三個值:

DENY

任何頁面都不能被嵌入到iframe或者frame中。

SAMEORIGIN

頁面隻能被本站頁面嵌入到iframe或者frame中。

ALLOW-FROM Uri

頁面自能被指定的Uri嵌入到iframe或frame中。

1.3.2 Apache配置X-Frame-Options

在站點配置檔案httpd.conf中添加如下配置,限制隻有站點内的頁面才可以嵌入iframe。

Header always append X-Frame-Options SAMEORIGIN

配置之後重新開機apache使其生效。該配置方式對IBM HTTP Server同樣适用。

如果同一apache伺服器上有多個站點,隻想針對一個站點進行配置,可以修改.htaccess檔案,添加如下内容:

Header append X-FRAME-OPTIONS "SAMEORIGIN"

1.3.3 Nginx 配置X-Frame-Options

到 nginx/conf檔案夾下,修改nginx.conf ,添加如下内容:

add_header X-Frame-Options "SAMEORIGIN";

web安全(3)-- ClickJacking(點選劫持)

重新開機Nginx服務。

1.3.4 IIS配置X-Frame-Options

在web站點的web.config中配置:

<system.webServer>
  ...
  <httpProtocol>
    <customHeaders>
      <add name="X-Frame-Options" value="SAMEORIGIN" />
    </customHeaders>
  </httpProtocol>
  ...
</system.webServer>
           

1.3.5 結果

在 Firefox 嘗試加載 frame 的内容時,如果 X-Frame-Options 響應頭設定為禁止通路了,那麼 Firefox 會用 about:blank 展現到 frame 中。也許從某種方面來講的話,展示為錯誤消息會更好一點。

1.4 浏覽器相容性

桌面浏覽器:

特性 Chrome Firefox (Gecko) Internet Explorer Opera Safari
基礎支援 4.1.249.1042 3.6.9 (1.9.2.9) 8.0 10.5 4.0
ALLOW-FROM 支援 Not supported 18.0 (18.0) bug 690168 8.0? ? Not supported WebKit bug 94836
特性 Android Chrome Android 版 Firefox 移動版 (Gecko) IE 移動版 Opera 移動版 Safari 移動版
基礎支援 ? ? ? ? ? ?

參考:http://www.cnblogs.com/xuanhun/p/3610981.html?utm_source=tuicool&utm_medium=referral

繼續閱讀