BUUCTF--web篇01

目录

[极客大挑战 2019]EasySQL

[极客大挑战 2019]Havefun

[HCTF 2018]WarmUp

[ACTF2020 新生赛]Include



[极客大挑战 2019]EasySQL

确定该注入类型为字符型注入:

首先了解了一下sql注入的万能钥匙:

# 万能钥匙:

1 and 1=1

1' and '1'='1

1 or 1=1

1' or '1'='1

以第二个为例(1' and '1'='1)

如果是字符型的注入的话,输入第二个万能钥匙,构造的payload可能为:select *from table(某个表) where password = '1' and '1' = '1';

该查询语句值为:0,因为在sql语言中and两边都是true,结果才为true,or两边只要有一个是true,结果就是true,而且and的优先级高于or,两者碰到一起,先算and。

可以这样:

这样最终会让查询语句变为 false or false or true的结果,也就是true,就可以拿到flag了。

也可以这样:

直接把后面的password查询语句注释掉,然后通过构造username的payload来爆出所有信息,拿到flag.


[极客大挑战 2019]Havefun

启动靶机,出现一只猫,一般来说,像这种没有任何按钮然后也没有直接的代码提示的,我们需要看它的:1.URL ,2.网页源代码,

  1. 网站后台扫描(这个感觉有点陌生。)

查看网页源代码,可以发现最后有这么一段php代码:

上面说,如果让cat = dog,那么就会有{cat_cat_cat_cat}的回显,看起来很像flag。

$_GET是php中预定义系统变量,包含了通过get方式提交的信息。

我们先来了解一下什么是get请求:

get请求

get请求通常在URL的后面跟随一个问号(?),然后是请求参数的名称和请求参数的值,中间用(=)表示成对的关系,若有多个请求参数,则以&字符连接。使用get方法连接时,请求参数会出现在浏览器的地址栏。

<!--来自CSDN中“xhcoding博主大哥的文章解释-->

 

//我感觉这里的请求参数应该就是php中的那个变量$cat吧。也就是通过URL的get请求来给$cat赋值(值为dog)。

最后我们在URL后面输入: /?cat=dog,即可爆出flag


[HCTF 2018]WarmUp

启动靶机,看到这个(笑死我了)

日常F12,查看页面源代码,发现了被注释掉的source.php

在顶部地址栏后拼接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\" />";
    }  
?>

一句一句来分析,

//在上面几行,不仅看到了source.php,还看到了hint.php,我们在顶部地址栏拼接进去hint.php,可以看到如下字符:

它告诉我们,flag在ffffllllaaaagggg这个文件中,所以我们只需要将这个文件include就行了。

//highlight_file():这是PHP中的语法高亮函数,后面参数为

$filename:需要高亮显示内容的文件(必填参数)

$return: 布尔值参数,(可选参数)。默认值为false,如果修改为true,那么该函数将以字符串的形式返回。

//php中的function用法:用户自定义函数关键字(function),后面加函数名称(不能以$开头),参数,以及花括号括起来的函数内容,例如:

function cs( ){ },可以看到题目的函数名称为checkFile,参数为$page。

//$whitelist = ["source"=>"source.php","hint"=>"hint.php"];

这是一个字符串数组,里面的两个值为"source.php""hint.php"他们前面的那个是数组下标。

//接下来了解几个php中的字符串函数。

//substr()函数:(取子字符串)

substr(参数1,参数2[,参数3(不必选)])

参数1为:需要操作的字符串变量

参数2为:起始位置

参数3为:截取字符的长度(可有可无)

//注意:下标是从从0开始的!

<?php
    $a = "I am a good boy";
    print(substr($a,2,4));  //输出结果为 am a
?>    

//isset()函数: 检查变量是否被初始化,如果被初始化,echo结果为1,如未被初始化,echo结果为空。

isset($a)    ($a为需要检查的变量)

//is_string()函数:检查变量是否是字符串

is_string($a)  ($a为需要检查的变量)

//in_array()函数:

in_array(参数1,参数2)

参数1为变量$a,参数2为某一个数组$arr,用于检查$a是否在$arr中

//mb_substr()函数:简单用法就是和substr()函数用法一样。

//mb_strpos()函数:用来查看某个字符或字符串在变量中第一次出现的位置:

<?php
    $a = "I am a good boy";
    echo mb_strpos($a,"good");  //结果为7
?>    
<?php
$a = "good";
echo mb_strpos($a,"g");      //结果为0
    echo mb_strpos($a."a","a"); //结果为4
?>    

如图,$a."a"的意思就是在$a的后面加一个字符a

//$_REQUEST:PHP中的超级全局变量,可以获取以post方法和get方法提交的所有数据。

//urldecode()函数:用于解码给出的已编码字符串。

//urlencode()函数:将字符串编码,并将其用于URL的请求部分(我感觉可能是post方法用的更多一点),同时可以用他来编码中文字符串,避免出错。

<?php
    $a = "?";
echo urlencode(urlencode($a)); 
//结果为%253F,也就是?两次编码的结果
?>    

/代表根目录

./代表当前所在目录

../代表上一层目录

代码审计:

 if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];

只要我们传进去的file值不为空,且是字符串,最后能通过checkFile函数的验证,就可以包含我们传入的file文件()。

checkFile函数:基本需要满足的条件是:是字符串,并且是白名单数组里的字符,(内容经过解码后仍然数组中)。

mb_substr函数和mb_strpos函数可以让$_page 永远等于白名单里的那俩,从而能够return true,满足checkFile函数验证。

直接构造payload:?file=hint.php?./../../../../../ffffllllaaaagggg

拼接到URL后,即可得到flag

**:PHP中的include()函数可以跨目录包含!!

也就是我们先回退目录,然后直接访问ffffllllaaaagggg文件就行了!

参考博主:(讲的很好,比我好太多)

【HCTF 2018】WarmUp_阿哲也要努力学习!的博客-CSDN博客


[ACTF2020 新生赛]Include

启动靶机,可以发现一个“tips”点击进去,出现一段话:

Can you find out the flag?

日常F12也是什么都没有,那么flag很有可能就是被藏在了这个页面中,再结合题目中的“include”,可以推测这是一个文件包含漏洞。

我们只需在原URL后面拼接这样的字符串:

?file=php://filter/read=convert.base64-encode/resource=flag.php

输出一串base64编码的字符串,然后将其解码(网站 http://base64.wjccx.com很可行),我们便可以看到:

Flag得到!

//上面的php://filter其实是PHP的伪协议,。

read=<读链的过滤器>   比如上面就是由base64编码过滤的

source=<被过滤的文件> 上面flag.php就是被过滤的文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值