[NSSCTF 2022 Spring Recruit]babyphp

[NSSCTF 2022 Spring Recruit]babyphp

先上源代码

<?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";
}
?>

题目分析

首先分析第一次判断的三个函数

isset()、preg_match(),intval()

isset() 是来判断参数是否存在,那么就只需要传入a

!preg_match=true 这个涉及到这个函数下面的的第一个特性

  • 只能判断字符串,传入数组返回0
  • . 不匹配换行符
  • PRCE回溯

intval 特性

intval()函数用来获取变量的整数值, 使用的时候常见的有两种情况

  1. 转换整数时,返回整数本身

  2. 转换字符串时, 会从字符串的开始进行转换,直到遇到一个非数字的字符,如果字符串的第一个字符不是整数,则返回0

这里上个截图,具体原理也不是很清楚,之前在网上也没有找到资料也是测试代码测出来的

第二、三层就涉及到md5漏洞

哈希碰撞

当无限的数据集映射到有限的数据集必然存在重复

$b2=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2

$b1=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2

数组绕过

当MD5()中的参数传入为数组时,返回NULL

b1[]=1&b2[]=2

最后一层,MD5弱类型比较

MD5弱类型比较漏洞(0e绕过)

网上找一些

0e215962017 0e291242476940776845150308577824

0e1284838308 0e708279691820928818722257405159

0e1137126905 0e291659922323405260514745084877

0e807097110 0e318093639164485566453180786895

0e730083352 0e870635875304277170259950255928
posted @ 2023-03-07 21:07  張冰冰  阅读(492)  评论(0编辑  收藏  举报