Clickjacking簡單介紹
0x00 相關背景介紹
Clickjacking(點選劫持)是由網際網路安全專家羅伯特·漢森和耶利米·格勞斯曼在2008年首創的。
是一種視覺欺騙手段,在web端就是iframe巢狀一個透明不可見的頁面,讓使用者在不知情的情況下,點選攻擊者想要欺騙使用者點選的位置。
由於點選劫持的出現,便出現了反frame巢狀的方式,因為點選劫持需要iframe巢狀頁面來攻擊。
下面程式碼是最常見的防止frame巢狀的例子:
if(top.location!=location)
top.location=self.location;
事實上,這種程式碼很容易被繞過,在後文中討論。
0x01 防禦的幾種方式
防止frame巢狀的js使用程式碼由高到低比例:
if (top != self)
if (top.location != self.location)
if (top.location != location)
if (parent.frames.length > 0)
if (window != top)
if (window.top !== window.self)
if (window.self != window.top)
if (parent && parent != window)
if (parent && parent.frames && parent.frames.length>0)
if((self.parent&&!(self.parent===self))&&(self.parent.frames.length!=0))
檢測到後的處理方案:
top.location = self.location
top.location.href = document.location.href
top.location.href = self.location.href
top.location.replace(self.location)
top.location.href = window.location.href
top.location.replace(document.location)
top.location.href = window.location.href
top.location.href = "URL"
document.write('')
top.location = location
top.location.replace(document.location)
top.location.replace('URL')
top.location.href = document.location
top.location.replace(window.location.href)
top.location.href = location.href
self.parent.location = document.location
parent.location.href = self.document.location
top.location.href = self.location
top.location = window.location
top.location.replace(window.location.pathname)
window.top.location = window.self.location
setTimeout(function(){document.body.innerHTML='';},1);
window.self.onload = function(evt){document.body.innerHTML='';}
var url = window.location.href; top.location.replace(url)
0x02 繞過的幾種方式
對於使用parent.location來防禦的可以使用多層巢狀的方式繞過。
一、例如防禦程式碼為:
if(top.location!=self.location){
parent.location = self.location;
}
建立兩個頁面:
1.html程式碼為:
<iframe src="2.html">
2.html程式碼為:
<iframe src="http://www.victim.com">
訪問1.html之後可以看到頁面並無跳轉等動作。
二、onBeforeUnload函式的利用:
onBeforeUnload的介紹以及各種瀏覽器的支援情況請見:
http://w3help.org/zh-cn/causes/BX2047
如下的防禦程式碼:
if(top != self) top.location.replace(location);
新建立頁面,程式碼如下:
<script>
var framekiller = true;
window.onbeforeunload = function() { if(framekiller) { return
"Write something here to keep people stay!";} };
</script>
<iframe src="http://www.victim.com/">
開啟頁面顯示如下:
欺騙使用者點選留在此頁後顯示:
三、XSS filter的利用
IE8以上以及Chrome瀏覽器都有XSS篩選器,這些可以用來對付防禦frame巢狀的程式碼。
防禦程式碼如下:
if(top!=self){
top.location=self.location;
}
新建立頁面,程式碼如下:
<iframe src="http://www.victim.com/?<script>">
訪問後頁面顯示:
IE的xss篩選器自動攔截了跳轉。
史丹佛的文章裡寫了Chrome也會出現這種情況,並給出了攻擊程式碼:
<iframe src=http://www.victim.com/?v=if(top+!%3D+self)+%7B+top.location%3Dself.location%3B+%7D">
但是測試發現,新版的Chrome並不會攔截了,會直接跳轉過去。
如果跟的引數中有變數在頁面中顯示的,會把變數過濾一遍再輸出,但不會阻止跳轉。
四、Referer檢查的問題
有一些站點允許自己的域名巢狀自己,禁止外站對自己的巢狀。
通常是用document.referer來檢測來源是否為自己的域名。
if(top.location!=location){
if(document.referrer && document.referrer.indexOf("aaa.com")==1)
{
top.location.replace(document.location.href);
}
}
判斷字串中是否含有本域名是常見的錯誤用法,利用二級域名的方式便可繞過,如:
http://aaa.com.bbb.com
注:從https域下post資料到http域的時候,瀏覽器不帶Referer。
IE有個屬性可以設定security為restricted可以禁止iframe裡執行js指令碼,但是要達到點選劫持的效果,必須要能夠執行js所以很雞肋。
程式碼如下:
<iframe src="http://www.victim.com/iframe.html" security="restricted"></iframe>
重點是手機站點,很多主站做的很不錯,但是手機站點沒有做任何防護,很容易造成點選劫持。
五、location劫持
在IE瀏覽器中,如果能夠在防禦程式碼的前面可以插入form表單的話,可以利用form表單對location進行劫持。
<form name=self location="javascript:alert(1)"></form>
<script>
if(top!=self){
top.location=self.location
}
</script>
用iframe巢狀此程式碼,可以看到沒有跳轉,執行了alert(1)。
相關案例: WooYun: 騰訊微博clickhijacking(不要被你的雙眼欺騙) WooYun: 新浪微博遭受clickhijacking攻擊(已經有大量案例)
0x03 推薦防禦的方法:
一、X-FRAME-OPTIONS
X-FRAME-OPTIONS是微軟提出的一個http頭,專門用來防禦利用iframe巢狀的點選劫持攻擊。
並且在IE8、Firefox3.6、Chrome4以上的版本均能很好的支援。
這個頭有三個值:
DENY // 拒絕任何域載入
SAMEORIGIN // 允許同源域下載入
ALLOW-FROM // 可以定義允許frame載入的頁面地址
php中設定示例:
header ( "X-FRAME-OPTIONS:DENY");
二、目前最好的js的防禦方案為:
<head>
<style> body { display : none;} </style>
</head>
<body>
<script>
if (self == top) {
var theBody = document.getElementsByTagName('body')[0];
theBody.style.display = "block";
} else {
top.location = self.location;
}
</script>
相關文章
- Map簡單介紹2021-10-25
- SVG簡單介紹2019-08-06SVG
- 【Pandas】簡單介紹2020-11-14
- ActiveMQ簡單介紹2020-12-17MQ
- JSON簡單介紹2020-12-06JSON
- RPC簡單介紹2019-03-03RPC
- Python簡單介紹2018-08-09Python
- KVM簡單介紹2018-09-21
- RMI簡單介紹2018-08-16
- HTML簡單介紹2018-07-17HTML
- HTML 簡單介紹2018-05-26HTML
- JavaScript 簡單介紹2018-05-22JavaScript
- CSS 簡單介紹2018-05-24CSS
- ajax簡單介紹2018-08-31
- AOP的簡單介紹2021-10-18
- 簡單介紹克隆 JavaScript2021-11-13JavaScript
- 禪道簡單介紹2020-10-20
- Apache Curator簡單介紹2021-09-09Apache
- spark簡單介紹(一)2021-09-09Spark
- Flutter key簡單介紹2021-08-23Flutter
- Ansible(1)- 簡單介紹2021-04-25
- Webpack 的簡單介紹2019-01-30Web
- Git_簡單介紹2018-09-06Git
- jQuery Validate簡單介紹2018-08-26jQuery
- JSON物件簡單介紹2018-07-28JSON物件
- <svg>元素簡單介紹2018-08-10SVG
- 簡單介紹 ldd 命令2018-03-12
- Flownet 介紹 及光流的簡單介紹2018-11-15
- form表單的簡單介紹2020-10-18ORM
- mt19937 簡單介紹2024-03-30
- mitmproxy中libmproxy簡單介紹2020-08-19MITIBM
- 函子的簡單介紹2020-11-08
- 元學習簡單介紹2020-10-06
- 簡單介紹JavaScript閉包2020-05-18JavaScript
- 檔案管理簡單介紹2021-03-02
- 簡單介紹靜態路由2021-01-04路由
- canvas標籤簡單介紹2018-09-07Canvas
- Git發展簡單介紹2018-07-08Git