[MRCTF2020]Ez_bypass - 实践

有提示F12,那查看一下源码。和页面表明的代码一样的,就是格式更规范而已
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');}
} You are not a real hacker!
代码讲述了get方法传递两个参数 gg 和 id ,使得它们的MD5值强相等(===),但它们本身值并不相同。
而且运用post方法传递了一个 passwd 参数,并且需要确保这个参数值不是纯数字,还得使得参数值与 1234567弱相等(==)
那么我们首先构造url传参 :?gg[]=s878926199a&id[]=s155964671a
解释一下:为什么这里我们参数传递的是数组,而不是直接传递字符串?
由于代码要求两个参数值的MD5值要 强相等(===)
若是大家传递的是?gg=s878926199a&id=s155964671a
那么这两个值的MD5分别是
0e545993274517709034328855841020
0e342768416822451524974117254469
在进行比较时,这两个值是不相等的,就会返回 false
然鹅当传递的值是数组时,进行MD5运算,两个都会返回Null
null===null 返回 true
弱相等(==)就是如果,代码中MD5值的比较使用的
那么就能够直接传递字符串
原因是在弱比较时,php会将 0e 开头的字符串解释为科学计数法的 0。
并且如果 0e 后续全是数字的话,php会认为它们是相等的

再利用post办法传递 passwd=1234567\
1234567\
1234567a
1234567+
1234567-
1234567*
通过都能够(不要应用 . 会被看成是小数点)
这样写 是因为使用的是弱相等
当php看到一个字符串与一个数字进行弱比较时,它会将这个字符串看成一个数字,当读取到非数字的部分它就会停止,所以这些非数字字符得放在1234567的后面

获得flag{5ab68b16-b084-4f10-8530-06f5726d5f53}
浙公网安备 33010602011771号