BUUCTF [MRCTF2020]Ez_bypass1

这道题全程我都是用bp做的

拿到题目

BUUCTF [MRCTF2020]Ez_bypass1_第1张图片

我们查看页面源代码得到

BUUCTF [MRCTF2020]Ez_bypass1_第2张图片

代码审计

我们要用get传入id和gg两个参数,id和gg的值要求不能相等,但是id和gg的md5强比较必须相等

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

进入下一个循环体中,我们看到了这个函数

is_numeric($passwd)

s_numeric() 函数用于检测变量是否为数字或数字字符串。

PHP 版本要求:PHP 4, PHP 5, PHP 7

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

if(isset($_POST['passwd'])) {
            $passwd=$_POST['passwd'];
            if (!is_numeric($passwd))
            {
                 if($passwd==1234567)
                 {
                     echo 'Good Job!';
                     highlight_file('flag.php')

所以这串代码是告诉我们如果post个passwd参数,且passwd必须是数字或数字字符串,passwd的值必须与1234567相等,这里就是php的弱绕过,当我们传入1234567a时,就是字符型和数字型进行比较,所以当传入的值passwd=123456a的时候:则会先把1234567admin转化成1234567再进行比较。

我们知道,md5强比较绕过有两种方法,第一种数组绕过,因为md5无法处理数组,返回null时即为true,第二种就是用两个完全相同的md5值绕过,即

array1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2

array2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

所以,我们用get传入?id[]=1&gg[]=2

BUUCTF [MRCTF2020]Ez_bypass1_第3张图片

然后用bp抓包,传入passwd=1234567a,并将get请求变更为post

BUUCTF [MRCTF2020]Ez_bypass1_第4张图片

需要注意的点时,此时如果重发包过去,页面是没有反应的

我们需要将原先的get传入的参数复制了放在请求行上

BUUCTF [MRCTF2020]Ez_bypass1_第5张图片

因为变更请求时,bp会将get的参数变为post,所以我们需要重新写入

这样我们就得到了flag

BUUCTF [MRCTF2020]Ez_bypass1_第6张图片

总结:

此题不难,但是注意和收获的地方很多

收获:

1.is_numeric() 函数用于检测变量是否为数字或数字字符串,当为浮点数时,返回值为1,即为true

2.php的弱绕过

注意的点:

我们在用bp变更包的请求方式时,如果原先已经传入了get参数,我们变更为post请求时,bp会把原先的get传入的参数和后面加上的参数一样转换成post参数,所以我们需要将原先get传入的参数放在包的请求行上,使其成为get参数,然后才能进行重发包

你可能感兴趣的:(linux,运维,服务器)