文章轉(zhuǎn)自freebuf,作者Ka1ier
前言
上次的那篇文章《一名代碼審計(jì)新手的實(shí)戰(zhàn)經(jīng)歷與感悟》得到了不少讀者的支持,也得到了freebuf這個(gè)平臺(tái)的肯定,這給了我這個(gè)菜的不能再菜的小菜鳥很大的信心。但是,不足之處還是很多,比如文章中出現(xiàn)的技術(shù)寫得不夠深入等等(這畢竟和個(gè)人實(shí)力掛鉤的)因此,我決定盡我所能,盡量的寫深入一點(diǎn),每次寫文章都深入一點(diǎn),總有一天會(huì)深到很深的點(diǎn)。
本篇文章主要講述我在zzcms8.2中挖掘到的漏洞,freebuf上已經(jīng)有大佬寫了這個(gè)cms的代碼審計(jì),當(dāng)然,其他的平臺(tái)也有人寫了。所以,我既然寫了,那么肯定是與他們的文章有所不同,漏洞也不同,攻擊方法也不同,讓讀者讀有所獲。(新手可以考慮認(rèn)真看看,后半部分有對(duì)于新手來(lái)說(shuō)非常精彩的攻擊演示)
漏洞集合
目錄跳轉(zhuǎn)讀取敏感信息
在zzcms8.2/baojia/baojia.php的第四行,引用了zzcms8.2/inc/top.php這個(gè)文件,如圖:

我當(dāng)時(shí)追蹤了一下這個(gè)文件,發(fā)現(xiàn)這個(gè)文件在引用的時(shí)候,首先就進(jìn)行了if邏輯判斷,而if邏輯判斷中,又有可控變量。因此,我當(dāng)時(shí)咋一看的時(shí)候,就很懷疑這里,感覺這里總可能存在一些問題。如圖:

于是,我就打開網(wǎng)頁(yè)看了一下,順便抓個(gè)包瞧瞧。結(jié)果一看,哎,有點(diǎn)意思,代碼是如果接受post請(qǐng)求,那么就執(zhí)行跳轉(zhuǎn)操作。而我們主動(dòng)發(fā)送的請(qǐng)求是get,那就說(shuō)明這個(gè)漏洞黑盒是百分之八九十測(cè)不出來(lái)的。黑盒又不知道這里居然還可能有post請(qǐng)求,就算測(cè)試post請(qǐng)求,也不知道參數(shù)是什么,因?yàn)榍岸藟焊鶝]有這里的參數(shù)。


在我的上一篇文章中,我也有個(gè)感覺黑盒測(cè)不出來(lái)的漏洞,但是評(píng)論區(qū)大佬有人留言說(shuō)黑盒能測(cè)出來(lái),我仔細(xì)想了想,的確也有可能,因?yàn)楫?dāng)時(shí)那個(gè)漏洞前端能找到參數(shù)。
可是,這里就不一樣了,無(wú)法猜測(cè)。莫名其妙的我就對(duì)白盒有了點(diǎn)小自豪,哈哈。回歸主題,既然服務(wù)器端接收post請(qǐng)求,那么我就將get請(qǐng)求包利用burpsuite改造成post請(qǐng)求包。
將get請(qǐng)求包的數(shù)據(jù)格式以及內(nèi)容改成post之后,我先嘗試了構(gòu)造xss,但是經(jīng)過(guò)幾次嘗試,發(fā)現(xiàn)<">被html編碼,單引號(hào)被轉(zhuǎn)義。這就很尷尬了。

于是轉(zhuǎn)換思路,既然是跳轉(zhuǎn),那么能不能跳轉(zhuǎn)到敏感文件?或者跳轉(zhuǎn)到遠(yuǎn)程文件呢?如果要按跳轉(zhuǎn)思路,那么必須要進(jìn)行截?cái)唷6谀夸浱D(zhuǎn)中,問號(hào)偽截?cái)啾容^通用,不受版本限制。
如圖,我構(gòu)造了這樣的post請(qǐng)求包:

