攻防世界 easyphp
Easyphp?? 對(duì)于初學(xué)者其實(shí)一點(diǎn)也不easy哈
打開題目場(chǎng)景
<?php highlight_file(__FILE__); $key1?=?0; $key2?=?0;$a?=?$_GET['a']; $b?=?$_GET['b'];if(isset($a)?&&?intval($a)?>?6000000?&&?strlen($a)?<=?3){if(isset($b)?&&?'8b184b'?===?substr(md5($b),-6,6)){$key1?=?1;}else{die("Emmm...再想想");}}else{die("Emmm..."); }$c=(array)json_decode(@$_GET['c']); if(is_array($c)?&&?!is_numeric(@$c["m"])?&&?$c["m"]?>?2022){if(is_array(@$c["n"])?&&?count($c["n"])?==?2?&&?is_array($c["n"][0])){$d?=?array_search("DGGJ",?$c["n"]);$d?===?false?die("no..."):NULL;foreach($c["n"]?as?$key=>$val){$val==="DGGJ"?die("no......"):NULL;}$key2?=?1;}else{die("no?hack");} }else{die("no"); }if($key1?&&?$key2){include?"Hgfks.php";echo?"You're?right"."\n";echo?$flag; }?>?Emmm...經(jīng)典的php代碼審計(jì)題
首先我們大致瀏覽一下,想要輸出flag
Flag的輸出與key1?&&?key2有關(guān)
key1?&&?key2又與我們通過(guò)get方式提交的a,b,c三個(gè)參數(shù)有關(guān)
a,b決定key1,c決定key2
我們一點(diǎn)點(diǎn)來(lái)看
參數(shù)a
if(isset($a)?&&?intval($a)?>?6000000?&&?strlen($a)?<=?3)
分析:
a的值需要大于?6000000,同時(shí)也需要長(zhǎng)度小于3
嘗試 科學(xué)技術(shù)法 ?7e6
參數(shù)b
?if(isset($b)?&&?'8b184b'?===?substr(md5($b),-6,6))
分析:
b的后六位md5值要等與8b184b,這個(gè)需要使用腳本跑一下了,我偷懶這里使用一下最近很火的chatgpt
不得不說(shuō)這個(gè)玩意是真的強(qiáng)
import hashlibfor i in range(100000):m = hashlib.md5()m.update(str(i).encode())h = m.hexdigest()if h[-6:] == "8b184b":print(i)break得到b為53724
接下來(lái)是最難的
參數(shù)c
$c=(array)json_decode(@$_GET['c'])分析:
C參數(shù)應(yīng)該是一個(gè)json數(shù)據(jù),解析成數(shù)組
if(is_array($c)?&&?!is_numeric(@$c["m"])?&&?$c["m"]?>?2022)判斷c為數(shù)組 ?, is_numeric php內(nèi)置函數(shù)判斷是否為數(shù)字,題中不要數(shù)字,m鍵值要大于2022
想到了php弱類型比較 ??寫一個(gè)2023a即可
?if(is_array(@$c["n"])?&&?count($c["n"])?==?2?&&?is_array($c["n"][0]))n必須為數(shù)組,鍵值有兩個(gè),類似于[[*,*...],*]。
?$d?=?array_search("DGGJ",?$c["n"]);$d?===?false?die("no..."):NULL;array_search() 函數(shù)與?in_array() 一樣,在數(shù)組中查找一個(gè)鍵值。如果找到了該值,匹配元素的鍵名會(huì)被返回。如果沒(méi)找到,則返回 false
數(shù)組中找DGGJ,如果沒(méi)找到DGGJ,die,這里我們肯定找到了,接著往下執(zhí)行
foreach($c["n"]?as?$key=>$val){$val==="DGGJ"?die("no......"):NULL;}$key2?=?1;在php中,三個(gè)等號(hào)“===”是全等比較運(yùn)算符,用于比較兩個(gè)操作數(shù)的值是否相等,同時(shí)檢測(cè)它們的類型是否相同;只有兩邊的值和數(shù)據(jù)類型都相等時(shí),運(yùn)算結(jié)果才是TRUE
匹配n的一個(gè)鍵值若等于DGGJ直接die
不能存在DGGJ,但array_search()又要查找并且要有結(jié)果,矛盾,這里肯定要繞過(guò),全等肯定無(wú)法繞過(guò)
查到array_search()的繞過(guò)
array_search()沒(méi)有設(shè)置strict參數(shù)(如果該參數(shù)被設(shè)置為 TRUE,則函數(shù)在數(shù)組中搜索數(shù)據(jù)類型和值都一致的元素),我們就可以用0和DGGJ進(jìn)行弱比較,0 == 'DGGJ'又0===='DGGJ'為false
即n的值中有0成功了寫payload
?a=6e7&b=53724&c={"m":"2023a","n":[[],0]}提交payload???????
You're right cyberpeace{15ad787a1de7cf92b7fd50ee19e3c5cb}提交
cyberpeace{15ad787a1de7cf92b7fd50ee19e3c5cb}總結(jié)
以上是生活随笔為你收集整理的攻防世界 easyphp的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: DTX编解码原理New
- 下一篇: php自定义微博尾巴,怎么自定义微博小尾