攻防世界 easyphp
Easyphp?? 對于初學者其實一點也不easy哈
打開題目場景
<?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...經典的php代碼審計題
首先我們大致瀏覽一下,想要輸出flag
Flag的輸出與key1?&&?key2有關
key1?&&?key2又與我們通過get方式提交的a,b,c三個參數有關
a,b決定key1,c決定key2
我們一點點來看
參數a
if(isset($a)?&&?intval($a)?>?6000000?&&?strlen($a)?<=?3)
分析:
a的值需要大于?6000000,同時也需要長度小于3
嘗試 科學技術法 ?7e6
參數b
?if(isset($b)?&&?'8b184b'?===?substr(md5($b),-6,6))
分析:
b的后六位md5值要等與8b184b,這個需要使用腳本跑一下了,我偷懶這里使用一下最近很火的chatgpt
不得不說這個玩意是真的強
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
接下來是最難的
參數c
$c=(array)json_decode(@$_GET['c'])分析:
C參數應該是一個json數據,解析成數組
if(is_array($c)?&&?!is_numeric(@$c["m"])?&&?$c["m"]?>?2022)判斷c為數組 ?, is_numeric php內置函數判斷是否為數字,題中不要數字,m鍵值要大于2022
想到了php弱類型比較 ??寫一個2023a即可
?if(is_array(@$c["n"])?&&?count($c["n"])?==?2?&&?is_array($c["n"][0]))n必須為數組,鍵值有兩個,類似于[[*,*...],*]。
?$d?=?array_search("DGGJ",?$c["n"]);$d?===?false?die("no..."):NULL;array_search() 函數與?in_array() 一樣,在數組中查找一個鍵值。如果找到了該值,匹配元素的鍵名會被返回。如果沒找到,則返回 false
數組中找DGGJ,如果沒找到DGGJ,die,這里我們肯定找到了,接著往下執行
foreach($c["n"]?as?$key=>$val){$val==="DGGJ"?die("no......"):NULL;}$key2?=?1;在php中,三個等號“===”是全等比較運算符,用于比較兩個操作數的值是否相等,同時檢測它們的類型是否相同;只有兩邊的值和數據類型都相等時,運算結果才是TRUE
匹配n的一個鍵值若等于DGGJ直接die
不能存在DGGJ,但array_search()又要查找并且要有結果,矛盾,這里肯定要繞過,全等肯定無法繞過
查到array_search()的繞過
array_search()沒有設置strict參數(如果該參數被設置為 TRUE,則函數在數組中搜索數據類型和值都一致的元素),我們就可以用0和DGGJ進行弱比較,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}總結
以上是生活随笔為你收集整理的攻防世界 easyphp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DTX编解码原理New
- 下一篇: 我的世界服务器上次死亡位置,我的世界怎么