CTFweb類型(二十七)gopher對(duì)mysql的利用及例題講解
本次來講一下gopher協(xié)議在MySQL中的利用,其實(shí)CTF題目中已經(jīng)有出現(xiàn)過了,比如說紅帽杯還有CTF都有出現(xiàn)過,不管是像之前講的Redis還是MySQL,就是這種協(xié)議的利用,都是有可以做轉(zhuǎn)化,現(xiàn)在我們講的只是一個(gè)demo,畢竟這些協(xié)議最終它的本質(zhì)其實(shí)都是對(duì)MySQL,對(duì)Redis的一個(gè)使用,但是應(yīng)用能夠擴(kuò)展成什么類型的題目,都可以在變。
先講一下對(duì)MySQL的利用:
我這邊創(chuàng)建一個(gè)demo,簡(jiǎn)單了解一下。到時(shí)候你也可以去拿本地測(cè)試,先把后面的對(duì)數(shù)據(jù)庫(kù)應(yīng)用找到,然后我們?cè)偃ブv探測(cè),現(xiàn)在我們假設(shè)已經(jīng)發(fā)現(xiàn)了這個(gè)地方存在SSRF就能夠發(fā)請(qǐng)求,然后也發(fā)現(xiàn)里面有MySQL,也確認(rèn)了MySQL就是沒有密碼?;谶@種前提,如何對(duì)它實(shí)現(xiàn)一個(gè)利用?
首先,我們要理解一下,在講Redis的時(shí)候利用gopher協(xié)議,是對(duì)let is做一些類似于操作的行為,比如說設(shè)置值,然后去設(shè)置一個(gè)輸出文件的位置,其實(shí)就是去使用命令在MySQL無密碼的狀態(tài)下,其實(shí)跟Redis基本是一個(gè)思路。也是通過gopher協(xié)議直接對(duì)它做一個(gè)操作,比如說我們現(xiàn)在已經(jīng)確定了,SSRF數(shù)據(jù)庫(kù)中有這個(gè)數(shù)據(jù)庫(kù)。
你可以做一個(gè)登錄,數(shù)據(jù)庫(kù)中有個(gè)數(shù)據(jù)表,就是SSRF然后數(shù)據(jù)表中都存在一個(gè)flag,相當(dāng)于我要去拿SSRF數(shù)據(jù)庫(kù)中的SSRF張數(shù)據(jù)表的數(shù)據(jù),正常情況下我們?nèi)サ卿浫タ吹嚼锩娴降子心男?shù)據(jù)庫(kù),然后去查庫(kù)里的表,我們就拿到數(shù)據(jù)了。
?gopher協(xié)議對(duì)MySQL的利用

總的來說登錄數(shù)據(jù)庫(kù)查詢數(shù)據(jù)這樣去操作,既然講到gopher協(xié)議去發(fā)請(qǐng)求,請(qǐng)求肯定是有流量的。必然有在連接狀態(tài)下做一個(gè)操作。MySQL數(shù)據(jù)庫(kù)它是能夠有遠(yuǎn)程連接的,所以存在一個(gè)遠(yuǎn)程鏈接的操作方法。

MySQL中如果用命令行下,你可以用-h后跟IP,以及設(shè)置端口等等,圖形化界面可以去填I(lǐng)P地址,這賬號(hào)密碼就連上去了,連上去之后,要wireshark去抓數(shù)據(jù)包,就看到MySQL的一些操作內(nèi)容。比如說剛才講了我們整個(gè)操作過程首先登錄數(shù)據(jù)庫(kù),在查詢數(shù)據(jù)。

所以你會(huì)看這個(gè)地方連上去了,紅色的數(shù)據(jù)發(fā)給數(shù)據(jù)庫(kù)的數(shù)據(jù),藍(lán)色的數(shù)據(jù)數(shù)據(jù)庫(kù)返還給我們的一個(gè)數(shù)據(jù),下面就是一個(gè)實(shí)際的數(shù)據(jù)。只不過這個(gè)數(shù)據(jù)我們接下來,因?yàn)樗侵竿ㄟ^MySQL給抓出來的,接下來的話我們通過用gopher協(xié)議去做一個(gè)發(fā)送。用curl模擬,轉(zhuǎn)化過程在這里,后面就是一個(gè)整合過程比如說我這邊去開一個(gè)MySQL、wireshark。因?yàn)镵ali里面像MySQL、wireshark等工具,它都自帶了,就方便一點(diǎn)。

