[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()函数用来获取变量的整数值, 使用的时候常见的有两种情况
转换整数时,返回整数本身
转换字符串时, 会从字符串的开始进行转换,直到遇到一个非数字的字符,如果字符串的第一个字符不是整数,则返回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