AngularJS暗藏玄机:Piwik PRO中的CSP绕过漏洞解析
Gareth Heyes
研究员
@garethheyes
发布时间: 2023年4月28日 12:00 UTC
更新时间: 2023年4月28日 12:31 UTC
任何网站组件都可能破坏整个站点的安全性,分析平台也不例外。基于这个考虑,我们决定对Piwik PRO进行快速审计,确保其可以安全部署在portswigger.net上。
我决定寻找客户端问题,如DOM XSS - 我专注于这一点,因为我们正在引入新的脚本资源,因此最可能的攻击向量是DOM XSS漏洞。我做的第一件事是启用DOM Invader浏览站点并尝试注入canaries - 这没有产生任何结果,这是个好消息。接下来,我将DOM Invader canary更改为空白值,这使我能够看到所有使用的接收器,无论canary是否存在。这对于发现document.write()等内容非常有用,果然,有一个document.write调用和各种innerHTML赋值。我获取了堆栈跟踪并检查了document.write()调用,注意到有一个调试标志…这引出了我的下一个问题 - 这有什么用?
我将标志添加到URL中,果然出现了一个分析调试器。我测试了document.write调用是否容易受到XSS攻击,然后思考下一个问题:这个调试器是如何构建的?我开始使用devtools检查调试器,立即注意到一个"ng-app"事件。中奖了,这是我的老朋友AngularJS。
你可能想知道为什么我中奖了。这是因为AngularJS有众所周知的脚本小工具,可用于绕过内容安全策略(CSP)。脚本小工具是一些JavaScript代码,通常来自库,为HTML或JavaScript添加额外功能。然后你可以使用这个小工具绕过CSP,因为小工具已经有JavaScript执行并且被策略允许。一个很好的例子是AngularJS中的ng-focus - 这个事件让你执行浏览器焦点事件,但因为ng-focus是非标准的,它将被CSP允许并由AngularJS本身执行。
一旦你确定有一个AngularJS小工具,有两种可能的结果。你可以执行客户端模板注入(CSTI),或者有一个CSP绕过。CSTI不可能,因为它需要HTML注入漏洞才能注入脚本资源。这留下了CSP绕过,修复这一点很重要,因为如果你的站点有HTML注入漏洞,那么你可以使用CSP绕过升级到XSS。我过去在PayPal中发现过XSS。
进一步检查,调试器似乎使用了一个iframe并加载了我们的CSP允许的各种脚本资源。我查阅了我们的XSS备忘单,查看AngularJS的各种CSP绕过。我选择了第一个并在控制台中输入以下内容:
|
|
果然,这完全绕过了CSP。因为脚本被允许列出,攻击者可以注入AngularJS指令和使用composedPath()的ng-focus事件以在数组中获取window对象。orderBy过滤器遍历该数组和执行代码的范围,然后最终成为window对象,并使用Array.from()间接调用alert函数 - 这然后绕过了CSP。我们向Piwik报告了这个问题,他们更新了他们的CSP部署说明以解决此漏洞。他们通过收紧CSP以允许列出特定的JavaScript文件而不是整个域来修复它。他们还对某些脚本使用了nonces,因为这防止了攻击者注入他们自己的AngularJS脚本资源。
这现在已经生效 - 如果你发现我们遗漏了什么,请向PortSwigger和Piwik PRO的漏洞赏金计划报告。
时间线
- 2023年3月2日 10:51 - 向Piwik报告CSP绕过
- 2023年3月2日 11:20 - Piwik确认收到
- 2023年3月3日 13:09 - 漏洞确认
- 2023年3月7日 12:24 - CSP部署说明更新以修复漏洞
- 2023年4月28日 13:00 - 博客文章发布