目录
基础知识
①md5的弱比较
0e开头跟数字的字符串0exxxx,会当作科学计数法去比较,相当于0的xxxx次方,所以和0相等
②php的弱比较
php中两种比较符号
==:先自动转化成相同类型,再比较值
===:先判断两种字符串的类型是否相等,再比较值
if("admin"==0) //true
if("1admin"==1)//true
if("admin1"==1)//false
if("0e12345"=="0e1324")//true
php弱比较中,如果数字和字符串比较,字符串转换成数字的过程中,会取字符串前面数字的值作为整个字符串转换成数字的值。
比较“1admin”,转换成数字就是1
比较"admin1",因为字符串没有数字,只能转换成0了
③is_numeric()函数
如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回 1,即 TRUE。
解题步骤
查看源码
注释在代码段中
I put something in F12 for you
include 'flag.php';
$flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';
if(isset($_GET['gg'])&&isset($_GET['id'])) { //传参方式为GET型
$id=$_GET['id'];
$gg=$_GET['gg'];
if (md5($id) === md5($gg) && $id !== $gg) { //md5弱类型比较
echo 'You got the first step';
if(isset($_POST['passwd'])) {
$passwd=$_POST['passwd'];
if (!is_numeric($passwd))
//is_numeric()函数,它判断参数是否为数字或者数字字符串
//不是数字或者不是数字字符串就返回true
{
if($passwd==1234567) //php的弱类型比较1234567a==1234567
{
echo 'Good Job!';
highlight_file('flag.php');
die('By Retr_0'); //die等同于exit()
}
else
{
echo "can you think twice??";
}
}
else{
echo 'You can not get it !';
}
}
else{
die('only one way to get the flag');
}
}
else {
echo "You are not a real hacker!";
}
}
else{
die('Please input first');
}
}Please input first
要满足md5($id) === md5($gg) && $id !== $gg
传入的参数不同,gg和id的值就不同
md5函数不能处理数组,处理数组会报错,就会返回null,经过md5后为0exxxx的格式,就相等了
所以使用数组绕过
id[]=a&gg[]=b
既满足了a!=b,也满足了md5($a) == md5($b)
is_numeric()函数用1234567a绕过,1234567a是字符串
php的弱类型比较时,1在前,php会将其整体转成数字,就可以通过比较了。
1234567a==1234567
payload
?id[]=a&gg[]=b
passwd=1234567a