首页 CTF技巧

原题地址:https://merak-ctf.site/challenges#ez_bypass

首先从题目可以看出:easy_bypass,简单的绕过
我们打开题目地址,简单的展示了源码的一部分

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

我们将其格式化方便观察

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

很明显的看出是几层if语句套娃,只要一层一层解开,就会由最中间的highlight函数展示出flag
首先我们看第一层:

if(isset($_GET['gg'])&&isset($_GET['id']))

isset检测参数的存在,若两个条件都满足则执行if内代码,否则执行die('Please input first');,这一步我们只需要简单的提交gg和id两个get参数即可,提交后返回的代码发生了改变

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');
}
}You are not a real hacker!

证明绕过了第一层,接下来解决第二层
中间将gg和id的值赋给了变量$gg和$id
第二层的判断条件为

if (md5($id) === md5($gg) && $id !== $gg)

这段语句需要同时满足两个条件,首先第一个条件md5($id) === md5($gg),需要$id和$gg的MD5值“全等”(“===”表示数值和类型完全相同),本来随便提交两个相同的值即可,但是同时还需满足第二个条件$id !== $gg,这个条件中的“!==”表示“不全等”(值相同但类型不同),故第一个条件的方法无法使用,这时候我们需要利用md5函数本身的特性,传递两个值不同但无法用来比较的数据类型,这里可以通过数组也就是gg[]和id[]来绕过,于是我们通过get提交?gg[]=1&id[]=2
如图,虽然这里报错了,不过不影响,成功绕过

第二层解决,接下来解决第三层和第四层
中间将POST参数passwd的值赋给了变量$passwd
第三层的判断条件为

if (!is_numeric($passwd))

第四层的判断条件为

if($passwd==1234567)

其中的is_numeric函数的作用是检测变量是否为数字或数字字符串,是则返回ture,反之。不过要注意的是if语句条件中的“!”,if判断语句是通过判断括号内的值是否为0来决定是否执行下面的语句
打个比方,假设a=0,如果if(a)成立执行if里的语句,那么if(!a)不成立不执行if里的语句
条件$passwd==1234567需要变量$passwd的值等于1234567,但不需要全等(参考第一层)
综上,我们需要通过POST提交一段使$passwd不为数字或数字字符串的值
用hackbar通过POST提交$passwd=1234567+任意字符即可

如图,highlight函数高亮显示flag.php源码

flag:

MRCTF{f684b6ef-e9e4-4cab-b250-a522b7c6a3f0}



文章评论

目录