CTF第六天

[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。)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值