富文本存储型XSS的模糊测试之道
憑借黑吧安全網(wǎng)漏洞報(bào)告平臺(tái)的公開(kāi)案例數(shù)據(jù),我們足以管中窺豹,跨站腳本漏洞(Cross-site Script)仍是不少企業(yè)在業(yè)務(wù)安全風(fēng)險(xiǎn)排查和修復(fù)過(guò)程中需要對(duì)抗的“大敵”。
XSS可以粗分為反射型XSS和存儲(chǔ)型XSS,當(dāng)然再往下細(xì)分還有DOM XSS, mXSS(突變XSS), UXSS(瀏覽器內(nèi)的通用跨站腳本)。其中一部分解決方法較為簡(jiǎn)便,使用htmlspecialchars()對(duì)HTML特殊符號(hào)做轉(zhuǎn)義過(guò)濾,經(jīng)過(guò)轉(zhuǎn)義的輸入內(nèi)容在輸出時(shí)便無(wú)法再形成瀏覽器可以解析的HTML標(biāo)簽,也就不會(huì)形成XSS漏洞。
(圖:htmlspecialchars函數(shù)的轉(zhuǎn)義規(guī)則)
但網(wǎng)站做大了,總有一些業(yè)務(wù),比如郵件內(nèi)容編輯、日志帖子類編輯發(fā)布等功能時(shí),需要授權(quán)給用戶自定義鏈接、改變字體顏色,插入視頻圖片,這時(shí)就不得不需要需要引入HTML富文本實(shí)現(xiàn)相應(yīng)功能。之前提到,htmlspecialchars()這樣把所有特殊符號(hào)做轉(zhuǎn)義處理的過(guò)濾辦法,這是就英雄無(wú)用武之地,因?yàn)镠TML標(biāo)簽全部被過(guò)濾了,那之前提到的這些用戶可以自定義功能又該如何實(shí)現(xiàn)?
一個(gè)問(wèn)題總有它的解決辦法,所以基于白/黑名單防御思想的富文本內(nèi)容過(guò)濾器應(yīng)運(yùn)而生,并很快被應(yīng)用到了對(duì)抗富文本存儲(chǔ)型XSS的前沿。它的任務(wù)就是根據(jù)內(nèi)置的正則表達(dá)式和一系列規(guī)則,自動(dòng)分析過(guò)濾用戶提交的內(nèi)容,從中分離出合法和被允許的HTML,然后經(jīng)過(guò)層層刪除過(guò)濾和解析最終展示到網(wǎng)頁(yè)前端用戶界面來(lái)。這樣既不影響網(wǎng)站的安全性,也不會(huì)妨礙到用戶自定義富文本內(nèi)容功能的實(shí)現(xiàn)。
道高一尺魔高一丈,經(jīng)過(guò)一些前期的手工測(cè)試和側(cè)面從黑吧安全網(wǎng)公開(kāi)的漏洞報(bào)告中了解,大多數(shù)網(wǎng)站的富文本過(guò)濾器采用“黑名單”的設(shè)計(jì)思想。這也為我們使用模糊測(cè)試來(lái)自動(dòng)化挖掘富文本存儲(chǔ)型XSS提供了可能性。
(圖:某國(guó)內(nèi)知名郵箱的富文本過(guò)濾器基于“黑名單”設(shè)計(jì)邏輯)
與此同時(shí),本文的主角,“強(qiáng)制發(fā)掘漏洞的利器”-- 模糊測(cè)試(Fuzzing Test),相信各位一定不會(huì)陌生。無(wú)論是在二進(jìn)制還是在WEB端的黑盒測(cè)試中都有它立功的身影,從客戶端軟件漏洞的挖掘到WEB端弱口令的爆破,本質(zhì)上都可以認(rèn)為是一種模糊測(cè)試。
結(jié)合富文本過(guò)濾器“黑名單”的實(shí)現(xiàn)邏輯,接下來(lái),本文將主要探討這類富文本存儲(chǔ)型跨站腳本的模糊測(cè)試之道。將模糊測(cè)試這一強(qiáng)大的漏洞挖掘武器通過(guò)精細(xì)的打磨,挖掘出大量的潛在缺陷。
0x01 找準(zhǔn)目標(biāo),事半功倍
要進(jìn)行模糊測(cè)試,首先要找準(zhǔn)目標(biāo)。知道目標(biāo)有哪些地方有富文本編輯器,又有哪些種類,進(jìn)一步推測(cè)其是否基于“黑名單”思想,是否可以進(jìn)行自動(dòng)化的模糊測(cè)試。才可以讓我們接下來(lái)要進(jìn)行的模糊測(cè)試,發(fā)揮出事半功倍的效果
并不是所有允許用戶提交自定義內(nèi)容的地方,都允許用戶自定義富文本,如果網(wǎng)站已經(jīng)在后端對(duì)所有提交的內(nèi)容做了htmlspecialchars()的過(guò)濾,就意味著所有提交的內(nèi)容都會(huì)被轉(zhuǎn)義,也就不存在模糊測(cè)試的必要了。比如:
黑吧安全網(wǎng)漏洞報(bào)告平臺(tái)的評(píng)論回復(fù)區(qū)域,后端的實(shí)現(xiàn)邏輯就是不允許用戶傳入富文本內(nèi)容,對(duì)所有用戶輸入的內(nèi)容做了htmlspecialchars()的過(guò)濾。也就是說(shuō),如果你傳入類似:
alert(1);??? =>? alert(1);?
這時(shí)無(wú)論你使用何種高大上的XSS Vector,都無(wú)濟(jì)于事,被轉(zhuǎn)義以后的內(nèi)容,無(wú)法對(duì)構(gòu)成XSS跨站腳本。
富文本編輯器也分很多種,比如基于HTML標(biāo)簽形式的富文本編輯器(Ueditor、Fckeditor),自定義富文本標(biāo)簽形式(Markdown, UBB),在國(guó)內(nèi)外各大網(wǎng)站都有使用。模糊測(cè)試萬(wàn)變不離其宗,你有了一把鋒利的斧頭,你無(wú)論用什么方式砍柴,本質(zhì)相同。只是有時(shí)候是類似Ueditor的編輯器,在進(jìn)行模糊測(cè)試的時(shí)候,可能會(huì)更加方便容易。
(圖:百度Ueditor)
0x02 模糊測(cè)試框架
就好像寫(xiě)字之前你必須有一只筆,砍柴前必須有一把斧子一樣,在開(kāi)始針對(duì)富文本過(guò)濾器展開(kāi)模糊測(cè)試之前,你必須得有一個(gè)可以自動(dòng)生成Payload的模糊測(cè)試框架。無(wú)論使用JavaScript、PHP、Python還是更加小眾亦或是高級(jí)的語(yǔ)言,模糊測(cè)試框架的中心思想就是,通過(guò)拼接思想動(dòng)態(tài)生成大量的供模糊測(cè)試使用的Payload。對(duì)網(wǎng)站富文本編輯器的模糊測(cè)試,稍不同于對(duì)瀏覽器XSS
所以,在開(kāi)始更深一步的模糊測(cè)試方案設(shè)計(jì)之前,請(qǐng)選擇自己得心應(yīng)手的一種程序設(shè)計(jì)語(yǔ)言,參考現(xiàn)成的XSS Filter Fuzzer,編寫(xiě)出一個(gè)或簡(jiǎn)單或復(fù)雜的模糊測(cè)試框架。
(圖:基于拼接思想動(dòng)態(tài)生成XSS Fuzzing Test Payload的框架代碼)
0x03 模糊測(cè)試模板
有了框架,就好比有了手槍,現(xiàn)在我們需要給它裝上“子彈”-- 模糊測(cè)試模板。一個(gè)模糊測(cè)試模板的好壞,很大程度上決定了,之后我們是否能夠高效的測(cè)試出富文本編輯器中潛在的缺陷,從而發(fā)掘出大量的存儲(chǔ)型XSS構(gòu)造姿勢(shì)。而在設(shè)計(jì)自己的模糊測(cè)試模板時(shí),主要需要考慮三點(diǎn):邊界、進(jìn)制編碼和字符集。
先來(lái)說(shuō)說(shuō)邊界問(wèn)題。以下面簡(jiǎn)單的HTML代碼為例:
span class=”yyy οnmοuseοver=11111” style="width:expression(alert(9));">span>
上述HTML標(biāo)記語(yǔ)言文本傳給后端富文本編輯器的時(shí)候,程序會(huì)如何過(guò)濾和解析?也許是這樣的:首先匹配到,進(jìn)入其屬性值過(guò)濾的邏輯,首先是否含有高危的on開(kāi)頭的事件屬性,發(fā)現(xiàn)存在onmouseover但被”,”包裹,作為class屬性的屬性值,所以并不存在危險(xiǎn),于是放行;接著分析style屬性,其中有高危關(guān)鍵詞”expression()”,又有括弧特殊符號(hào),所以直接清除過(guò)濾。
上述過(guò)濾流程的實(shí)現(xiàn),很大程度依賴于后端通過(guò)正則匹配進(jìn)行的HTML標(biāo)簽中的邊界分析。通過(guò)對(duì)“邊界”的判定,類似class=”yyyy onmouserover=11111” 的屬性及其值才會(huì)被放行,因?yàn)殡m然onmouserover=11111雖然是高危的事件屬性,但存在于=””中,沒(méi)有獨(dú)立成一個(gè)HTML屬性,也就不存在風(fēng)險(xiǎn)。所以在上面的例子中,=””就是邊界,中的尖括號(hào)也是邊界,空格也可以說(shuō)成一種邊界。所以,形象一點(diǎn)說(shuō),一段HTML代碼的邊界位置很有可能是下面這樣的:
[邊界]span[邊界]class=[邊界]yyy[邊界]>[邊界]span[邊界]>
所以如果是類似style="width:expr/*”*/esion(alert(9));"屬性和屬性值呢?程序又該如何確定邊界?是style="a:expr/*”還是style="a:expr/*”*/ession(alert(9));"?
當(dāng)后端富文本過(guò)濾程序遇到這樣,略微復(fù)雜的選擇題時(shí),如果其后端規(guī)則設(shè)計(jì)的過(guò)于簡(jiǎn)單,就很有可能導(dǎo)致把不該過(guò)濾的過(guò)濾掉,而把非法的內(nèi)容放行,從而我們可以構(gòu)造出存儲(chǔ)型XSS。打亂HTML邊界,讓后端富文本過(guò)濾器陷入選擇窘境,這是我們?cè)O(shè)計(jì)模糊測(cè)試模板的原則之一。有哪些內(nèi)容可能會(huì)導(dǎo)致富文本內(nèi)容過(guò)濾器出現(xiàn)邊界判斷問(wèn)題?
(1)特殊HTML符號(hào),通過(guò)這類明顯的符號(hào),過(guò)濾器就可以到HTML標(biāo)簽及其屬性,但這些符號(hào)錯(cuò)誤的時(shí)候出現(xiàn)在了錯(cuò)誤的地點(diǎn),往往會(huì)釀成大禍,如:
=, ”, ’, :, ;, >,
(2)過(guò)濾器會(huì)過(guò)濾刪除的內(nèi)容,我們?cè)谶吔缣畛湎旅孢@些元素,過(guò)濾器盲目刪除,很有可能導(dǎo)致原本無(wú)害的屬性值,掙脫牢籠,成為惡意的屬性和屬性值,如:
expression, alert, confirm, prompt, ,
(3)不可打印字符,如:
\t、\r、\n、\0等不可打印字符
綜上,現(xiàn)在我們已經(jīng)可以用Fuzzer生成一個(gè)下面這樣的Payload。幸運(yùn)的話,或許已經(jīng)可以繞過(guò)一些后端邏輯簡(jiǎn)單的富文本過(guò)濾器了,示例如下:
span/class=/yyyy οnmοuseοver=11111/style="a:exp/*”>*/resion(1);">span>
當(dāng)然,除了邊界區(qū)分問(wèn)題,富文本過(guò)濾器面對(duì)著另外兩個(gè)勁敵,特殊的進(jìn)制字符編碼和千奇百怪的字符集。
我們先來(lái)說(shuō)說(shuō)字符編碼,類似\x22,\40,"等一系列進(jìn)制編碼,直接當(dāng)作文本內(nèi)容傳遞給后端富文本過(guò)濾器,如果處理的辦法?解密后過(guò)濾?直接輸出?經(jīng)驗(yàn)告訴我們,不少過(guò)濾器在處理類似特殊的進(jìn)制編碼時(shí),往往會(huì)在進(jìn)制編碼的特殊HTML符號(hào)面前摔個(gè)人仰馬翻。于是,像下面這樣一段看似無(wú)害化的Payload,在富文本過(guò)濾器自作聰明的解密過(guò)后,變成了一段跨站腳本:
前:span class=”yyy "οnmοuseοver=alert(1);//”>span>
?=>
后:span class=”yyy“ οnmοuseοver=alert(1);//”>span>
接下來(lái),我們?cè)賮?lái)說(shuō)說(shuō)千奇百怪的字符集,不少富文本編輯器在處理類似“祝”的unicode字符時(shí),會(huì)將字符轉(zhuǎn)化成標(biāo)簽,所以在mramydnei報(bào)告的一個(gè)騰訊郵箱存儲(chǔ)型XSS中,一段無(wú)害的Payload逆襲成了有害的跨站腳本:
前:style x="祝" y="Fuzzitup {}*{xss:expression(alert(document.domain))}">
?=>
后:style x=" https:="" res.mail.qq.com="" zh_cn="" htmledition="" images="" emoji32="" 3297.png"="">" y="Fuzzitup {}*{xss上一頁(yè)??????:expression(alert(document.domain))}">style>
0x04 模糊測(cè)試實(shí)戰(zhàn)
正所謂“磨刀不誤砍柴工”,在進(jìn)行模糊測(cè)試實(shí)戰(zhàn)之前,我建議,對(duì)富文本過(guò)濾器的大改過(guò)濾規(guī)則和實(shí)現(xiàn)原理手動(dòng)測(cè)試一番,了解哪些HTML標(biāo)簽允許被使用,有哪些關(guān)鍵詞出現(xiàn)就會(huì)被刪除,又有哪些Payload會(huì)觸發(fā)網(wǎng)站存在的WAF,在之后的測(cè)試中,針對(duì)目標(biāo)網(wǎng)站“個(gè)性化”的修改模糊測(cè)試模板。
講到這里,相信你已經(jīng)大概了解富文本跨站腳本模糊測(cè)試了,不過(guò)模糊測(cè)試的威力究竟如何呢?我們用實(shí)例來(lái)做論證:
網(wǎng)易有道云筆記存儲(chǔ)型XSS [進(jìn)制編碼處理缺陷]
XSS利用技巧(自動(dòng)觸發(fā)/所有瀏覽器通用)
小米論壇存儲(chǔ)型XSS [進(jìn)制編碼處理缺陷]
新浪郵箱存儲(chǔ)型XSS [邊界判定缺陷]
QQ郵箱存儲(chǔ)型XSS [字符集處理缺陷]
WooYun: 騰訊郵箱郵件正文存儲(chǔ)型漏洞 "> WooYun: 騰訊郵箱郵件正文存儲(chǔ)型漏洞
QQ郵箱存儲(chǔ)型 XSS [字符集處理缺陷]
0x05 寫(xiě)在最后
模糊測(cè)試只是自動(dòng)化強(qiáng)制發(fā)現(xiàn)漏洞的一個(gè)重要手段,就像自動(dòng)化漏洞掃描器一樣。我們并不能完全依靠它,在測(cè)試過(guò)程中,對(duì)過(guò)濾器結(jié)果進(jìn)行適時(shí)的分析,對(duì)模糊測(cè)試模板做出合理的改進(jìn),不僅能提高模糊測(cè)試的效率,還能夠幫助我們挖掘到更多潛在的設(shè)計(jì)缺陷。畢竟,機(jī)器終究是“死板”的,而人是“靈活”的。
富文本跨站腳本測(cè)試之道,就是細(xì)致的模糊測(cè)試結(jié)果分析,加上對(duì)模糊測(cè)試模板的不斷打磨,人與機(jī)器的結(jié)合,才會(huì)打造出一把真正的“神器”。
?上一頁(yè)?????
轉(zhuǎn)載于:https://www.cnblogs.com/xdans/p/5412735.html
總結(jié)
以上是生活随笔為你收集整理的富文本存储型XSS的模糊测试之道的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: clientX和clientY属性需要注
- 下一篇: Rust 中的继承与代码复用