BMZCTF-ezeval 和 [WUSTCTF2020]樸實無華1 - supz
作者?| 楓澗
編輯?| 楌橪
日常練習(xí):BMZCTF-ezeval / [WUSTCTF2020]樸實無華1;
BMZCTF-ezeval
源代碼:

分析:我們通過POST方式,向cmd提交內(nèi)容,然后cmd經(jīng)過htmlsmecialchars()過濾,再使用str_ireplace()經(jīng)過黑名單black_list再過濾一次,最后eval()來執(zhí)行cmd參數(shù)的內(nèi)容;
其中,str_ireplace(find,replace,string, count)函數(shù);就是做替換的函數(shù),可以指定替換內(nèi)容中的哪一部分,比如:

然后對于這道題,我們發(fā)現(xiàn)array里面過濾了很多函數(shù),乍一看暫時想不到利用的方法,但其實我們很容易就可以繞過。分享以下兩種解法:
1.PHP里面,可以用'.'來進(jìn)行前后內(nèi)容的拼接;
2.可以考慮對一個東西進(jìn)行編碼嘗試;
也就是對應(yīng)的:
?cmd=(s.y.s.t.e.m)(cat /flag); //
黑名單
system
分成用
'.'
來進(jìn)行拼接的;
?cmd=hexbin(73797374656d)(cat /flag); //
對照
ascii
碼表把
system
每個字母的
ascii
碼值連在一起;
于是先用ls /得到flag的位置,再去cat獲取flag:



這道題嘗試用echo以及exec,但是由于htmlspecialchars對實體符號的限制,暫時利用不了,也可能我想的不夠全面,后面再看看有沒有其它利用方法;
[WUSTCTF2020]樸實無華1
打開題目,就一個hack me,嘗試看看存不存在robots.txt,果然存在東西,訪問/fAke_f1agggg.php

結(jié)果給了個假的flag,那包里邊應(yīng)該會存在內(nèi)容,嘗試抓包看一下;

我們可以看到藏了個/fl4g.php,訪問一下得到源代碼;

一共有3個level的過濾:

1. level_1:

分析:level_1是針對intval()的過濾,當(dāng)我們的intval()括號內(nèi)是一個string的數(shù)字和字符串混合內(nèi)容時,則返回的是這串內(nèi)容的第一位數(shù)字,而當(dāng)我們對這個字符型的內(nèi)容進(jìn)行加減乘除操作的時候,這串字符則會對應(yīng)地轉(zhuǎn)換為int或者double類型;
比如:

滿足了我們的num既要小于2020,還要在加1后大于2021,那么我們便可以通過?num=1e10來繞過,得到:

2. level_2:

分析:level_2是php弱類型比較;(感覺還帶了點(diǎn)md5碰撞問題的樣子),這里我們需要知道'=='兩個等號做比較的時候,會先將左右兩邊的內(nèi)容轉(zhuǎn)換為同一種類型的內(nèi)容再進(jìn)行比較。而在php中,如果有一串內(nèi)容以0e開頭,那么這串內(nèi)容會以科學(xué)計數(shù)法的形式表示,而0的次方就是0。所以,我們的思路就是通過找到一個0e開頭的值,且md5加密后的內(nèi)容也是0e開頭的,使得條件為真。
那么找到了滿足條件的值:0e215962017,拼在level_1的poc后邊兒?num=1e10&md5=0e215962017得到:

3. level_3:

分析:最終是先通過strstr()過濾了空格,再通過str_ireplace()過濾cat參數(shù),空格和這種簡單過濾字符串的繞過很簡單,舉幾個例子:

OK,回到這個題,我們先ls一下,看到了flag的那一坨名字:

最后結(jié)合上方的例子,可以得到一下幾種poc(為了方便看,我就把那一長串名字簡寫成flag):
?num=1e10&md5=0e215962017&get_flag=ca""t%09flag
?num=1e10&md5=0e215962017&get_flag=ca\t%09flag
?num=1e10&md5=0e215962017&get_flag=ca""t<flag< code="">
?num=1e10&md5=0e215962017&get_flag=ca""t$IFS$9flag
?num=1e10&md5=0e215962017&get_flag=ca""t$IFS$1flag
?num=1e10&md5=0e215962017&get_flag=ca""t${IFS}$1flag
最終拿到flag:
