BUUCTF web部分WP

目录

[极客大挑战 2019]EasySQL

​编辑

在用户名未知的情况下

[极客大挑战 2019]Havefun

[HCTF 2018]WarmUp

BUU SQL COURSE 1

[MRCTF2020]Ez_bypass

绕过

首先id和gg传入一个数组

然后POST传参1234567a

[极客大挑战 2019]EasySQL

根据题目名字判断和这个登录界面,直接用SQL注入的万能密码操作

在用户名未知的情况下

 用户名直接 1'or'1'or'1

密码随便输

 然后就成功了

否则就不成功

[极客大挑战 2019]Havefun

F12审查元素,或者ctrl + shift + c 审查元素,发现一段关于php的注释,内容为GET传参,如果cat等于dog的话,就echo打印什么东西

 那我们直接在URL中进行GET传参

?cat=dog

即可获得flag

[HCTF 2018]WarmUp

打开发现一张图片,按照常理直接Ctrl + U 查看源代码

发现有一个 source.php,访问一下看看

<?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {
                return true;
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>

 具体代码审计可以看看另外大佬的博客 (25条消息) 【CTF】buuctf web 详解(持续更新)_吃_早餐的博客-CSDN博客

代码含义,可以查看php手册 

 ​​​​​​is_string():检测变量是否是字符串
 isset():检测变量是否已设置并且非 NULL
 in_array(要搜索的值,要搜索的数组):搜索数组中是否存在指定的值
 mb_substr($page,n,m):返回page中从第n位开始,到n+m位字符串的值
 mb_strpos():查找字符串在另一个字符串中首次出现的位置
 urldecode():将url编码后的字符串还原成未编码的样子

 发现php代码,还有一个提示 hint.php,也访问看看

 它说flag在 ffffllllaaaagggg里面

 我们根据Linux的特性,用 ../../../../../很多个../去到根目录,然后打开ffffllllaaaagggg,就可以获得flag

http://cbb3166b-0711-4666-be45-53545d786b7b.node4.buuoj.cn:81/?file=hint.php?../../../../../../../../ffffllllaaaagggg

BUU SQL COURSE 1

关键是找到注入点,然后爆库,表,列,字段即可

[MRCTF2020]Ez_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
  1. 代码开头包含了一行注释,提到在 F12 中放置了一些内容,其中包括 include 'flag.php';,这似乎是一个提示,flag.php 文件包含了 flag 的内容。

  2. 代码首先检查是否传递了 ggid 两个 GET 参数。你需要传递这两个参数才能进入后续的条件判断。

  3. 接下来,代码比较了 md5($id)md5($gg) 是否相等,并且确保它们不相等 ($id !== $gg)。这意味着 idgg 的值必须不同,但它们的 MD5 哈希值必须相同。这是一种常见的绕过方法,通常会利用哈希碰撞。

  4. 如果第三步的条件满足,即 md5($id)md5($gg) 相等但它们的值不同,那么会输出 "You got the first step"。

  5. 接下来,代码检查是否设置了 POST 参数 passwd。如果设置了 passwd,则会继续执行下一步。

  6. 在第五步中,代码检查 passwd 是否是一个数字。如果 passwd 不是数字,它会进一步检查是否等于 1234567。如果 passwd 不是数字且等于 1234567,那么会输出 "Good Job!",并且使用 highlight_file('flag.php'); 显示 flag.php 的内容,然后结束程序。

  7. 如果 passwd 不是数字或不等于 1234567,那么会输出 "can you think twice??"。

  8. 如果 passwd 是数字,那么会输出 "You can not get it !"。

  9. 如果在第四步中没有设置 passwd,则会输出 "only one way to get the flag"。

  10. 如果在第三步中的条件没有满足,即 md5($id)md5($gg) 不相等或它们的值相等,那么会输出 "You are not a real hacker!"。

  11. 如果在第二步中没有传递 ggid,则会输出 "Please input first"。

为了获取 flag,你需要绕过这些条件,主要关注第三步和第五步的条件。首先,你需要找到两个不同的字符串,它们的 MD5 哈希值相同,这可以通过哈希碰撞来实现。一旦你有了这两个字符串,你可以将其中一个作为 id,将另一个作为 gg 传递给脚本。接下来,在第五步中,你需要确保 passwd 不是数字,并且等于 1234567,这样才能触发显示 flag 的条件。

总结:这道题的解法包括了哈希碰撞和条件绕过,以获取 flag。

首先id和gg传入一个数组

数组的md5都是Null,所以它们满足MD5相等的条件。然后id的数组是1,gg的数组是2,满足值不相等的条件

/?id[]=1&gg[]=2

然后POST传参1234567a

因为它不是数字所以绕过第一个条件,而php遇到这种会把后面的a去掉来执行,所以passwd 不是数字且等于 1234567

passwd=1234567a

成功拿到flag

posted @ 2023-06-08 22:33  Fab1an  阅读(22)  评论(0编辑  收藏  举报  来源