周景平:大家好,今天我給大家分享的主題是非主流的Fuzzing。這個(gè)主要是在我以往的一些漏洞挖掘領(lǐng)域的積累,有好多可能是好幾年前做的一些實(shí)踐,有一些是最近做過(guò)的一些實(shí)踐,主要是跟大家分享一下。
首先自我介紹一下,我的本名是周景平,目前在知道創(chuàng)宇當(dāng)CSO,首席安全官。后面列舉了一些黑客組織,下面有我的電子郵箱,我比較喜歡分享一些觀點(diǎn)到微博上面,到Twitter,有知乎上面的一些分享,大家有興趣的話可以關(guān)注一下。
首先我要介紹一下什么叫Fuzzing,F(xiàn)uzzing的中文就是模糊測(cè)試。在這里列舉了一本書,有兩版,但是我不是說(shuō)這個(gè)書有多牛,我覺(jué)得這個(gè)書一般。但是為什么會(huì)貼出來(lái)?我覺(jué)得它的標(biāo)題寫得好,表達(dá)了Fuzzing的一些比較深刻的認(rèn)識(shí),是《模糊測(cè)試強(qiáng)制發(fā)掘安全漏洞的利器》,我覺(jué)得這個(gè)標(biāo)題取得好。里面有一些介紹模糊測(cè)試的歷史、分類,我覺(jué)得可以參考,至于里面的一些內(nèi)容,大家仁者見(jiàn)仁。里面什么叫Fuzzing,在這本書的序言里面,就是MSF的創(chuàng)始人舉了一個(gè)例子,他有一個(gè)朋友,有一個(gè)小孩拿到一個(gè)蘋果電腦被鎖屏了,小孩一頓亂敲,結(jié)果把那個(gè)鎖屏解了,這個(gè)就是模糊測(cè)試。
在里面有一個(gè)定義,在我們安全界里面我常說(shuō)的一句話就是,安全圈都是語(yǔ)文沒(méi)學(xué)好的,很多問(wèn)題就糾結(jié)在中文的博大精深,你可以這樣解釋,也可以那樣解釋。比如我們安全界經(jīng)常爭(zhēng)論的,這個(gè)是漏洞嗎?什么是漏洞,什么是Bug,一提到這個(gè)問(wèn)題大家就吵個(gè)不停。這個(gè)東西有時(shí)候很難下一個(gè)定義,我覺(jué)得這本書里面也可以借鑒一下。它就給這個(gè)模糊測(cè)試下了一個(gè)定義,他是說(shuō)通過(guò)向應(yīng)用程序提供非預(yù)期的輸入,并監(jiān)控輸出過(guò)程中發(fā)生的異常,發(fā)現(xiàn)這么一個(gè)軟件缺陷的方法。另外也提到了一句話,在里面代表了一些主流的思想,就是模糊測(cè)試數(shù)是利用自動(dòng)化和半自動(dòng)化的一個(gè)方法重復(fù)的向程序輸入。就像開始我舉例子這個(gè)小孩一樣,他不停的在鍵盤上輸入,恰好有某一個(gè)命令就解鎖了。
在這里我也類比了一下漏洞挖掘的過(guò)程和測(cè)試的結(jié)構(gòu)和流程。這個(gè)其實(shí)很簡(jiǎn)單,就是按照定義來(lái)的,你首先輸入你的原始數(shù)據(jù),向你的目標(biāo)程序解析執(zhí)行,你去監(jiān)控這個(gè)異常的輸出就行了。在那本書里面,他的結(jié)構(gòu)分得比較細(xì)。有一個(gè)識(shí)別目標(biāo),識(shí)別輸入,這是什么意思呢?這個(gè)就是好像你拿了一個(gè)軟件過(guò)來(lái)分析的話,你首先要更多的時(shí)候去了解它的協(xié)議,它是怎么樣輸入輸出的一個(gè)數(shù)據(jù)格式。對(duì)于文件格式類的,你可能要去分析一下這個(gè)文件格式是怎么一個(gè)構(gòu)造。然后你對(duì)于一個(gè)程序來(lái)說(shuō),哪些變量是你需要去控制的,這是一點(diǎn)。還有一點(diǎn)那個(gè)分類后面又解釋了說(shuō),這個(gè)監(jiān)測(cè)的異常不一定是漏洞,很可能是Bug。在這個(gè)Bug里面抽出來(lái)以后,再識(shí)別哪些是你要的漏洞。
我們第一步就是構(gòu)造這種非預(yù)期的輸入,我把它理解為這種生成模糊測(cè)試的樣本數(shù)據(jù),這個(gè)我認(rèn)為是一個(gè)關(guān)鍵點(diǎn)。因?yàn)槟闼械挠|發(fā)這個(gè)漏洞的東西,就取決于這個(gè)數(shù)據(jù)的量或者變化有多大。你的變化越多,或者說(shuō)你的變化越大,可能你發(fā)現(xiàn)的漏洞,發(fā)現(xiàn)的異??赡芫透?。但是這個(gè)里面的數(shù)據(jù)結(jié)構(gòu)一般包括幾個(gè),這個(gè)是按我個(gè)人的理解來(lái)分的,包括基本的數(shù)據(jù)結(jié)構(gòu)和模板及對(duì)應(yīng)值?;镜臄?shù)據(jù)模塊,比如就是一個(gè)文件格式,你要放一個(gè)crash,首先要有這么一個(gè)模板。要發(fā)Word文檔,本身自己有一個(gè)文件格式,但是文件格式里面還包括一些網(wǎng)絡(luò)協(xié)議,包括一個(gè)語(yǔ)言語(yǔ)法概念。對(duì)應(yīng)的值一般就是在某個(gè)屬性的基礎(chǔ)上,你要給予復(fù)制。比如一般常見(jiàn)的,我們比較常見(jiàn)的注入里面來(lái)一個(gè)逗號(hào),或者在某些內(nèi)層的漏洞里面給一個(gè)空的值,或者給一個(gè)超大的值,或者是給一個(gè)超長(zhǎng)的字符串,告訴他內(nèi)存的溢出。所以這個(gè)其實(shí)就是告訴我們非預(yù)期的一個(gè)輸入。
這是一個(gè)例子,是一個(gè)瀏覽器的識(shí)別,其實(shí)你可以把基本的這些屬性定義化搜集,首先要搜集這些東西,把這些搜集到,然后里面第一部分提到了有很多值,包括常見(jiàn)的字符串格式化的漏洞,或者是給他來(lái)一個(gè)復(fù)值,或者來(lái)一個(gè)超大的支點(diǎn),其實(shí)就是一個(gè)很典型的非預(yù)期輸入,首先要搜集一些前期的工作準(zhǔn)備。
這個(gè)應(yīng)用程序的解析其實(shí)就很簡(jiǎn)單了,注意兩點(diǎn)就行了,對(duì)于Fuzzing來(lái)說(shuō),因?yàn)镕uzzing是要求自動(dòng)化或者半自動(dòng)化的東西。但是在這個(gè)階段,對(duì)于一個(gè)Fuzzing來(lái)說(shuō),一般要求是全自動(dòng)化要不停的把你的數(shù)據(jù)提交到應(yīng)用程序,不停的去測(cè)試解析。整個(gè)東西里面有一些注意點(diǎn)在設(shè)計(jì)的時(shí)候,比如說(shuō)在跑的過(guò)程當(dāng)中異常了,推出了,崩潰了,你怎么樣繼續(xù)跑下去?要怎么樣去處理這個(gè)異常?這是要注意的。然后就是框架穩(wěn)定性的這一步,當(dāng)你大規(guī)模集群部署的時(shí)候,你這個(gè)Fuzzing不能中斷,一旦中斷了,后面樣本的測(cè)試就走不下去了。
這個(gè)里面要主要的主要是分類,就是說(shuō)你這個(gè)Crash點(diǎn)是不是同一個(gè),是屬于同一類的問(wèn)題。假如說(shuō)你海量的數(shù)據(jù),導(dǎo)致的異常太多了,你不去自動(dòng)把它分類處理的話,有可能你這個(gè)樣本簡(jiǎn)化半天,發(fā)現(xiàn)這個(gè)漏洞分析來(lái)分析去是同一個(gè)問(wèn)題,極大的浪費(fèi)了時(shí)間和成本。還有一種就是不能夠穩(wěn)定出現(xiàn),因?yàn)檫@種有一次性的Crash,就是只能跑一次它就崩潰了,你不能復(fù)現(xiàn),這種對(duì)于我們來(lái)說(shuō)是沒(méi)有太大的意義的,你沒(méi)有辦法復(fù)現(xiàn)我怎么去調(diào)試呢?根本沒(méi)辦法。
這里面主要是講了一下主流Fuzzing的歷史和現(xiàn)狀。這本書里面有一個(gè)圖,其實(shí)當(dāng)時(shí)也總結(jié)得還算OK,是總結(jié)到了2007年。最開始提出的應(yīng)該是在1989年,有一個(gè)教授在學(xué)術(shù)圈測(cè)試穩(wěn)健性的時(shí)候就提出了這么一個(gè)方法,然后逐步發(fā)展。可以看到在這里面列舉了幾列,前期可以看出來(lái),很多都是在文件格式里面,比如Word、Office系列的那些,后面又出現(xiàn)了基于瀏覽器的。到現(xiàn)在,我接著在后面總結(jié)了三個(gè)比較有名的,跟大家說(shuō)一下。2010年Lcamtuf發(fā)布了一個(gè)Fuzzing的程序。為什么提他呢?因?yàn)樗?dāng)時(shí)提出來(lái),那個(gè)程序他剛剛發(fā)布的時(shí)候我就測(cè)試過(guò),對(duì)于用的量比較少的那一類瀏覽器,提上去立馬卡死。為什么要提它?它的影響在哪里呢?現(xiàn)在還有好多人基于這個(gè)代碼進(jìn)行修改,包括我前面貼圖的那個(gè),也是參考了這個(gè)代碼進(jìn)行修改。第二個(gè)是一個(gè)框架的代表,這個(gè)也是基于瀏覽器的。目前的主流Fuzz在瀏覽器這一塊應(yīng)用得很廣,很多都在用瀏覽器。為什么要提這個(gè)框架?因?yàn)橛泻芏喙净蛘哒f(shuō)很多個(gè)人研究者在選用框架的時(shí)候去參考了這個(gè)框架,我也去嘗試過(guò)套用這個(gè)框架做測(cè)試,但是它的缺陷確實(shí)還是很明顯的。所以很多人做了自己的開發(fā)修改,好在它是開源的,可以去修改。第三個(gè)又是這個(gè)人,他現(xiàn)在是非?;鸬囊粋€(gè)Fuzzing的工具,他跑出了很多的漏洞。這個(gè)人的理念相對(duì)來(lái)說(shuō)是比較領(lǐng)先一點(diǎn)的,是跑內(nèi)存,各種方法,這個(gè)效果你可以去參考一下,確實(shí)是很驚人的,目前還在不斷的有人加入這個(gè)計(jì)劃去跑。
這個(gè)現(xiàn)狀,目前內(nèi)存型的漏洞主要的挖掘手段就是模糊測(cè)試,這個(gè)競(jìng)爭(zhēng)是非常激烈的。你可以從瀏覽器IE,或者說(shuō)Chrome、Firefox每一個(gè)去看,你會(huì)發(fā)現(xiàn)這個(gè)競(jìng)爭(zhēng)是相當(dāng)激烈的。而且另一個(gè)就是高度的定制化、私有化、復(fù)雜化,很多安全人員都開始有自己的開源工具,比如著名的我們557的一位博士,他自己寫了一個(gè)很牛的框架,他光ID就報(bào)了100來(lái)個(gè)CVE。而且我問(wèn)了他一下大概用了多少機(jī)器,當(dāng)時(shí)就是200個(gè)VM,這個(gè)產(chǎn)出是很驚人的。然后就是集群化和大規(guī)?;?,前面谷歌有位安全人員在某個(gè)安全大會(huì)上分享了他們的一個(gè)云的Fuzzing,他就是已經(jīng)云端化了,把這個(gè)Fuzzing的機(jī)器集群已經(jīng)擴(kuò)大到那種規(guī)模了,大概有4千臺(tái)機(jī)器,他沒(méi)提VMware。所以4千臺(tái)機(jī)器上面還部署了多少VMware不知道,所以這個(gè)量是很龐大的?,F(xiàn)在包括百度、騰訊和360的,有大量的機(jī)器在做這一塊。這個(gè)截圖就是火狐上面的,可以看到Bug List上面有多少應(yīng)用Fuzzing這個(gè)程序報(bào)告的。這個(gè)是谷歌的Fuzzing,這個(gè)是我用的一個(gè)。就因?yàn)檫@10幾臺(tái)的VMware,在去年我躋身于微軟漏洞挖掘100強(qiáng)里面,也就是10個(gè)。
前面講了那么多主流的東西,其實(shí)我今天要講的是非主流的,那種問(wèn)題就來(lái)了,這種非預(yù)期輸入一定非得隨機(jī)化嗎?異常輸出就一定是Crash嗎?因?yàn)榍懊嫠械目蚣墚惓L幚矶际钦疫@個(gè)Crash崩潰的信息,這個(gè)是內(nèi)存的一種漏洞?;蛘呶覔Q一種提法,這個(gè)只適合于這種內(nèi)存型漏洞的測(cè)試碼?只有大規(guī)模的計(jì)算資源才能Fuzzing嗎?這個(gè)可以和第一個(gè)問(wèn)題可以配合來(lái),當(dāng)你手上沒(méi)有多少資源的時(shí)候,你覺(jué)得走不下去了。我覺(jué)得不一定,我覺(jué)得有一點(diǎn),不一定很復(fù)雜,這一點(diǎn)其實(shí)也是跟前面兩點(diǎn)可以一起說(shuō)的,你必須有大量的機(jī)器,大量的計(jì)算力,必須開發(fā)很牛的框架來(lái)做這個(gè)Fuzzing的測(cè)試,這個(gè)Fuzzing的測(cè)試只適合找一些內(nèi)存型的漏洞。
我今天講這個(gè)非主要的就是想告訴大家,F(xiàn)uzzing雖然是一種漏洞挖掘Bug的方法,我更加認(rèn)為它是一種思想,它可以適合于各種各樣的場(chǎng)景,不一定非得你做一個(gè)內(nèi)存型的漏洞挖掘。我要強(qiáng)調(diào)的就是你要有這種意識(shí),當(dāng)你在漏洞完全的時(shí)候,你要有這樣一種方法,可能快速的定位找到漏洞。
我們從漏洞挖掘的方法論到到Fuzzing,我們經(jīng)常用的一個(gè)方法論里面,首先我們一般對(duì)于一個(gè)漏洞挖掘者的學(xué)習(xí)經(jīng)歷來(lái)看一般都是這樣的,首先是分析別人的漏洞,或者分析漏洞以后,我會(huì)總結(jié)這個(gè)漏洞有什么樣的一個(gè)模型,我們能形成一個(gè)模型。然后我用這個(gè)模型去匹配和發(fā)現(xiàn)一些新的問(wèn)題漏洞,在這個(gè)模型下面去找這個(gè)。其實(shí)這個(gè)東西你用的Fuzzing也是一樣的,我把最后一步做到自動(dòng)化,首先通過(guò)我自己的分析,這個(gè)漏洞是這個(gè)樣的,原理是這個(gè)樣子的,是不是在技術(shù)的點(diǎn)還會(huì)有這樣的問(wèn)題?我寫一個(gè)程序,自動(dòng)化的變了一遍,或者我去嘗試,可能又發(fā)現(xiàn)是一樣的問(wèn)題。
這里面還是要糾結(jié)到那三步,就是輸入數(shù)據(jù)的架構(gòu),其實(shí)這個(gè)東西有的時(shí)候就要根據(jù)不同的類型去做了。舉一個(gè)很簡(jiǎn)單的例子,比如SQL注入的,有的時(shí)候你提交一個(gè)單引號(hào)或者是一個(gè)雙引號(hào),它就出錯(cuò)了,這就是異常信息。比如說(shuō)XSS,提交一個(gè)能夠彈框的,按一個(gè)1,彈一個(gè)1出來(lái),說(shuō)明這也是一種異常,已經(jīng)執(zhí)行了。所以我們要抓住這兩點(diǎn),就很好做一些事情。
這里面舉了幾個(gè)例子,第一個(gè)就是XSS的Fuzzing,在攻防里面有幾個(gè)方向,第一個(gè)方向就是找新的策略,就是人家的那個(gè)防護(hù)策略他根本沒(méi)考慮到這種方式能夠執(zhí)行,我要找的就是這個(gè)。還有一種方向就是說(shuō),我不跟你對(duì)抗,我繞過(guò),利用你這個(gè)機(jī)制我提交兩次,一次以后我還原了原來(lái)的,這是一種對(duì)抗。所以這里面有一個(gè)原型,當(dāng)時(shí)做測(cè)試就是這一句,就是一個(gè)反斜杠的利用。當(dāng)時(shí)有人提出來(lái),有一個(gè)XS的點(diǎn),它的空格被過(guò)濾了,可能是其他機(jī)制過(guò)濾了,他沒(méi)辦法插入這個(gè),后來(lái)就發(fā)現(xiàn)這個(gè)反斜杠可以。我們就順勢(shì)思考,這就是一個(gè)漏洞模型了,我總結(jié)出來(lái)了,就是一個(gè)漏洞模型,這是反斜杠。我們就很自然而然的想,會(huì)不會(huì)有其他的字符串可以做到這個(gè)效果?寫一個(gè)腳本很簡(jiǎn)單,整個(gè)下面是PHP,就是這么一個(gè)代碼。
這個(gè)設(shè)計(jì)就是你怎么捕獲異常,我的意思就是說(shuō),假如瀏覽器成功執(zhí)行了1.PHP的話,解析了HPH的話,他會(huì)去訪問(wèn),所以我記錄了一個(gè)異常就行了,我當(dāng)時(shí)測(cè)試有這么一些結(jié)果。我在測(cè)試的時(shí)候,做這個(gè)測(cè)試沒(méi)多久就有一個(gè)老外也做了相同的工作,他做的比我全,前面那兩個(gè)字符串我測(cè)過(guò),沒(méi)有什么效果。他做得更廣,范圍更大,把寬字節(jié)什么都考慮到了。這個(gè)報(bào)告可以看一下,他的設(shè)計(jì)和我的方法其實(shí)也相當(dāng)于差不多。這個(gè)里面的點(diǎn)模型還有很多,比如我這個(gè)空格,因?yàn)槔锩婺蔷湓挼哪P陀泻芏?,只是一個(gè)空格。這個(gè)空格定了,還有另外一個(gè)空格,假如兩者或者三者,或者各種各樣組合起來(lái),其實(shí)你Fuzzing的數(shù)據(jù)量還是很龐大的。后來(lái)有另外一個(gè)老外,他干脆就寫了這么一個(gè)框架,你只要去在里面填充這個(gè)模板就行了,而且這個(gè)數(shù)據(jù)也是共享的,大家有興趣的可以去學(xué)習(xí)參考一下。
下面我講一個(gè)SQL注入的嘗試。在這個(gè)里面其實(shí)異常很簡(jiǎn)單,前面反復(fù)提到了,提交一個(gè)逗號(hào),或者說(shuō)一個(gè)雙引號(hào)就可以了。Oracle有一個(gè)存儲(chǔ)過(guò)程的Fuzzing,這是我很早的一個(gè)研究。這個(gè)存儲(chǔ)過(guò)程其實(shí)有非常大的意義,假如玩過(guò)Oracle的話,會(huì)經(jīng)常利用它的漏洞,利用集成去注入,這就是一個(gè)典型的注入的代碼程序。這個(gè)里面的關(guān)鍵點(diǎn),異常數(shù)據(jù)很簡(jiǎn)單就是一個(gè)引號(hào)就行了,異常輸出也很簡(jiǎn)單,就是他提示你的語(yǔ)法錯(cuò)誤了,你抓到這個(gè)就行了。剩下你要做的,要想的是什么呢?你在里想思考的事,這個(gè)存儲(chǔ)過(guò)程有,這個(gè)參數(shù)有,那么其他參數(shù)有沒(méi)有?其他存儲(chǔ)過(guò)程有沒(méi)有?我們?cè)趺聪朕k法把所有的東西都變了一遍,答案是可以的。所以通過(guò)一些研究,第一步就通過(guò)Object ID,就得到一些可擴(kuò)展的參數(shù)。得到這個(gè)參數(shù)以后,這些得到的函數(shù)名和過(guò)程名是一樣的。這三步的目的都是為了得到存儲(chǔ)過(guò)程的名字、過(guò)程ID和變量的名字,剩下的就是你調(diào)用它,就可以判斷了。當(dāng)時(shí)有一個(gè)朋友跟我寫過(guò)一個(gè)程序,我們配合的,效果還是有的,后面沒(méi)有去跑,而且自己后來(lái)方向變了,就沒(méi)有專注那一塊,慢慢放棄了,但是這個(gè)方式是OK的。
另外可以提一下比較有意思的一個(gè)案例,就是iis6下面有一個(gè)文件名解析的漏洞,雖然微軟一直不承認(rèn)這是一個(gè)漏洞,他認(rèn)為是一個(gè)特性,但是這個(gè)確實(shí)給很多網(wǎng)站帶來(lái)了困擾。就因?yàn)樯蟼鬟@么一個(gè)文件,導(dǎo)致被解析了,所以繞過(guò)了很多的程序過(guò)濾。當(dāng)時(shí)這個(gè)問(wèn)題的發(fā)現(xiàn)應(yīng)該是烏云他們那個(gè)團(tuán)隊(duì)。他們當(dāng)時(shí)給了一個(gè)公告,也沒(méi)給我細(xì)節(jié),我問(wèn)過(guò)他們,他們還不告訴我。那么怎么辦呢?我只好自己去想辦法跑一下。其實(shí)這個(gè)設(shè)計(jì)很簡(jiǎn)單,也是按之前的我變了一下所有的字符。這里面的異常判斷,直接CURL去訪問(wèn)一下,如果能夠訪問(wèn)到那個(gè)被解析的代碼說(shuō)明是OK的。
我前面說(shuō)的是一種思想,就是Fuzzing可以應(yīng)用于很多的場(chǎng)景,這是在滲透測(cè)試中,其實(shí)我們也要很多用到的場(chǎng)景。比如說(shuō)豬豬俠在某一年的烏云大會(huì)上講到的一個(gè)議題,就是自動(dòng)化攻擊的這么一個(gè)現(xiàn)在和將來(lái)的議題,里面就提到了各種各樣的組合方法,比如生日和排列組合,各種年月日、名字,加到這個(gè)字典里面去模糊測(cè)試。其實(shí)這就是一個(gè)很典型的Fuzzing,我還可以跟我另外一個(gè)朋友分享一下,是在他的滲透測(cè)試中,這個(gè)有點(diǎn)想法,就像我開篇講的那個(gè)小孩一樣的。他就是通過(guò)在某次滲透測(cè)試中,他發(fā)現(xiàn)他搞定了一個(gè)權(quán)限,但是是一個(gè)低權(quán)限的,他通過(guò)很多的提權(quán)工具都沒(méi)有辦法。他唯一做的是什么事呢?這個(gè)時(shí)候他就坐在電腦面前盲目的敲,就用SU的那個(gè)盲目的敲密碼。他已經(jīng)敲了大概有幾個(gè)小時(shí),他有點(diǎn)暈了,突然一抬頭看,是一個(gè)井號(hào)了。問(wèn)題是這個(gè)時(shí)候他不知道哪個(gè)密碼是對(duì)的,這是一個(gè)真實(shí)的案例,是我朋友的一個(gè)案例。我舉這個(gè)例子的意思就是說(shuō),你不要太局限于你的思維,你的思維要發(fā)散,向前看。
這里講一個(gè)我提的比較多的,就是相似性的漏洞挖掘。相似性的漏洞挖掘有幾條,其中有一條就是相似的業(yè)務(wù)必然帶來(lái)相似的漏洞,這個(gè)大家可以去理解。還有一條也可以順帶說(shuō)一下,同一個(gè)人開發(fā)的代碼肯定有同一個(gè)問(wèn)題。所以他開發(fā)的這個(gè)程序有漏洞了,他開發(fā)的另外一個(gè)程序肯定有同樣的問(wèn)題,放心,絕對(duì)有。所以你怎么去發(fā)現(xiàn)呢?大家知道我一直是漏洞之王,刷榜的,有一個(gè)技巧。我在2012年就報(bào)告了這么一個(gè)XSS給騰訊,當(dāng)時(shí)他們很積極的修復(fù)了。當(dāng)時(shí)因?yàn)槁┒醋銐蚨啵覀円ハ脒@個(gè)方法測(cè)試。2014年有一天實(shí)在無(wú)聊,我寫這個(gè)程序有一個(gè)新的想法,我能不能實(shí)踐一下?我就去做了。我要做的是什么呢?首先看一下效果,就報(bào)了這么多Bug。這個(gè)是怎么來(lái)的呢?其實(shí)很簡(jiǎn)單,我第一步就把qq.com的子域名全部爬一遍,暴力也好,越多的得到子域名就越OK。我把這些子域名變了一遍,這個(gè)里面涉及到異常判斷,可能涉及到開發(fā),比如你假如手工要貼到UI的話,這個(gè)就不能自動(dòng)化,不能說(shuō)是Fuzzing。我當(dāng)時(shí)就想到一個(gè)解析的方法,這是一個(gè)命令行的版本,我能夠解析這個(gè)確實(shí)執(zhí)行了,相當(dāng)于一個(gè)命令行的瀏覽器,判斷這個(gè)值就行了。這個(gè)代碼也很簡(jiǎn)單,就是把所有的子域名變了一遍就行了。這是我其中刷的一個(gè)漏洞,其實(shí)還有好多漏洞可以刷。所以有時(shí)候你總結(jié)一下,把所有你在烏云上看到的那些漏洞,把這些變量都保存一下,這個(gè)處罰的保存一下,把所有的子域都爬一遍,說(shuō)不定你能夠刷爆好幾個(gè)SRC。
這里面主要說(shuō)一下秘籍,這個(gè)Fuzzing首先要有這個(gè)意思,不止是一個(gè)漏洞挖掘的工具方法,它是一種思想,可能應(yīng)用于各種各樣的場(chǎng)景。你要看到這個(gè)漏洞原型的時(shí)候,或者你要想到這個(gè)東西。你看到這個(gè)漏洞的時(shí)候,你會(huì)想到是不是有相當(dāng)多的問(wèn)題我要跑一下?就是跑很重要。所以第二個(gè)秘籍,就是你要跑,Just do it。就是你有這個(gè)想法了,必須要去做。這一句話基本上是流傳很廣的,那個(gè)小伙問(wèn)我怎么才能牛?我說(shuō)你整就牛,你只要去做了,就會(huì)牛。下面還有一個(gè)真實(shí)的例子,我就可以告訴你為什么你只要做了,就真的有漏洞出來(lái)。
跨維思維,有的時(shí)候不要把你的思維太局限了,你要想的東西,這里主要是提了不要局限在你提取的那個(gè)漏洞模型里面,有可能這個(gè)漏洞模型里面還有其他的一些東西,我下面這個(gè)例子就可以說(shuō)明這個(gè)問(wèn)題。
首先看一下Bypass,這是烏云上有一個(gè)報(bào)了360的一個(gè)漏洞,當(dāng)時(shí)他的漏洞其實(shí)很簡(jiǎn)單,其實(shí)繞過(guò)了白名單。因?yàn)楫?dāng)時(shí)細(xì)節(jié)沒(méi)有出來(lái),我當(dāng)時(shí)看到這個(gè)點(diǎn),我看到這個(gè)因?yàn)槌鲈诮馕龇椒ㄉ厦妫〉玫膅etHost跟原來(lái)的不一致,繞過(guò)了這個(gè)檢測(cè)。后來(lái)我就想辦法找到這個(gè)東西,其實(shí)這個(gè)細(xì)節(jié)已經(jīng)給出來(lái)了,他就是提交這么一個(gè)URL,他通過(guò)這個(gè)getHost的取得,是取得了360.cn。他通過(guò)瀏覽器去訪問(wèn)這個(gè)URL的時(shí)候,其實(shí)他訪問(wèn)的是烏云。所以這個(gè)漏洞模型就來(lái)了,我把這個(gè)反斜杠作為我的Fuzzing點(diǎn),我去跑一下,看看還有沒(méi)有其他的出現(xiàn)。我當(dāng)時(shí)設(shè)計(jì)了這么一個(gè)模型,其實(shí)這個(gè)異常捕獲很簡(jiǎn)單,就是有沒(méi)有訪問(wèn)到這個(gè)80服務(wù)器就行了。把完整的模型跑起來(lái),沒(méi)有任何發(fā)現(xiàn),有可能就是局限了。
但是我們做深一層次的思考,不能夠局限于目前這個(gè)漏洞模型,這是一個(gè)典型的標(biāo)準(zhǔn)不一致帶來(lái)的安全問(wèn)題,就是兩個(gè)方法,兩個(gè)東西在做判斷的時(shí)候,在做對(duì)比的時(shí)候,它的標(biāo)準(zhǔn)是不同的。最基本的標(biāo)準(zhǔn)不同,你根本判斷出來(lái)的結(jié)果是不靠譜的。這個(gè)例子里面其實(shí)是getHost取得的那個(gè)值,沒(méi)有考慮反斜杠的問(wèn)題。我們反過(guò)來(lái)想一想,在其他的場(chǎng)合是不是也有這樣的東西呢?比如GS里面的域,當(dāng)取得這個(gè)域值的時(shí)候,是不是也會(huì)出現(xiàn)同樣的問(wèn)題?剩下來(lái)就是重新做了。其實(shí)這個(gè)做起來(lái)很簡(jiǎn)單,這個(gè)當(dāng)然是我最后從事的版本,前面我還做好幾款設(shè)置,寫一個(gè)APK,自動(dòng)化的打開這個(gè)瀏覽器,那個(gè)時(shí)候是想多了,后來(lái)發(fā)現(xiàn)這是很簡(jiǎn)單的一個(gè)方法。這里面只是一部分,還有一個(gè)部分,這個(gè)其實(shí)很簡(jiǎn)單,就是用這個(gè)框架去調(diào)用訪問(wèn)這么一些網(wǎng)址,自動(dòng)訪問(wèn)。然后我要捕獲異常是一樣的,我的同事寫的,他就寫了里面有一個(gè)判斷,不管你請(qǐng)求什么,我都會(huì)執(zhí)行這個(gè)命令,打印出當(dāng)時(shí)的這個(gè)域。很簡(jiǎn)單,只要你訪問(wèn)成功了,這是第一步,我要看當(dāng)前的域是不是這個(gè)結(jié)果,有沒(méi)有繞過(guò)。這個(gè)我跑下來(lái)的結(jié)果,第一個(gè)在Android平臺(tái)上面的QQ瀏覽器、微信,包括QQ,這些都存在UXSS,都跨域了。很簡(jiǎn)單,其實(shí)原理就是因?yàn)橛袃牲c(diǎn),他在處理IP和域名組合的時(shí)候,一般默認(rèn)的用這個(gè)點(diǎn)去分割了,到這兒直接分割了,他看到執(zhí)行的效果就是這樣,這個(gè)域其實(shí)是在QQ下面的。就相當(dāng)于你可以控制qq.com一個(gè)不存在的子域,你可以通過(guò)跨子域的一些方法,實(shí)現(xiàn)你的攻擊目的。這里攻擊的方法不在今天議題的范疇之內(nèi),就不介紹了,這個(gè)是截圖qq。
另外發(fā)現(xiàn)了Firefox平臺(tái)下面的UXSS,很簡(jiǎn)單,這個(gè)值就是兩個(gè),一個(gè)是11,還有一個(gè)12,也是一樣的效果。但是這個(gè)問(wèn)題,其實(shí)當(dāng)時(shí)我發(fā)現(xiàn)這個(gè)問(wèn)題大概在好幾個(gè)約制前就發(fā)現(xiàn)了,但是很可悲。我發(fā)現(xiàn)了就丟在那里沒(méi)管了,有一天我再去測(cè)試沒(méi)有了,怎么回事呢?我發(fā)現(xiàn)在論壇上面,我還找這個(gè)老外聊了一下,確實(shí)就是補(bǔ)的這個(gè)漏洞。我在這個(gè)例子里面就是說(shuō),第一個(gè)你要有跨域的想法,不要局限于現(xiàn)在這個(gè)漏洞模型,要發(fā)散思維,有沒(méi)有其他點(diǎn)。然后你一定要去跑,一定要去做。你只要去做了,就可以發(fā)現(xiàn)新的問(wèn)題。
今天我就講到這兒,謝謝大家!
潘柱廷:大家有沒(méi)有問(wèn)題問(wèn)一下黑哥?
提問(wèn):你現(xiàn)在通過(guò)這些方法,在實(shí)際的應(yīng)用于SQL方面挖掘的漏洞,還有在二進(jìn)制方面會(huì)有一些什么樣的心得和體會(huì)?
周景平:其實(shí)很多關(guān)注我的人知道,黑哥以前是做Web安全的,突然之間來(lái)了一個(gè)微軟的一百?gòu)?qiáng)里面的名單,報(bào)了很多瀏覽器的漏洞,這個(gè)里面其實(shí)主要是我身邊大牛比較多,朋友比較多,他們對(duì)我進(jìn)行了指導(dǎo),確實(shí)給了我很大的幫助,包括百度的一些交流,讓我受益匪淺。
另外一個(gè)我的優(yōu)勢(shì)在哪里呢?因?yàn)槲揖?2個(gè)VM。我的優(yōu)勢(shì)在哪里呢?我的想法可能比別人多一點(diǎn)。就是很多時(shí)候我看到人家的樣板,人家可能想到這個(gè)點(diǎn)測(cè)試就過(guò)了,我有可能就是在你的樣本基礎(chǔ)上,就類似于今天我提到這么一些方法。我發(fā)現(xiàn)有一些他們自己都沒(méi)有意識(shí)到的點(diǎn),我可能就做到了。后來(lái)我回顧了自己的整個(gè)職業(yè)技術(shù)生涯,我喜歡回顧一下自己。后來(lái)發(fā)現(xiàn)我的很多研究其實(shí)都是站在別人的基礎(chǔ)上去完成的,這個(gè)可能是我的一個(gè)弱勢(shì),或者說(shuō)也是我的一個(gè)強(qiáng)勢(shì)。
潘柱廷:如果給你1200個(gè)VM,會(huì)不會(huì)和現(xiàn)在不一樣?
周景平:我不太喜歡有壓力。當(dāng)有人給你投資源的時(shí)候,他是有要求的。當(dāng)你沒(méi)有資源的時(shí)候,你就覺(jué)得很牛。你看我就這么點(diǎn)條件,我都能做得這么好,是不是給你很多條件你就會(huì)做得更好了?那不一定,真不一定,有可能更失望,所以我寧愿保持現(xiàn)在這種狀態(tài)。
潘柱廷:說(shuō)到底還是計(jì)算密集型,黑哥更喜歡計(jì)算不密集型,他喜歡創(chuàng)意密集型。
周景平:我喜歡玩創(chuàng)意,比較猥瑣一點(diǎn),人也長(zhǎng)得比較猥瑣。