BUUCTF刷题记录[warmup&easysql&Havefun]

2 篇文章 0 订阅
本文介绍了两例关于Web安全的挑战,包括代码审计和SQL注入。在[HCTF2018]warmup中,通过分析PHP源码和利用问号截断实现了任意文件包含。而在[极客大挑战2019]EasySql中,发现了SQL注入点,通过构造payload获取了敏感信息。最后,文章提到了一个简单的逻辑验证题目,通过GET参数获取flag。
摘要由CSDN通过智能技术生成

这是我第一次在csdn上写文章,后面我将在这上面分享一些我个人的一些偏技术性的文章,本人web菜狗一枚还请大佬指教,最近在鼓捣我的博客网站,等备案好了还请捧个场

[HCTF 2018] warmup

image-20211208132225582

打开一看,是一张图片,但是不知道为什么我没有加载出来,去网上搜了一下,这里其实就一张滑稽的图片,没啥用

按下Ctrl U查看源码发现存在一个source.php

image-20211208132417625

打开一看是一道代码审计的题

<?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,没有则将page的值全部赋给_page变量
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {  //再一次进行白名单检测,判断$_page是否在白名单中存在
                return true;
            }

            $_page = urldecode($page);          //对$page进行URL解码
            $_page = mb_substr(                 //再一次进行问号截取赋值
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {  //再一次判断$_page是否在白名单中
                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\" />";
    }  
?>

其中: mb_substr(): 作用类似于substr()字符串截取的功能,只不过这个函数好像可以对中文字符串进行截取

语法:mb_substr(string , start , length ,encodinig)
    string:将要截取的字符串
    start:截取开始的位数,若为负数则从后往前数开始截取,若为0则是从第一位开始截取
    length:可选。所要截取的长度,默认是截取的字符串末尾,若为负数则从字符串末端返回
    encoding:可选。字符编码。如果省略,则使用内部字符编码

​ mb_strpos(): 作用类似于strpos(),即返回变量在某一字符串中最开始出现的位数

语法:strpos(string,find,start)
    string:	必需。规定被搜索的字符串。
    find:   必需。规定要查找的字符。
    start:	可选。规定开始搜索的位置。

所以可以得出下面这串代码的作用

$_page = mb_substr(                 
                $page,
                0,
                mb_strpos($page . '?', '?')
            );

即对page变量进行从第0位到第mb_strpos( p a g e . ′ ? ′ , ′ ? ′ ) 位 进 行 截 取 , 而 m b s t r p o s ( page . '?', '?')位进行截取,而mb_strpos( page.?,?)mbstrpos(page . ‘?’, ‘?’)的作用则是给变量结尾拼接一个’?’,然后再进行判断第一次出现问号的位数,很明显如果字符串中如果没有问号则返回该字符串原本的长度,截取出来的 p a g e 也 就 是 p a g e 本 身 , 若 如 果 _page也就是page本身,若如果 pagepagepage中本身就存在问号,那就则会返回问号前的字符串

通过这个理解我们就能利用问号进行截断,使得对include进行任意文件包含

这里还存在一个url二次解码的问题,但是我试了一下,就算他进行二次解码也不影响

image-20211208135140012

我们通过访问hint.php知道了flag的位置在image-20211208135238864

所以直接开始构造payload:

POST: file=hint.php?../../../../../ffffllllaaaagggg //因为我们不知道flag的具体路径,所以只能通过../这个切换相对路径的方法一层一层得进行目录穿越,最终拿到flag

image-20211208135424768

[极客大挑战2019] EasySql

首先进行burp抓包发现是一个get型的传参

image-20211208135843771

然后尝试单引号拼接,发现存在注入点

image-20211208140136583

后面尝试使用order by进行列数判断,发现image-20211208140226663

我把空格都替换成/**/,发现又能正常回显了,说明是过滤了空格

接着将空格全部替换掉之后进行爆列数,发现它居然直接就把flag爆出来了,不知道这是不是题的问题还是出题人故意这么设置的

image-20211208140544394

payload:

?username=-1'/**/union/**/select/**/1,2,3%23

[极客大挑战 2019]Havefun

打开一看是一张很可爱的猫咪图片,查看源码可以发现

image-20211208161805346

$cat=$_GET['cat'];
        echo $cat;
        if($cat=='dog'){
            echo 'Syc{cat_cat_cat_cat}';
        }

如果传入一个GET参数,且变量cat的值等于’dog’,就能输出flag,只能说with hands is ok

image-20211208161927188

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pysnow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值