关于 hunt-clickjacking
用于评估网页点击劫持风险的安全技能。它不把缺少防护响应头直接视为漏洞,而是要求在真实浏览器中证明跨站框架内的敏感操作确实可行。
主要功能
- 01检查 X-Frame-Options 和 CSP 框架指令
- 02在真实浏览器中测试页面嵌入
- 03验证跨站登录状态与操作
- 04排除只读页面和误报
适用场景
- 01评估转账和结账页面
- 02审查账户及管理操作
- 03验证 OAuth 授权对话框
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ elementalsouls/ claude-bughunter --skill hunt-clickjacking安装后在 Claude Code 中输入/hunt-clickjacking确认已加载。
详细介绍
什么是点击劫持
点击劫持(UI 重整)允许攻击者在恶意网站上通过透明 iframe 加载目标页面。受害者看到的是攻击者的诱饵界面,点击的却是其下方隐藏的目标界面。目标页面无需运行任何 JavaScript。
价值最高的目标:
- 登录/身份验证页面——使用攻击者的凭据强制登录
- 转账/结账/“确认付款”按钮
- 账户设置(更改邮箱、更改密码、禁用 2FA)
- OAuth/社交登录“授权应用”确认对话框
- 管理员操作(删除、提升用户权限、更改角色)
防护响应头
有两种机制可以阻止页面被嵌入框架:
X-Frame-Options: DENY # strongest — blocks all framing
X-Frame-Options: SAMEORIGIN # allows same-origin frames only
Content-Security-Policy: frame-ancestors 'none' # CSP equivalent of DENY
Content-Security-Policy: frame-ancestors 'self' # CSP equivalent of SAMEORIGIN
如果两者都不存在,任何来源都可以将该页面嵌入框架。
如何测试
缺少响应头是开始调查的触发条件,而不是发现本身。分两步进行:
步骤 1——检查响应头(筛查)。 获取目标页面并检查响应头:
curl -sI https://target.example/account/transfer | grep -iE 'x-frame-options|content-security-policy'
如果 X-Frame-Options 和 CSP frame-ancestors 都不存在,该页面就是一个候选目标。如果其中任一项存在且有限制性(DENY/SAMEORIGIN/frame-ancestors 'none'|'self'),则停止测试——该页面已受到保护。
步骤 2——证明页面确实能被嵌入并触发点击(确认实际发现所必需)。 构建一个最简 PoC,并在真实浏览器中加载:
<!doctype html>
<h1>Win a prize — click below</h1>
<iframe src="https://target.example/account/transfer"
style="opacity:0.1;position:absolute;top:0;left:0;width:1000px;height:800px"></iframe>
必须确认以下所有条件,否则该漏洞无法利用:
- 页面确实在 iframe 内呈现(没有会清空页面或重定向的防框架 JavaScript,例如
if(top!==self)跳出框架,或Sec-Fetch-Dest/JavaScript 框架检查)。 - 嵌入框架时,敏感操作仍然有效——关键是,该操作必须能够跨站成功。如果操作依赖设置为
SameSite=Lax或SameSite=Strict(现代默认值)的会话 Cookie,那么跨站框架请求不会发送该 Cookie,点击劫持就会失败。请验证受害者的已登录状态是否会延续到框架中。 - 目标是会改变状态的操作(转账、更改设置/邮箱/密码、禁用 2FA、OAuth 授权、管理员操作),而不是只读页面。
策略: 优先针对最敏感的操作页面——严重程度直接取决于受害者被诱骗执行的操作。
误报
- 缺少框架保护的公开只读页面(首页/营销页面)风险较低或仅具提示意义——没有可被诱骗执行的敏感操作。
- API 和非 HTML 端点(JSON、图片)不是点击劫持的目标。
- 仅缺少响应头并不构成发现。 SameSite Cookie、防框架 JavaScript,或不存在任何可在框架中触发的敏感操作,都可能彻底阻止攻击——这就是步骤 2 必不可少的原因。
证明要求
有效的点击劫持报告应展示:(1) 目标页面在真实浏览器中呈现在攻击者控制的 iframe 内;(2) 受害者处于已登录状态时,可通过框架内的点击触发一项敏感的状态更改操作(Cookie 能在跨站上下文中正常发送);(3) 覆盖层的截图或录屏。仅报告缺少响应头,但没有可用的框架 PoC,属于文档质量问题,而不是漏洞。
评论
支持 Markdown