题目
访问url进入靶场,阅读php代码
<?php
highlight_file(__FILE__);
$key1 = 0;//值赋值
$key2 = 0;
$a = $_GET['a'];//get方法获取值
$b = $_GET['b'];
if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){
//a的值需要大于 6000000,同时也需要长度小于3
if(isset($b) && '8b184b' === substr(md5($b),-6,6)){
//b的后六位md5值要等与8b184b
$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){
//c为数组,is_numeric是php内置函数判断是否为数字,题中不要数字,m键值要大于2022
if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){
$d = array_search("DGGJ", $c["n"]);//数组中找DGGJ,如果没找到DGGJ,die
$d === false?die("no..."):NULL;
foreach($c["n"] as $key=>$val){
$val==="DGGJ"?die("no......"):NULL;
}//匹配n的一个键值若等于DGGJ直接die
$key2 = 1;
}else{
die("no hack");
}
}else{
die("no");
}
if($key1 && $key2){
include "Hgfks.php";
echo "You're right"."\n";
echo $flag;
}
?> Emmm...
最核心的部分
既要search到 DGGJ 遍历时又不要DGGJ
这里用array_search函数的一个漏洞 待匹配的模式串里有0时会与字符串进行比较时,字符串也会转变为0,这样就算不出现DGGJ也可以返回1
参数a:使用科学技术法a=7e6
参数b:我直接抄的大佬的脚本b=53724
import hashlib
for i in range(100000):
m = hashlib.md5()
m.update(str(i).encode())
h = m.hexdigest()
if h[-6:] == "8b184b":
print(i)
break
参数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键值要大于2022php弱类型比较值为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则死亡
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
c={"m":"2023a","n":[[],0]}
构造payload:?a=6e7&b=53724&c={"m":"2023a","n":[[],0]}