攻防世界-easyphp
一上来就是一大串代码呼我脸上。。。
代码审计
if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){
if(isset($b) && '8b184b' === substr(md5($b),-6,6))
intval() :用于获取变量的整数值,默认返回的是十进制。
strlen():返回字符串的长度。
substr():返回字符串的一部分,例:substr(“Hello world”,6,-1),返回值是worl。
md5()函数对字符串进行md5()加密,md5(a[])结果为NULL。
变量a存在,整数值要大于6000000,且字符串长度小于等于三,那就只能是用科学计数法了,a=1e8。
变量b的求法:
<?php
for($i = 1;$i <= 1000000;$i++){
if('8b184b' === substr(md5($i),-6,6)){
echo $i;
}
}
?>
你要是能手算也不是不行(doge)。
返回值为53724,b=53724。
$c=(array)json_decode(@$_GET['c']);
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022)
json_decode():例:
<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
echo '<br>';
var_dump(json_decode($json, true));
?>
返回值:
C是数组,m不能是数字且要大于2022
if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0]))
count()函数:返回数组的元素个数
n必须是数组,元素个数为2,且n的第一个值是数组,就是套娃。
$d = array_search("DGGJ", $c["n"]);
$d === false?die("no..."):NULL;
foreach($c["n"] as $key=>$val){
$val==="DGGJ"?die("no......"):NULL;
Array_search():查找数组中的元素并返回其下标。
元素n的下标是DGGJ
但是如果n的下标是DGGJ,程序就会终止。。。。。。
那必须是绕过它才行,那该怎么绕啊
还是有办法的
这array_search()在查找元素的时候是进行弱类型比较,而在PHP里字符串==0是成立的,只要在不是0下标的其他位置的元素是0就行了。
综上,可以构造payload:
?a=1e9&b=53724&c={“m”:“2023q”,“n”:[[1,2],0]}