文章轉(zhuǎn)自freebuf,作者Ka1ier
前言
上次的那篇文章《一名代碼審計新手的實戰(zhàn)經(jīng)歷與感悟》得到了不少讀者的支持榴捡,也得到了freebuf這個平臺的肯定,這給了我這個菜的不能再菜的小菜鳥很大的信心朱浴。但是吊圾,不足之處還是很多,比如文章中出現(xiàn)的技術(shù)寫得不夠深入等等(這畢竟和個人實力掛鉤的)因此翰蠢,我決定盡我所能项乒,盡量的寫深入一點,每次寫文章都深入一點梁沧,總有一天會深到很深的點檀何。
本篇文章主要講述我在zzcms8.2中挖掘到的漏洞,freebuf上已經(jīng)有大佬寫了這個cms的代碼審計廷支,當然频鉴,其他的平臺也有人寫了。所以酥泞,我既然寫了砚殿,那么肯定是與他們的文章有所不同,漏洞也不同芝囤,攻擊方法也不同似炎,讓讀者讀有所獲辛萍。(新手可以考慮認真看看,后半部分有對于新手來說非常精彩的攻擊演示)
漏洞集合
目錄跳轉(zhuǎn)讀取敏感信息
在zzcms8.2/baojia/baojia.php的第四行羡藐,引用了zzcms8.2/inc/top.php這個文件贩毕,如圖:
我當時追蹤了一下這個文件良瞧,發(fā)現(xiàn)這個文件在引用的時候疹蛉,首先就進行了if邏輯判斷,而if邏輯判斷中翔脱,又有可控變量瘩扼。因此谆甜,我當時咋一看的時候,就很懷疑這里集绰,感覺這里總可能存在一些問題规辱。如圖:
于是,我就打開網(wǎng)頁看了一下栽燕,順便抓個包瞧瞧罕袋。結(jié)果一看,哎碍岔,有點意思浴讯,代碼是如果接受post請求,那么就執(zhí)行跳轉(zhuǎn)操作蔼啦。而我們主動發(fā)送的請求是get榆纽,那就說明這個漏洞黑盒是百分之八九十測不出來的。黑盒又不知道這里居然還可能有post請求询吴,就算測試post請求掠河,也不知道參數(shù)是什么亮元,因為前端壓根沒有這里的參數(shù)猛计。
在我的上一篇文章中,我也有個感覺黑盒測不出來的漏洞爆捞,但是評論區(qū)大佬有人留言說黑盒能測出來奉瘤,我仔細想了想,的確也有可能煮甥,因為當時那個漏洞前端能找到參數(shù)盗温。
可是,這里就不一樣了成肘,無法猜測卖局。莫名其妙的我就對白盒有了點小自豪,哈哈双霍⊙馀迹回歸主題批销,既然服務(wù)器端接收post請求,那么我就將get請求包利用burpsuite改造成post請求包染坯。
將get請求包的數(shù)據(jù)格式以及內(nèi)容改成post之后均芽,我先嘗試了構(gòu)造xss,但是經(jīng)過幾次嘗試单鹿,發(fā)現(xiàn)<">被html編碼掀宋,單引號被轉(zhuǎn)義。這就很尷尬了仲锄。
于是轉(zhuǎn)換思路劲妙,既然是跳轉(zhuǎn),那么能不能跳轉(zhuǎn)到敏感文件儒喊?或者跳轉(zhuǎn)到遠程文件呢是趴?如果要按跳轉(zhuǎn)思路,那么必須要進行截斷澄惊。而在目錄跳轉(zhuǎn)中唆途,問號偽截斷比較通用,不受版本限制掸驱。
如圖肛搬,我構(gòu)造了這樣的post請求包:
由于進行了偽截斷,所以我這里執(zhí)行的跳轉(zhuǎn)就是跳轉(zhuǎn)到服務(wù)器根目錄毕贼,讀取我本地的服務(wù)器根目錄敏感信息:
我不清楚真實的網(wǎng)站根目錄下是否也會存在這樣的漏洞温赔,但是,如果存在鬼癣,那么危害還是挺大的陶贼。
比如,目標網(wǎng)站有cdn待秃,但是你根據(jù)這個漏洞就可直接發(fā)現(xiàn)目標網(wǎng)站的真實IP拜秧,在本地進行域名和IP綁定后,就可以直接繞過cdn章郁。
邏輯漏洞導(dǎo)致個人敏感信息泄漏
在zzcms8.2/baojia/baojiaadd.php的183-213行中枉氮,如果在用戶的cookie中獲取到用戶名,那么將會提取出該用戶名的個人信息暖庄,回顯到瀏覽器頁面聊替。
比如公司名(這個感覺不重要),真實姓名培廓,手機號碼惹悄,emai。后面這三個信息我個人感覺是很重要的肩钠。會利用的人能利用出各種花樣泣港,這里我們只交流技術(shù)象缀,不談那些非法利用,因此這里如何利用這些信息我就不寫了爷速。
下圖是我回顯出的測試信息:
漏洞復(fù)現(xiàn)的方法非常簡單央星,只要你設(shè)置COOKIE的UserName為數(shù)據(jù)庫中真實存在的用戶名,那么就會得到該用戶的這些信息惫东。
下圖莉给,瀏覽器中的cookie信息
下圖,該王二狗用戶在我的數(shù)據(jù)庫中真實存在:
為了更加嚴謹一點的證明這個漏洞廉沮,我又注冊了一個test2用戶颓遏,并且注銷了test2用戶的登錄。然后滞时,構(gòu)造請求包:
成功獲得test2用戶的敏感信息:
前提是我數(shù)據(jù)庫中存在注冊過的test2用戶:
設(shè)計缺陷漏洞+CSRF=累死管理員并且讓網(wǎng)站業(yè)務(wù)無法正常運行H薄(前方高能)
唉,本來是挖漏洞的坪稽,結(jié)果邊挖漏洞曼玩,邊給人改BUG。窒百。黍判。
這里插入的字段數(shù)據(jù)庫中根本沒有,導(dǎo)致發(fā)布功能壓根無法實現(xiàn)篙梢,原因就是classid顷帖,被錯寫成了classzm。渤滞。贬墩。想挖這的漏洞,還得給他先改好BUG妄呕。陶舞。。幫助這個cms實現(xiàn)功能趴腋,我才好測試功能是否有漏洞利用吊说。。优炬。
所以,我個人是不建議新手費勁心思來挖這套cms厅贪,因為還有其他地方的功能存在錯誤蠢护,比如點擊目錄跳轉(zhuǎn)的鏈接會顯示“該文件不存在”,原因是程序員的跳轉(zhuǎn)路徑寫錯了养涮。葵硕。又比如驗證碼壓根不顯示眉抬,為了方便測試,我只能注釋掉檢驗驗證碼是否正確的代碼懈凹。蜀变。所以,對于這套cms介评,新手隨便挖幾個洞就可以了库北,代碼能力不強的要想練習(xí)改BUG技能,可以認真對待這套CMS们陆。
言歸正傳寒瓦,在對baojiaadd.php的測試中,我發(fā)現(xiàn)同一用戶可以反復(fù)的發(fā)布報價信息坪仇,雖然發(fā)布報價信息需要得到管理員的審核杂腰,但是并沒有對發(fā)布報價信息的用戶做出數(shù)量限制或者其他的限制(普通驗證碼在一些大佬眼中可以直接利用機器學(xué)習(xí)識別的,我這里由于驗證碼的功能并沒有實現(xiàn)椅文,所以我就直接后臺注釋了驗證碼喂很,在此前提下,有了后面的攻擊實驗)皆刺,那么這就給“調(diào)皮”的用戶留下可乘之機恤筛。
比如,我大量的發(fā)送具有迷惑性質(zhì)的報價信息芹橡,讓這些信息存入數(shù)據(jù)庫毒坛,并且讓讀取這些信息的審核人員無法分辨是否是真實用戶,那么這個漏洞就完全可以嚴重影響該網(wǎng)站的業(yè)務(wù)林说。所以煎殷,我給這個漏洞的評價是“高危”
漏洞出現(xiàn)的文件在zzcms8.2/baojia/baojiaadd.php中的183-242行以及274-313行腿箩。
我圖片中沒截取到的代碼部分豪直,是我覺得不影響理解漏洞,利用漏洞珠移,所以就沒截取弓乙。
上面兩幅圖實際上是我說的第二個漏洞,邏輯漏洞钧惧,但是當時只能讀取用戶私人敏感信息暇韧,在這里,因為我寫的exp順便就讀取了個人敏感信息浓瞪,需要用到那個邏輯漏洞的判斷邏輯懈玻,所以我就截取了,方便大家閱讀乾颁。而且之所以用到這個漏洞涂乌,是因為正規(guī)網(wǎng)站不會讓游客發(fā)帖艺栈,而這里貌似是可以的(我沒刻意去追蹤不偽造cookie能否發(fā)帖的文件,感興趣的讀者可以自己嘗試)湾盒,為了保險起見湿右,我就當作偽造cookie才能發(fā)帖。
下面兩幅圖是服務(wù)器端的處理邏輯
最后罚勾,附上我寫的偽造數(shù)據(jù)包之“洪水攻擊”exp腳本毅人,第一次寫exp,寫得不好多多見諒荧库!功能就是根據(jù)我們想偽造數(shù)據(jù)包的個數(shù)堰塌,進行個人信息偽造,同時打印返回包(返回包中能看到邏輯漏洞中的敏感信息分衫,我沒寫正則场刑,所以讀者可以自己改造)
exp腳本位置:
簡單說明一下,我寫的這個exp只是雛形蚪战,如果你想偽造的更像牵现,更難以排查,更難以被審核人員過濾邀桑,那么我腳本中的那些變量瞎疼,list,你可以加以改造壁畸,增加他們的數(shù)量以及不同的值贼急,利用暴力破解的思路組合成新的個人信息,就像生成新的字典那樣捏萍。
exp腳本攻擊演示:
輸入數(shù)字后太抓,就會一直發(fā)送數(shù)據(jù)包,直到發(fā)送5個為止令杈,會出現(xiàn)提示結(jié)束的信息走敌。這里可以在返回的html代碼中找到邏輯漏洞的敏感信息,用正則能匹配出來逗噩,我腳本中沒寫掉丽。。异雁。懶了捶障。。片迅。感興趣自己寫吧残邀。
為了證明我們的攻擊是有效的,我下面提供我的數(shù)據(jù)庫截圖:
像這里的用戶信息柑蛇,都可以通過改造我的exp或者讀者自己寫exp來實現(xiàn)芥挣。注意看我這里偽造的地址,電話耻台,郵箱空免,是不是很真實?其他的值也都可以做到這種地步盆耽,我這個exp只是提供思路蹋砚,進行簡單的攻擊演示。
總的來說摄杂,我覺得這個漏洞應(yīng)該屬于設(shè)計上的缺陷吧坝咐,不知道讀者是怎么定義這個漏洞的。
另外析恢,我一開始就覺得這里還有有CSRF漏洞墨坚,因為按道理來說,進行這類操作最好都要先token驗證一下映挂,可是這里并沒有驗證泽篮。在說點題外話,在我我進行CSRF頁面構(gòu)造的時候柑船,遇到一個urf8編碼的坑帽撑,導(dǎo)致我一度以為這里引用了token機制,但是怎么看前端源碼鞍时,服務(wù)器源碼都沒找到token機制亏拉。無意之間在html中看到自己寫的中文變成了亂碼,才忽然想到可能是編碼問題導(dǎo)致我CSRF總是失敗逆巍。于是我改了自己CSRF利用頁面的源碼及塘,果斷成功!
下面是我CSRF攻擊頁面的源碼:
綜上所述蒸苇,攻擊思路就是:在訪問流量比較大的網(wǎng)站掛上有CSRF攻擊的偽造網(wǎng)頁(可以做的逼真一點磷蛹,我這里并不逼真),或者想其他方法引誘大流量的互聯(lián)網(wǎng)網(wǎng)民來到你這個CSRF攻擊頁面溪烤,誘導(dǎo)他們點擊觸發(fā)CSRF攻擊的按鈕味咳,讓所有訪問這個大流量網(wǎng)站的人亦或是訪問這個CSRF頁面的人,都去瀏覽zzcms這個站并且發(fā)布報價信息檬嘀。同時槽驶,自己在本地利用腳本,對目標進行惡意發(fā)布報價的“洪水攻擊”(不知道怎么形容鸳兽,就這樣用洪水攻擊形容了)來掩蓋正常用戶的正常發(fā)布報價的業(yè)務(wù)請求掂铐,同時也要能夠盡可能的迷惑審核報價信息的管理人員,讓其無法輕易利用腳本或者過濾機制分辨哪種報價信息是真實用戶的業(yè)務(wù)請求,哪種報價信息是攻擊者惡意偽造的全陨。
只要有用戶進入我們這個CSRF頁面爆班,便會自動生成偽造信息。只要用戶點擊我們這個CSRF頁面的小電影“開始播放”按鈕辱姨,那么就會向zzcms站發(fā)送一次請求柿菩,報價信息便會存入zzcms的數(shù)據(jù)庫中,混淆其他的真實數(shù)據(jù)雨涛,影響網(wǎng)站業(yè)務(wù)枢舶,累死負責審核信息的管理員~
看下圖,偽造的信息成功進入了數(shù)據(jù)庫:
我點擊了兩次CSRF頁面的播放按鈕替久,所以就生成了兩條不同的數(shù)據(jù)凉泄。由于點擊完,還會再次刷新到此CSRF頁面蚯根,若用戶第一次點擊不明所以后众,還有可能再點擊一次。那么在流量非常大的情況下稼锅,就等于將非常大的流量放大兩到三倍去攻擊zzcms站點吼具。可以說矩距,很恐怖了拗盒。
如果想最大限度的進行DDos攻擊,那么還得補充相關(guān)知識锥债,比如陡蝇,什么情況下服務(wù)器解析最慢?我這里只提供思路哮肚。登夫。技術(shù)有限。允趟。
總的來說恼策,這思路結(jié)合了DDos攻擊、無線網(wǎng)干擾中的“洪水攻擊”思路潮剪,同時結(jié)合一些欺騙的藝術(shù)以及利用網(wǎng)站的邏輯漏洞/設(shè)計缺陷來完成的一次精彩攻擊涣楷。(盡管我偽造的頁面很簡陋,但是也不失為一次精彩的攻擊抗碰,不是嗎狮斗?)