本题考察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...
考察代码分析能力,看最后一个if:
if($key1 && $key2){ include "Hgfks.php"; echo "You're right"."\n"; echo $flag; }
也就是说,当key1、key2为1时即可文件包含Hgfks.php,那么接下来的思路就很简单了。
1.get传参a,满足isset($a) && intval($a) > 6000000 && strlen($a) <= 3
,则a为2e9即可
2.get传参b,满足isset($b) && '8b184b' === substr(md5($b),-6,6)
,
substr(md5($b),-6,6)用于提取b经过 MD5 加密后的字符串的最后 6 个字符,也就是说这6个字符要等于8b184b,首先想到的是将8b184b进行md5解密,再赋值给b。而md5是不可逆算法,故此法失效。
php的强比较利用环境一般为:
md5($a)===md5($b)
在这里也行不通
因此可以写一个脚本,通过遍历b并且做判断(这里判断b为纯数字)
故b为53724即可
3.再看参数c的要求:
$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; }
get传参经过json编码的c,且c为数组,数组c中的值m不是数字且m>2022;数组c中的值n为数组、数组n有两个元素且第一个元素也是数组。
对于m,当PHP中进行数字与字符的比较时,字符的前缀数字会被保留,即
33<34php=34
所以将m赋为2023v即可,而对于n,即可写成n[[x],y]的形式
而
$d = array_search("DGGJ", $c["n"]); $d === false?die("no..."):NULL; foreach($c["n"] as $key=>$val){ $val==="DGGJ"?die("no......"):NULL;
表示在n中查找为DGGJ的元素,找不到就终止脚本
利用当函数接入不符合类型,则返回0的特性,将n改为
n[[x],0]
如果找到DGGJ,也终止脚本,将n中的数组改为任意不是DGGJ的元素即可:
n[[1],0]
最后将c进行json编码即可
传参得到flag:
附言
在处理
isset($b) && '8b184b' === substr(md5($b),-6,6)
时,可以使用PHP循环及Python脚本得到变量b