xctf_easyphp

发布时间 2023-05-23 21:52:57作者: ntrack

easyphp

类型:PHP代码审计

1.审查传值

image-20230523201936576

image-20230523202306976

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)

分析:

  1. 要求传入a值,并且a的整数值要大于6000000,还要a的长度小于等于3

     通过php的弱比较可以想到输入a=1e9,e代表科学计数法。
    
  2. 要求传入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())
    
    
  3. 传入json格式的c值,并将其转化为PHP数组变量

    json格式的字符串:
    {"a":"php","b":"mysql","c":3}	//其中可以理解a为键,php为值
    
  4. 要求数组c中m的值不可以是纯数字,且需要大于2022

    ​ 看到使用弱比较,所以使得

  5. 要求数组的n具有两个元素,并且第一个元素还是数组

  6. 通过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]}