由于進(jìn)行了偽截?cái)?,所以我這里執(zhí)行的跳轉(zhuǎn)就是跳轉(zhuǎn)到服務(wù)器根目錄,讀取我本地的服務(wù)器根目錄敏感信息:

我不清楚真實(shí)的網(wǎng)站根目錄下是否也會(huì)存在這樣的漏洞,但是,如果存在,那么危害還是挺大的。
比如,目標(biāo)網(wǎng)站有cdn,但是你根據(jù)這個(gè)漏洞就可直接發(fā)現(xiàn)目標(biāo)網(wǎng)站的真實(shí)IP,在本地進(jìn)行域名和IP綁定后,就可以直接繞過(guò)cdn。
邏輯漏洞導(dǎo)致個(gè)人敏感信息泄漏
在zzcms8.2/baojia/baojiaadd.php的183-213行中,如果在用戶的cookie中獲取到用戶名,那么將會(huì)提取出該用戶名的個(gè)人信息,回顯到瀏覽器頁(yè)面。

比如公司名(這個(gè)感覺不重要),真實(shí)姓名,手機(jī)號(hào)碼,emai。后面這三個(gè)信息我個(gè)人感覺是很重要的。會(huì)利用的人能利用出各種花樣,這里我們只交流技術(shù),不談那些非法利用,因此這里如何利用這些信息我就不寫了。
下圖是我回顯出的測(cè)試信息:

漏洞復(fù)現(xiàn)的方法非常簡(jiǎn)單,只要你設(shè)置COOKIE的UserName為數(shù)據(jù)庫(kù)中真實(shí)存在的用戶名,那么就會(huì)得到該用戶的這些信息。
下圖,瀏覽器中的cookie信息

下圖,該王二狗用戶在我的數(shù)據(jù)庫(kù)中真實(shí)存在:

為了更加嚴(yán)謹(jǐn)一點(diǎn)的證明這個(gè)漏洞,我又注冊(cè)了一個(gè)test2用戶,并且注銷了test2用戶的登錄。然后,構(gòu)造請(qǐng)求包:

成功獲得test2用戶的敏感信息:

前提是我數(shù)據(jù)庫(kù)中存在注冊(cè)過(guò)的test2用戶:

設(shè)計(jì)缺陷漏洞+CSRF=累死管理員并且讓網(wǎng)站業(yè)務(wù)無(wú)法正常運(yùn)行?。ㄇ胺礁吣埽?/h1>
唉,本來(lái)是挖漏洞的,結(jié)果邊挖漏洞,邊給人改BUG。。。

這里插入的字段數(shù)據(jù)庫(kù)中根本沒有,導(dǎo)致發(fā)布功能壓根無(wú)法實(shí)現(xiàn),原因就是classid,被錯(cuò)寫成了classzm。。。想挖這的漏洞,還得給他先改好BUG。。。幫助這個(gè)cms實(shí)現(xiàn)功能,我才好測(cè)試功能是否有漏洞利用。。。
所以,我個(gè)人是不建議新手費(fèi)勁心思來(lái)挖這套cms,因?yàn)檫€有其他地方的功能存在錯(cuò)誤,比如點(diǎn)擊目錄跳轉(zhuǎn)的鏈接會(huì)顯示“該文件不存在”,原因是程序員的跳轉(zhuǎn)路徑寫錯(cuò)了。。又比如驗(yàn)證碼壓根不顯示,為了方便測(cè)試,我只能注釋掉檢驗(yàn)驗(yàn)證碼是否正確的代碼。。所以,對(duì)于這套cms,新手隨便挖幾個(gè)洞就可以了,代碼能力不強(qiáng)的要想練習(xí)改BUG技能,可以認(rèn)真對(duì)待這套CMS。
言歸正傳,在對(duì)baojiaadd.php的測(cè)試中,我發(fā)現(xiàn)同一用戶可以反復(fù)的發(fā)布報(bào)價(jià)信息,雖然發(fā)布報(bào)價(jià)信息需要得到管理員的審核,但是并沒有對(duì)發(fā)布報(bào)價(jià)信息的用戶做出數(shù)量限制或者其他的限制(普通驗(yàn)證碼在一些大佬眼中可以直接利用機(jī)器學(xué)習(xí)識(shí)別的,我這里由于驗(yàn)證碼的功能并沒有實(shí)現(xiàn),所以我就直接后臺(tái)注釋了驗(yàn)證碼,在此前提下,有了后面的攻擊實(shí)驗(yàn)),那么這就給“調(diào)皮”的用戶留下可乘之機(jī)。
比如,我大量的發(fā)送具有迷惑性質(zhì)的報(bào)價(jià)信息,讓這些信息存入數(shù)據(jù)庫(kù),并且讓讀取這些信息的審核人員無(wú)法分辨是否是真實(shí)用戶,那么這個(gè)漏洞就完全可以嚴(yán)重影響該網(wǎng)站的業(yè)務(wù)。所以,我給這個(gè)漏洞的評(píng)價(jià)是“高?!?/p>
漏洞出現(xiàn)的文件在zzcms8.2/baojia/baojiaadd.php中的183-242行以及274-313行。