注意一下,現(xiàn)在相當(dāng)于用了本地的數(shù)據(jù)庫(kù),去查詢的時(shí)候,發(fā)現(xiàn)這里其實(shí)是沒有任何波動(dòng)的,其實(shí)像我這些操作,是沒有走網(wǎng)卡。像wireshark都是一些網(wǎng)卡所以說的話,要實(shí)現(xiàn)wireshark抓取MySQL的操作行為,必須讓MySQL走網(wǎng)卡,就要MySQL做遠(yuǎn)程連接。MySQL -h 127.0.0.1 -u ssrf_user -p肯定能抓到流量,我們確認(rèn)之后,我們就可以確認(rèn)網(wǎng)卡,看哪個(gè)地方會(huì)有波峰波谷,確定好了登錄進(jìn)去。協(xié)議出來后去做查詢,相當(dāng)于我整個(gè)過程就已經(jīng)完成了。


第1個(gè),這是一個(gè)登錄操作,這個(gè)地方你就會(huì)看到他的一些請(qǐng)求的數(shù)據(jù)。


這邊要做協(xié)議做轉(zhuǎn)化,把它轉(zhuǎn)化成gopher協(xié)議,接下來就是我們關(guān)注的一個(gè)重點(diǎn)內(nèi)容了。之前經(jīng)常提到的URL編碼其實(shí)相當(dāng)于轉(zhuǎn)化成一些16進(jìn)制的字符,16進(jìn)制字符,理論上來說,用http請(qǐng)求數(shù)據(jù)做了URL編碼之后,其實(shí)也是可以做傳遞的。

轉(zhuǎn)化過程中的話,對(duì)這種數(shù)據(jù)做處理其實(shí)是會(huì)比較麻煩的,因?yàn)槟阒苯影阉?dāng)成點(diǎn)的話,其實(shí)不一定是真實(shí)的數(shù)據(jù)。最好用它的原始數(shù)據(jù),選中它的原始數(shù)據(jù)做操作。要做登錄操作,肯定要把登錄的數(shù)據(jù)給拿出來,可以看一下我們?nèi)绾无D(zhuǎn)化


有了請(qǐng)求數(shù)據(jù)之后,我們主要是對(duì)它來實(shí)現(xiàn)一個(gè)URL編碼,現(xiàn)在已經(jīng)是16進(jìn)制狀態(tài)了,其實(shí)你只要把兩兩分割就行了,這樣已經(jīng)兩兩拆分了。


我這樣子就可以了,相當(dāng)于給他做了一整串url編碼。這邊就能夠?qū)崿F(xiàn)一個(gè)登錄操作,直接先看一下它效果。接下來要做的就是查詢語句,是包含在這么兩個(gè)東西之內(nèi)的。第1個(gè)00?00?00?03這是一個(gè)查詢語句,然后select * from ssrf.ssrf 然后01 00?00?00?01你可以看到的其實(shí)是這個(gè)數(shù)據(jù)內(nèi)容,這個(gè)其實(shí)是這邊可以拷貝出來更對(duì)比一下。
?

其實(shí)我們已經(jīng)查詢成功了,那么我們其實(shí)就只要把拷貝一下,發(fā)送過來,就已經(jīng)能夠成功了,其實(shí)整個(gè)思路轉(zhuǎn)化過程還是比較簡(jiǎn)單的。再回過頭來看,如果真的發(fā)現(xiàn)一個(gè)接口,要去做的第1件事情就是去測(cè)試,看能不能發(fā)請(qǐng)求。各種方法嘗試一下,數(shù)據(jù)返回,說明對(duì)外能夠發(fā)請(qǐng)求,80端口開的??赡芩且环Ncurl_exec的PHP函數(shù),第2種可能調(diào)用我們系統(tǒng)的curl,如果是系統(tǒng)curl。


如果是第1種情況的話,考慮能否繞過,然后實(shí)現(xiàn)一個(gè)系統(tǒng)命令執(zhí)行,這個(gè)就是比較容易好想法的,就是系統(tǒng)的命令執(zhí)行。
如果是第2 種的話,基本上來說去執(zhí)行系統(tǒng)命令就困難了,整體思路可能就變了,要看一下curl的本身的一個(gè)操作行為了,本身是能夠發(fā)起發(fā)出一個(gè)命令的,你的思路就是集中在能夠發(fā)請(qǐng)求的點(diǎn)上。
