利用表单劫持绕过CSP
Gareth Heyes
研究员
@garethheyes
发布时间:2024年3月5日 14:55 UTC
更新时间:2024年3月5日 14:55 UTC
本文将展示如何通过常被忽视的表单劫持技术绕过内容安全策略(CSP),在看似安全的配置中实现密码窃取。
什么是表单劫持?
表单劫持并非广为人知的技术:当存在受CSP保护的HTML注入漏洞时,攻击者可通过formaction
属性注入自定义表单动作,或直接注入完整表单将数据发送至恶意服务器。过度积极的密码管理器还会自动填充被注入的输入框凭证,使得攻击危害性加剧。
真实案例
我们在Infosec Mastodon发现真实案例:其Mastodon分支未正确过滤HTML,攻击者利用表单劫持在Chrome密码管理器自动填充后窃取凭证。用户点击伪装成界面元素的恶意内容时,凭证即被发送至攻击者服务器。
一年后,研究员Johan Carlsson在我们的漏洞赏金计划中提交关键报告:他先通过Google脚本资源白名单注入AngularJS绕过CSP,修复后又发现我们未防御表单劫持!虽然这只是CSP绕过(无HTML注入漏洞),但我们仍支付了$1,500奖金以强化安全。
成因分析
CSP 2.0规范定义了form-action
指令,但default-src
不涵盖表单动作。若遗漏该指令,就会如Infosec Mastodon和本站案例所示产生漏洞。本文旨在提高对该问题的认知,帮助加固CSP配置。
CSP扫描实践
Burp新增的被动扫描功能可检测以下CSP问题:
表单劫持防护
- 禁用表单:
Content-Security-Policy: form-action 'none'
- 同源限制:
Content-Security-Policy: form-action 'self'
- 指定外域:
Content-Security-Policy: form-action https://portswigger.net
(需警惕风险)
白名单资源风险
避免域名白名单(易被[脚本小工具](利用),推荐使用随机数防护:
Content-Security-Policy: script-src 'nonce-RANDOM';
非可信脚本执行
检测到unsafe-inline
/通配符/弱随机数时告警,修复方案:
Content-Security-Policy: script-src 'nonce-RANDOM';
样式注入防护
样式指令中的unsafe-inline
可能导致敏感信息泄露,建议:
Content-Security-Policy: style-src 'nonce-RANDOM';
语法错误修正
常见错误包括:
- 遗漏协议冒号:
https:
误作https
- 缺失分号导致指令失效
- 错误值(如
frame-ancestors
使用DENY
而非'none'
) - 未引用的哈希/随机数(正确格式应为
'sha512-BASE64HASH'
)
点击劫持防护
推荐取代已弃用的X-Frame-Options
:
Content-Security-Policy: frame-ancestors 'none';
策略未生效检测
报告仅监控未执行的report-only
模式,并提示未部署CSP的站点。
实战经验
在漏洞赏金项目扫描中,我们总结了开发者常见错误:
- 协议格式错误导致TLS域名脚本注入风险
- 分号缺失引发指令解析失败
- 特殊值未加引号(如随机数/哈希)
立即使用Burp早期试用版扫描您的站点,开启安全加固之旅!
图:PortSwigger安全研究团队持续输出前沿攻防技术