我圖片中沒截取到的代碼部分,是我覺得不影響理解漏洞,利用漏洞,所以就沒截取。

上面兩幅圖實(shí)際上是我說(shuō)的第二個(gè)漏洞,邏輯漏洞,但是當(dāng)時(shí)只能讀取用戶私人敏感信息,在這里,因?yàn)槲覍懙膃xp順便就讀取了個(gè)人敏感信息,需要用到那個(gè)邏輯漏洞的判斷邏輯,所以我就截取了,方便大家閱讀。而且之所以用到這個(gè)漏洞,是因?yàn)檎?guī)網(wǎng)站不會(huì)讓游客發(fā)帖,而這里貌似是可以的(我沒刻意去追蹤不偽造cookie能否發(fā)帖的文件,感興趣的讀者可以自己嘗試),為了保險(xiǎn)起見,我就當(dāng)作偽造cookie才能發(fā)帖。
下面兩幅圖是服務(wù)器端的處理邏輯


最后,附上我寫的偽造數(shù)據(jù)包之“洪水攻擊”exp腳本,第一次寫exp,寫得不好多多見諒!功能就是根據(jù)我們想偽造數(shù)據(jù)包的個(gè)數(shù),進(jìn)行個(gè)人信息偽造,同時(shí)打印返回包(返回包中能看到邏輯漏洞中的敏感信息,我沒寫正則,所以讀者可以自己改造)
exp腳本位置:
簡(jiǎn)單說(shuō)明一下,我寫的這個(gè)exp只是雛形,如果你想偽造的更像,更難以排查,更難以被審核人員過(guò)濾,那么我腳本中的那些變量,list,你可以加以改造,增加他們的數(shù)量以及不同的值,利用暴力破解的思路組合成新的個(gè)人信息,就像生成新的字典那樣。
exp腳本攻擊演示:

輸入數(shù)字后,就會(huì)一直發(fā)送數(shù)據(jù)包,直到發(fā)送5個(gè)為止,會(huì)出現(xiàn)提示結(jié)束的信息。這里可以在返回的html代碼中找到邏輯漏洞的敏感信息,用正則能匹配出來(lái),我腳本中沒寫。。。懶了。。。感興趣自己寫吧。

為了證明我們的攻擊是有效的,我下面提供我的數(shù)據(jù)庫(kù)截圖:

