Web安全攻防世界05 easyphp(江苏工匠杯)
?問題描述
題目是這個(gè)樣子的:
發(fā)現(xiàn)自己編輯的東西有一部分沒有被發(fā)出來,怪不得閱讀量低到可憐...現(xiàn)在重新補(bǔ)上一些內(nèi)容,解題過程很羅嗦,對小白依然非常友好~
原因分析:
按照慣例,把源碼貼在這里逐行分析一下~
<?php highlight_file(__FILE__); //高亮文件 $key1 = 0; //變量key1=0 $key2 = 0; //變量key2=0$a = $_GET['a']; //變量a以get傳參 $b = $_GET['b']; //變量b以get傳參if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){ //如果 a不為空值,且a的值大于6000000,且a的長度<3 則執(zhí)行以下語句 參考https://www.php.net/manual/zh/function.intval.php a可為1e9if(isset($b) && '8b184b' === substr(md5($b),-6,6)){ //如果b不為零 且 字符串b末尾6位 md5編碼結(jié)果為'8b184b'$key1 = 1; //拿到key1=1;}else{ //如果變量b不滿足條件的話;die("Emmm...再想想"); //掛掉,輸出emmm...再想想}}else{ //如果變量a不滿足條件的話die("Emmm..."); //掛掉,輸出emmm... }$c=(array)json_decode(@$_GET['c']); //接受一個(gè) JSON 編碼的字符串C并且把它轉(zhuǎn)換為 PHP 值寫到數(shù)組array中 if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){ //如果C是數(shù)組,且$c["m"]不是數(shù)字或數(shù)字字符串且$c["m"]大于2022 參考https://www.php.net/manual/zh/function.is-numeric.phpif(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){ //如果c["n"]是數(shù)組 且c["n"]的元素值為2 且$c["n"][0])是數(shù)組 參考https://www.php.net/manual/zh/function.count.php#refsect1-function.count-parameters$d = array_search("DGGJ", $c["n"]); //d在數(shù)組c["n"]中搜索"DGGJ",如果匹配成功返回鍵值$d === false?die("no..."):NULL; //d 為 false的話,掛掉,輸出no...foreach($c["n"] as $key=>$val){ //檢查數(shù)組c["n"]$val==="DGGJ"?die("no......"):NULL; //如果c["n"]是"DGGJ",掛掉,輸出no......}$key2 = 1; //拿到key2=1;}else{ //如果不滿足d的條件die("no hack"); //輸出no hack} }else{ //如果不滿足c的條件die("no"); //輸出no }if($key1 && $key2){ //如果拿到了key1和key2include "Hgfks.php"; //運(yùn)行指定文件"Hgfks.php"echo "You're right"."\n"; //輸出"You're right"echo $flag; //掉落flag! }?>解題思路如下:
整個(gè)題目就是單純地在考驗(yàn)php語法,并且每個(gè)變量輸錯(cuò)了都有不同的提示,可以說是非常貼心了~
(順便說一下,我php語言是0基礎(chǔ)...還好最近在翻譯代碼的時(shí)候發(fā)現(xiàn)visual studio code:它在選中函數(shù)的時(shí)候可以直接跳轉(zhuǎn)到php手冊,對于小白真是太友好了,下載地址:Visual Studio Code - Code Editing. Redefined~)
1 根據(jù)第9行 if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3)? ?在變量a中寫入整數(shù)值大于6000000且長度小于3的字符串,可以查閱官方手冊intval()的介紹~
2 根據(jù)第10行?if(isset($b) && '8b184b' === substr(md5($b),-6,6))
? ?在變量b中寫入末尾md5為'8b184b'的字符串,我在印象里有MD5碰撞專用的網(wǎng)站;
3 根據(jù)第20行?if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022)
? ?在數(shù)組c的成員m中寫入不是數(shù)字或數(shù)組字符串且值大于2022的東西...可以查閱官方手冊!is_numeric()的相關(guān)介紹;
4?根據(jù)第21行?if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0]))
? ?在數(shù)組c的成員n中寫入元素值為2且c["n"][0])是數(shù)組的東西...可以查閱官方手冊!is_numeric()與is_array()的相關(guān)介紹;讀到這里已經(jīng)感覺C是一個(gè)套娃數(shù)組了...
? ?根據(jù)第22行?$d = array_search("DGGJ", $c["n"]);?
? ?如果"DGGJ"與$c["n"])的搜素結(jié)果匹配,且c["n"]不可以是"DGGJ"本身(第24~26有過濾);
5 根據(jù)第19行 $c=(array)json_decode(@$_GET['c']);
? ?c除了上述要求外,還需要是JSON 編碼。
解決方案:
本題目可以徒手解題,不需要下載工具~
像我一樣的0基礎(chǔ)小白可能需要攜帶一個(gè)php在線編輯器測試代碼運(yùn)行結(jié)果,我自己一般是用這個(gè):菜鳥教程在線編輯器 (runoob.com)~
對于$a,查詢關(guān)于intvtal()的信息:PHP: intval - Manual;可以看到intval(1e9)>?6000000~
在菜鳥編輯器上運(yùn)行一下~
然后傳到網(wǎng)站上試一下,get型直接在網(wǎng)址后傳參,可以看到判定已經(jīng)更改啦,有點(diǎn)小開心~
對于$b,寫入末尾md5碼為'8b184b'的字符串,這個(gè)好像在考MD5的碰撞,我找了很多現(xiàn)有的MD5碰撞的網(wǎng)站,都沒有得到自己想要的效果...大概是因?yàn)轭}目的要求稍微有點(diǎn)特殊...
(還是記錄備用一下,也許以后用得上,解碼速度非常快,關(guān)鍵是解密過程不像被拉去挖礦:
md5在線加密解密
MD5在線加密/解密/破解—MD5在線 (sojson.com)
還有三個(gè)寫得很棒的博文,主題都是腳本暴力破解MD5:
CTF之 MD5 爆破兩個(gè)例子_seen_in_hw的博客-CSDN博客_md5爆破
這個(gè)大佬是用python寫的腳本;
MD5碰撞_清風(fēng)--的博客-CSDN博客_md5碰撞
CTF強(qiáng)弱碰撞的常見解題思路:包括PHP弱比較、MD5弱比較、MD5強(qiáng)比較、MD5構(gòu)造特定字符串的講解,含經(jīng)典CTF題目講解的python腳本,超贊~
淺談md5弱類型比較和強(qiáng)碰撞 (qq.com)
CTF強(qiáng)弱碰撞的常見解題思路:包括PHP弱比較、MD5弱比較、MD5強(qiáng)比較、MD5構(gòu)造特定字符串的講解,含經(jīng)典CTF題目講解的php腳本,超贊~)
emm,最后還是自己寫一個(gè)簡單的腳本去運(yùn)行...
<?php for($b=1;$b<=100000;$b++){ //b從1到100000if(preg_match('/^8b184b/',substr(md5($b),-6,6))){ //匹配md5b的末尾為8b184becho $b; //輸出becho "\n";echo md5($b); //輸出md5echo "\n";} } ?>?b=53724,輸入一下試試看,反饋結(jié)果是通過判定啦~
對于$c已經(jīng)確認(rèn)是有2個(gè)元素的數(shù)組,c?=?array('m',?'n'),并且是json編碼;根據(jù)官方手冊對于intval的介紹PHP: intval - Manual,發(fā)現(xiàn)數(shù)字和字符加在一起可以繞過,且數(shù)字要前置:
根據(jù)上面的截圖,c[m]我們這里可以填寫“>2022的數(shù)字+字符”;我這里填寫的是“9001+空格”先按照正常的流程走一遍~
發(fā)現(xiàn)判定已經(jīng)更改為nohack,是通過c[m]的判定了~
然后再套用JSON編碼運(yùn)行一遍,就是把c["m"]='9001 '寫成c='{"m":"9001 "}';這里注意單引號要變成雙引號,因?yàn)楦鶕?jù)官方教程,寫單引號JSON是不會理你的~PHP: json_decode - Manual
(也不要在單引號前加轉(zhuǎn)義字符\,變成c='{"m":"'\9001?' "}';否則會被直接判定成非數(shù)字,值為0~emm...下面貼一下正確的運(yùn)行結(jié)果...)
array_search繞過可以參考博文:CTF中常見的 PHP 弱類型漏洞總結(jié) - 北極邊界安全團(tuán)隊(duì) - 博客園 (cnblogs.com)
因此我們直接為c[n0]賦予空值數(shù)組,保證可以通過is_array($c["n"][0])的判定,c[n1]賦予空值,即c=[[],0];繞過檢測~ 再通過在線編輯器運(yùn)行一下,確認(rèn)沒有反饋,是可以通過判定的~
?
?用JSON編碼再試一下,也是可以過判定的~?
現(xiàn)在把這一堆以get形式傳參~?
http://61.147.171.105:49675/?a=1e9&&b=53724&&c={"m":"9001 ","n":[[0],0]}搞定,最后的結(jié)果就是:cyberpeace{265d340c3cc47d2996c1907cac15210b}
解題步驟就是這樣子的~有疑問或者批評指正的地方歡迎留言~
話說右手抽筋,左手被凍出疤,這么矯情地碼字很不容易的,覺得寫得 哎喲不錯(cuò)喲 也可以給個(gè)贊鼓勵(lì)一下~
總結(jié)
以上是生活随笔為你收集整理的Web安全攻防世界05 easyphp(江苏工匠杯)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DTX-1800精度恢复,调教之路?
- 下一篇: Android版xx助手之天天酷跑外挂详