[xctf] 江苏工匠杯easyphp
[xctf] 江蘇工匠杯easyphp
考點
PHP弱類型
一、題目
<?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...二、WP
? 分析以下代碼,分別有a、b、c三個條件,只要當這三個條件都滿足的時候,就會輸出Flag,a和b都比較簡單,所以說本題的考點為參數c的array_search繞過
1、參數a
? 代碼的大概意思為:將a的值轉換為整數,然后需要滿足大于6000000 同時長度小于等于 3,我們直接使用科學技術法。
? a=6e9
2、參數b
? 代碼含義為:將b的值進行md5加密,當加密后的值后6位為8b184b的時候,就會進行到下一個判斷,我們直接使用腳本跑一下,得到的結果為53724
3、參數c
? 接下來就是本題的重點,搞了好久才研究出來/(ㄒoㄒ)/~~。
①、根據第一行代碼可知,傳入的c應該是一段JSON的數據,然后解析為數組。
②、首先判斷Json中Key為m的Value不能為數字,并且需要大于2022,這個簡單只需要利用php的弱類型比較,將m賦值為2023開頭的字符串即可,這里將其賦值為2023a
③、然后對key為n的value進行判斷,要求n必須為一個數組,并且value的數量必須為2,并且n的第一個value又必須為一個數組。然后有意思的來了,題目要求第一次用array_search搜索的時候,必須在n中含有DGGJ,但是接下來的代碼是循環查看數組中是否含有DGGJ,如果含有的話就直接die了。
④、經過參考array_search的官方文檔,發現當使用in_array() 或array_search()函數時,如果strict參數沒有設置為true,則in_array()或array_search()將使用松散來判斷。
這里用代碼來演示一下什么是松散判斷
$array = ['a',0,1,2,'3']; var_dump(in_array('abc', $array)); //True,下標為1(查看是否在數組中) var_dump(array_search('abc', $array)); //搜索abc字符串在數組中出現的第一個下標在array數組中查找abc,我們可以發現其實數組中并沒有abc,但是因為松散判斷,匹配到了數字0,其實和var_dump("admin" == 0); //結果true同理
發現此漏洞的話,我們就可以將數組c中的第二個值設置為0,這樣會滿足array_search()的條件,同時也不存在DGGJ。
最終我們的payload為
?a=6e9&b=53724&c={ "m":"2023a", "n":[[],0] }條件,同時也不存在DGGJ。
最終我們的payload為
?a=6e9&b=53724&c={ "m":"2023a", "n":[[],0] }總結
以上是生活随笔為你收集整理的[xctf] 江苏工匠杯easyphp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 亚马逊,当之无愧的云计算时代拓荒者
- 下一篇: DT时代下数据安全运营面临的主要挑战