目录

[NSSCTF 2022 Spring Recruit]babyphp

目录

[NSSCTF 2022 Spring Recruit]babyphp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
highlight_file(__FILE__);
include_once('flag.php');
if(isset($_POST['a'])&&!preg_match('/[0-9]/',$_POST['a'])&&intval($_POST['a'])){
    if(isset($_POST['b1'])&&$_POST['b2']){
        if($_POST['b1']!=$_POST['b2']&&md5($_POST['b1'])===md5($_POST['b2'])){
            if($_POST['c1']!=$_POST['c2']&&is_string($_POST['c1'])&&is_string($_POST['c2'])&&md5($_POST['c1'])==md5($_POST['c2'])){
                echo $flag;
            }else{
                echo "yee";
            }
        }else{
            echo "nop";
        }
    }else{
        echo "go on";
    }
}else{
    echo "let's get some php";
}
?>

根据代码意思,获得 flag 需满足以下条件:

  1. 参数 a 有传值、参数 a 的值不包含数字、参数 a 的值可以转换成数字
  2. 参数 b1 有传值、参数 b2 的值为 true
  3. 参数 b1 的值和参数 b2 的值不相等、参数 b1 的值和参数 b2 的值经 MD5 加密后相等(强类型比较)
  4. 参数 c1 的值和参数 c2 的值不相等、参数 c1 的值和参数 c2 的值均为字符串、参数 c1 的值和参数 c2 的值经 MD5 加密后相等(弱类型比较)

bypass:

  1. 参数 a 为非空数组:a[]=1 or a[]=a

    相关实验

    https://pic.imgdb.cn/item/6556be59c458853aefbd94e4.jpg

  2. 和 3. 参数 b1 和参数 b2 为不同内容的非空数组:b1[]=1&b2[]=2

    相关实验

    非空数组转为 bool 类型为 true:

    https://pic.imgdb.cn/item/6556c45ac458853aefc9c33e.jpg

    md5() 函数无法处理数组,返回NULL。(NULL===NULL) 转为 bool 类型为 true

    https://pic.imgdb.cn/item/6556c4e9c458853aefcae2f4.jpg

  3. c1=s878926199a&c2=s155964671a

    相关实验

    php 在处理哈希字符串的时候,会把以 0e 开头并且后面字符均为纯数字的哈希值都解析为 0

    MD5 加密后以 0e 开头的字符串:

    • QNKCDZO
    • 240610708
    • s878926199a
    • s155964671a

    https://pic.imgdb.cn/item/6556c92ec458853aefd3a133.jpg

payload:a[]=1&b1[]=1&b2[]=2&c1=s878926199a&c2=s155964671a

https://pic.imgdb.cn/item/6556ca0cc458853aefd5a5d8.jpg