类型:PHP代码审计
1.审查传值
2.观看分析条件
从上往下看:
1.if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3)
2.if(isset($b) && '8b184b' === substr(md5($b),-6,6))
3.$c=(array)json_decode(@$_GET['c'])
4.if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022)
5.if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0]))
6.$d = array_search("DGGJ", $c["n"]);
7.$d === false?die("no..."):NULL;
8.foreach($c["n"] as $key=>$val){
$val==="DGGJ"?die("no......"):NULL;
}
8.if($key1 && $key2)
分析:
-
要求传入a值,并且a的整数值要大于6000000,还要a的长度小于等于3
通过php的弱比较可以想到输入a=1e9,e代表科学计数法。
-
要求传入b值,并且b值的md5哈希值的后6位为8b184b
通过使用python写个码来实现暴力破解,最终值为53724
import hashlib def find_collision(test): counter = 0 # 暴力破解 while True: message = str(counter) md5 = hashlib.md5(message.encode()).hexdigest() # 获取后6位为8b184b的MD5加密码 if md5[-6:6] == test: return message else: print("error") counter += 1 # 代入测试 test = '8b184b' message = find_collision(test) print("Message:", message) print("MD5(Message):", hashlib.md5(message.encode()).hexdigest())
-
传入json格式的c值,并将其转化为PHP数组变量
json格式的字符串: {"a":"php","b":"mysql","c":3} //其中可以理解a为键,php为值
-
要求数组c中m的值不可以是纯数字,且需要大于2022
看到使用弱比较,所以使得
-
要求数组的n具有两个元素,并且第一个元素还是数组
-
通过6和7判断出,6知道数组n中需要有”DGGJ“的值,7知道数组n中不可以有“DGGJ”的值
array_search()函数 结果:如果找不到DGGJ就返回FALSE,找到返回key 分析:该函数使用的是弱比较,知道字符串开头的字符串==0,所以"DGGJ"==0 成立
所以更正n:
综上所述:
payload:?a=1e9&b=53724&c={"m":"1e4c","n":[[1],0]}
标签:数组,array,&&,easyphp,message,DGGJ,xctf,md5 From: https://www.cnblogs.com/ntrack/p/17426518.html