利用表单劫持绕过CSP防护策略 | PortSwigger安全研究

本文揭示了如何通过表单劫持技术绕过内容安全策略(CSP),详细分析了真实案例中的密码窃取漏洞,并提供了CSP配置的最佳实践与Burp Suite扫描方案。

利用表单劫持绕过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的站点。

实战经验

在漏洞赏金项目扫描中,我们总结了开发者常见错误:

  1. 协议格式错误导致TLS域名脚本注入风险
  2. 分号缺失引发指令解析失败
  3. 特殊值未加引号(如随机数/哈希)

立即使用Burp早期试用版扫描您的站点,开启安全加固之旅!

图:PortSwigger安全研究团队持续输出前沿攻防技术

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计