BUUCTF之[MRCTF2020]Ez_bypass md5数组绕过
启动项目后可以查看到后台代码,但是是乱的~~~
鼠标右键可以查看到整洁的代码
I put something in F12 for you
include 'flag.php';
$flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';
if(isset($_GET['gg'])&&isset($_GET['id'])) {
$id=$_GET['id'];
$gg=$_GET['gg'];
if (md5($id) === md5($gg) && $id !== $gg) {
echo 'You got the first step';
if(isset($_POST['passwd'])) {
$passwd=$_POST['passwd'];
if (!is_numeric($passwd))
{
if($passwd==1234567)
{
echo 'Good Job!';
highlight_file('flag.php');
die('By Retr_0');
}
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
解题思路:
- 第一步:首先需要传入两个参数gg和id,GET请求
if(isset($_GET['gg'])&&isset($_GET['id']))
- 第二步:传入的gg和id参数MD5值必须要完全相同,但是字符串不相同。
if (md5($id) === md5($gg) && $id !== $gg)
一开始我是想上网找到两个字符串的值不相同,但是经过MD5加密的值就相同。但是找了很久都没有找到这样的字符串。最后发现可以利用MD5加密的特性来绕过。这里的MD5加密是不可以处理数组的,当你传入数组的时候,MD5()函数会返回False。所以这里传递的参数可以是
?gg[]=1&id[]=2
这样在进行判断的时候md5($id) === md5($gg)
会变成False === False成功绕过。但是这样的id和gg的字符串值却不一样。
- 第三步是PHP的弱绕过,passwd的值不能是整数但是要和1234567相等。POST请求
if (!is_numeric($passwd))
{
if($passwd==1234567)
{
echo 'Good Job!';
highlight_file('flag.php');
die('By Retr_0');
}
...........
}
当整数和字符串进行比较的时候,字符串默认转换成整数。再继续比较。所以当传入的值passwd=123456admin的时候:则会先把1234567admin转化成1234567再进行比较。
所以,最后的请求为…