[BJDCTF2020]Easy MD5 1
提示了后台的查询语句
select * from 'admin' where password=md5($pass,true)
这里关键是理解md5($pass,true)
是个啥东西
md5($pass,true)在指定true的时候,是返回的原始 16 字符二进制格式。
也就是说会返回这样子的字符串:'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c
'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c
这样的二进制字符串可以和前面的语句形成闭合,从而变成永真式,拼接语句的时候会变成这样
select * from 'admin' where password=''or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c'
这样的语句,于是我们需要找到这样子的一个字符串,使他解析之后为一个永真式
查资料,发现一个ffifdyop
content: ffifdyop
hex: 276f722736c95d99e921722cf9ed621c
raw: 'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c
string: 'or'6]!r,b
接下来让我们看看这个为什么是一个永真式
在mysql里面,在用作布尔型判断时,以1开头的字符串会被当做整型数(这类似于PHP的弱类型)。要注意的是这种情况是必须要有单引号括起来的,比如password=‘xxx’ or ‘1xxxxxxxxx’,那么就相当于password=‘xxx’ or 1 ,也就相当于password=‘xxx’ or true,所以返回值就是true。这里不只是1开头,只要是数字开头都是可以的。
当然如果只有数字的话,就不需要单引号,比如password=‘xxx’ or 1,那么返回值也是true。(xxx指代任意字符)
输入后发现了这个
看源码
这里是得到a,b两个参数,这两个数不同但是md5解析后的值相同,用的是类似php弱类型的比较
方法一:php数组绕过
由于哈希函数无法处理php数组,在遇到数组时返回false,我们就可以利用false==false成立使条件成立。
/levels91.php?a[]=1&b[]=2
方法二:md5碰撞
参考如下
md5碰撞
/levels91.php?a=s878926199a&b=s155964671a
都返回下面的源码
成了php三等号===强类型比较了,那就不能用md5碰撞了,只能用数组,我们POST数据,得到flag
知识点:
1.md5($pass,true)
的绕过
2.弱类型比较的md5碰撞和数组绕过
[MRCTF2020]Ez_bypass 1
先看看页面的源码,进行代码审计
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
经过代码审计,可以分为以下几个部分
1.if (md5($id) === md5($gg) && $id !== $gg)
利用强类型进行检验,可以用我们上一题的数组进行绕过。
2.利用is_number()函数来进行检验,我们可以通过输入1234567a来绕过
(is_number()弱比较:如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行,在比较时该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。)