像這里的用戶信息,都可以通過(guò)改造我的exp或者讀者自己寫exp來(lái)實(shí)現(xiàn)。注意看我這里偽造的地址,電話,郵箱,是不是很真實(shí)?其他的值也都可以做到這種地步,我這個(gè)exp只是提供思路,進(jìn)行簡(jiǎn)單的攻擊演示。
總的來(lái)說(shuō),我覺得這個(gè)漏洞應(yīng)該屬于設(shè)計(jì)上的缺陷吧,不知道讀者是怎么定義這個(gè)漏洞的。
另外,我一開始就覺得這里還有有CSRF漏洞,因?yàn)榘吹览韥?lái)說(shuō),進(jìn)行這類操作最好都要先token驗(yàn)證一下,可是這里并沒有驗(yàn)證。在說(shuō)點(diǎn)題外話,在我我進(jìn)行CSRF頁(yè)面構(gòu)造的時(shí)候,遇到一個(gè)urf8編碼的坑,導(dǎo)致我一度以為這里引用了token機(jī)制,但是怎么看前端源碼,服務(wù)器源碼都沒找到token機(jī)制。無(wú)意之間在html中看到自己寫的中文變成了亂碼,才忽然想到可能是編碼問題導(dǎo)致我CSRF總是失敗。于是我改了自己CSRF利用頁(yè)面的源碼,果斷成功!
下面是我CSRF攻擊頁(yè)面的源碼:
綜上所述,攻擊思路就是:在訪問流量比較大的網(wǎng)站掛上有CSRF攻擊的偽造網(wǎng)頁(yè)(可以做的逼真一點(diǎn),我這里并不逼真),或者想其他方法引誘大流量的互聯(lián)網(wǎng)網(wǎng)民來(lái)到你這個(gè)CSRF攻擊頁(yè)面,誘導(dǎo)他們點(diǎn)擊觸發(fā)CSRF攻擊的按鈕,讓所有訪問這個(gè)大流量網(wǎng)站的人亦或是訪問這個(gè)CSRF頁(yè)面的人,都去瀏覽zzcms這個(gè)站并且發(fā)布報(bào)價(jià)信息。同時(shí),自己在本地利用腳本,對(duì)目標(biāo)進(jìn)行惡意發(fā)布報(bào)價(jià)的“洪水攻擊”(不知道怎么形容,就這樣用洪水攻擊形容了)來(lái)掩蓋正常用戶的正常發(fā)布報(bào)價(jià)的業(yè)務(wù)請(qǐng)求,同時(shí)也要能夠盡可能的迷惑審核報(bào)價(jià)信息的管理人員,讓其無(wú)法輕易利用腳本或者過(guò)濾機(jī)制分辨哪種報(bào)價(jià)信息是真實(shí)用戶的業(yè)務(wù)請(qǐng)求,哪種報(bào)價(jià)信息是攻擊者惡意偽造的。

只要有用戶進(jìn)入我們這個(gè)CSRF頁(yè)面,便會(huì)自動(dòng)生成偽造信息。只要用戶點(diǎn)擊我們這個(gè)CSRF頁(yè)面的小電影“開始播放”按鈕,那么就會(huì)向zzcms站發(fā)送一次請(qǐng)求,報(bào)價(jià)信息便會(huì)存入zzcms的數(shù)據(jù)庫(kù)中,混淆其他的真實(shí)數(shù)據(jù),影響網(wǎng)站業(yè)務(wù),累死負(fù)責(zé)審核信息的管理員~
看下圖,偽造的信息成功進(jìn)入了數(shù)據(jù)庫(kù):

我點(diǎn)擊了兩次CSRF頁(yè)面的播放按鈕,所以就生成了兩條不同的數(shù)據(jù)。由于點(diǎn)擊完,還會(huì)再次刷新到此CSRF頁(yè)面,若用戶第一次點(diǎn)擊不明所以,還有可能再點(diǎn)擊一次。那么在流量非常大的情況下,就等于將非常大的流量放大兩到三倍去攻擊zzcms站點(diǎn)??梢哉f(shuō),很恐怖了。
如果想最大限度的進(jìn)行DDos攻擊,那么還得補(bǔ)充相關(guān)知識(shí),比如,什么情況下服務(wù)器解析最慢?我這里只提供思路。。技術(shù)有限。。
總的來(lái)說(shuō),這思路結(jié)合了DDos攻擊、無(wú)線網(wǎng)干擾中的“洪水攻擊”思路,同時(shí)結(jié)合一些欺騙的藝術(shù)以及利用網(wǎng)站的邏輯漏洞/設(shè)計(jì)缺陷來(lái)完成的一次精彩攻擊。(盡管我偽造的頁(yè)面很簡(jiǎn)陋,但是也不失為一次精彩的攻擊,不是嗎?)