[MRCTF2020]Ez_bypass详解

3 篇文章 0 订阅
2 篇文章 0 订阅

目录

基础知识

①md5的弱比较

②php的弱比较

③is_numeric()函数

解题步骤

payload

基础知识

①md5的弱比较

0e开头跟数字的字符串0exxxx,会当作科学计数法去比较,相当于0的xxxx次方,所以和0相等

②php的弱比较

php中两种比较符号

==:先自动转化成相同类型,再比较值

===:先判断两种字符串的类型是否相等,再比较值

参考:php弱类型比较 - 爱码网

if("admin"==0) //true
if("1admin"==1)//true
if("admin1"==1)//false
if("0e12345"=="0e1324")//true

php弱比较中,如果数字和字符串比较,字符串转换成数字的过程中,会取字符串前面数字的值作为整个字符串转换成数字的值。

比较“1admin”,转换成数字就是1

比较"admin1",因为字符串没有数字,只能转换成0了

③is_numeric()函数

如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回 1,即 TRUE。

解题步骤

查看源码

注释在代码段中

I put something in F12 for you
include 'flag.php';
$flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';
if(isset($_GET['gg'])&&isset($_GET['id'])) {  //传参方式为GET型
    $id=$_GET['id'];
    $gg=$_GET['gg'];
    if (md5($id) === md5($gg) && $id !== $gg) {  //md5弱类型比较
        echo 'You got the first step';
        if(isset($_POST['passwd'])) {
            $passwd=$_POST['passwd'];
            if (!is_numeric($passwd)) 
            //is_numeric()函数,它判断参数是否为数字或者数字字符串
            //不是数字或者不是数字字符串就返回true
            {
                 if($passwd==1234567)  //php的弱类型比较1234567a==1234567
                 {
                     echo 'Good Job!';
                     highlight_file('flag.php');
                     die('By Retr_0');  //die等同于exit()
                 }
                 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

要满足md5($id) === md5($gg) && $id !== $gg

传入的参数不同,gg和id的值就不同

md5函数不能处理数组,处理数组会报错,就会返回null,经过md5后为0exxxx的格式,就相等了

所以使用数组绕过

id[]=a&gg[]=b

既满足了a!=b,也满足了md5($a) == md5($b)

is_numeric()函数用1234567a绕过,1234567a是字符串

php的弱类型比较时,1在前,php会将其整体转成数字,就可以通过比较了。

1234567a==1234567

payload

?id[]=a&gg[]=b

passwd=1234567a

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值