首页 > 其他分享 >[HCTF 2018]WarmUp

[HCTF 2018]WarmUp

时间:2023-07-15 21:55:20浏览次数:34  
标签:WarmUp mb hint HCTF source 2018 file php page

[HCTF 2018]WarmUp

题目来源:buuctf

题目类型:Web

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

1. 题目上来只有一张滑稽图片,查看源代码,发现有source.php文件

2. 我们进入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\" />";
    }  
?>

先介绍一下几个基本函数,方便我们后续解题:

highlight_file():对文件进行 PHP 语法高亮显示(对解题没什么影响)
isset():用于检测变量是否已设置并且非 NULL
is_string():用于检测变量是否是字符串
in_array(A,B):搜索B数组中是否包含A这个值
mb_substr(A,B,C):将A字符串从B截断到C,区间为[B,C),左闭右开;例如mb_substr("hello",0,2),则返回的值为"he"
mb_strpos(A,B):返回A字符串中出现B字符串的第一个位置;例如mb_strpos("abc","bc"),则返回值为1
urldecode(A):对A字符串进行url解码
empty():检查变量是否为空
$_REQUEST变量可用来收集通过GET和POST方法发送的表单数据
include可以将PHP文件的内容插入另一个PHP文件,include只生成警告,并且脚本会继续
A.B表示将A、B两字符串拼接

3. 接下来我们依次分析这段代码的各个部分

  • 主要部分:
if (! empty($_REQUEST['file'])		//表单数据是否非空
        && is_string($_REQUEST['file'])		//表单数据是否是字符串
        && emmm::checkFile($_REQUEST['file'])		//emmm类中checkFile方法返回是否为true
    ) {
        include $_REQUEST['file'];		//将表单数据中的PHP文件插入当前PHP文件(即回显到当前页面)
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";		//页面回显一张图片
    }  

这段代码要求我们传入一段字符串给file,当file通过emmm类中checkFile方法之后,页面即可回显我们需要的信息

  • emmm类:
class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            //创建了一个关联数据,注意source和hint为键,source.php和hint.php为值
            if (! isset($page) || !is_string($page)) {	//若page变量未被定义或不是字符串
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {	//若在whitelist数组中存在page的值
                return true;
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')	//返回page变量中第一次出现'?'的位置,若没有出现则返回page的末尾位置
            );	//将page从0到截断处的内容赋给_page
            if (in_array($_page, $whitelist)) {	//若在whitelist数组中存在page的值
                return true;
            }

            $_page = urldecode($page);	//将page变量url解码后赋值给_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条件判断,我们依次分析:

  1. 第一个 if 用于判断page是否为空,当我们没传入任何参数时,页面回显就是那张滑稽图片;
  2. 第二个 if 用于判断page的值在不在白名单里面,白名单有 source.php 和 hint.php ,hint.php我们一会查看;
  3. 第三个 if 是在page截断后赋值给 _page,再判断 _page的值在不在白名单里;
  4. 第四个 if 是先将page进行url解码后赋值给 _page,再做截断和判断。

4. 分析完代码之后,我们先查看下hint.php(这个在代码中提示我们了)

5. 题目告诉我们flag在ffffllllaaaagggg中,我们开始构造payload

​ 首先我们思考,当传入参数为source.php和hint.php时,页面均可正常回显,但并不是我们想要的信息。我们考虑向source.php里进行get传参。基本结构如:?file=source.php/ffffllllaaaagggg

​ 但这样显然过不了第三个 if,我们在 source.php 后面加上 '?',构造如:?file=source.php?/ffffllllaaaagggg,将该 payload 提交,可以通过checkFile方法,但页面无 flag 回显。因此我们再深入尝试,不断往目录下层搜索,最终得到的payload如下:

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

​ 提交上去,最终得到了flag:

6. 存在的一些问题

​ 虽然题目是写完了,但是肯定有小伙伴要问了,第四个 if 的作用在哪呢?确实,我们通过第三个 if 之后,flag就可以出来了,个人认为是出题人没考虑到这点,想用第四个 if 考一下两次url解码操作。

​ 那我们这里考虑到第四个if,构造的payload如下:

?file=source.php%253f../../../../../ffffllllaaaagggg

%253f 即对 '?' 进行两次url编码,在参数传入服务端的时候解码一次,urldecode解码一次就会回到 '?'

flag{00498122-d651-489d-a7ac-a92c1a18882d}

日期:2023.7.15

作者:y0Zero

标签:WarmUp,mb,hint,HCTF,source,2018,file,php,page
From: https://www.cnblogs.com/bkofyZ/p/17557035.html

相关文章

  • 洛谷 P4931 [MtOI2018] 情侣?给我烧了!(加强版)
    洛谷传送门设\(f_i\)为\(i\)对情侣完全错位的方案数,那么答案为:\[\binom{n}{k}\frac{n!}{(n-k)!}2^kf_{n-k}\]分别代表选择\(k\)对情侣,选择它们的位置,情侣可以换位。\(f_i\)有递推公式:\[f_i=4i(i-1)(f_{i-1}+2(i-1)f_{i-2})\]考虑选出两个人,另外......
  • [NOI2018] 屠龙勇士
    题意求解下列同余方程组,\[\begin{cases}b_1x\equiva_1\pmod{m_1}\\b_2x\equiva_2\pmod{m_2}\\\dots\\b_nx\equiva_n\pmod{m_n}\\\end{cases}\]其中,\(n\leqslant10^5,m_i\leqslant10^8,lcm(m_i)\leqslant10^{12},a_i\leqslant......
  • AE cc 2017 和 2018 中英文切换的方法
    AEcc2017中文切换英文的方法找到AE的安装文件目录下的“SupportFiles”文件夹,路径为C:\ProgramFiles\Adobe\AdobeAfterEffectsCC2017\SupportFiles进入“zdictionaries”文件夹,找到该文件夹里的中文语言文件:“zh_CN”,并打开改文件名,把“after_effects_zh-CN.dat”改成......
  • P5044 [IOI2018] meetings 会议 思考--zhengjun
    在NFLS模拟赛上遇到的,赛后订正过的。隔了蛮长时间的,总结一下。首先转化为笛卡尔树上后缀前缀的问题。然后考虑如何转移,发现转移形如\(f(x)=\min\{f(x)+C,kx+b\}\)的形式。可以直接线段树维护每个点的最优直线,在update的时候:如果\(f(x)+C\lekx+b\)恒成立(左右......
  • P4606 [SDOI2018] 战略游戏 对自己的警告--zhengjun
    tarjan多测的时候dfn数组要清空!!!树剖多测的时候son数组要清空!!!点双tarjan时可用vector建边,边双时用vector需要无重边本题直接建圆方树,然后答案就是关键点构成的虚树上非关键原点个数。代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;......
  • SketchUp草图大师2018三维建筑软件下载和安装教程
    草图大师是一款绘图软件,英文名称为SketchUp,它可以快速和方便地创建、观察和修改三维创意。在草图大师中建立三维模型就像我们使用铅笔在图纸上作图一般,草图大师本身能自动识别你的这些线条,加以自动捕捉。它的建模流程简单明了,就是画线成面,而后挤压成型,这也是建筑建模最常用的方法。......
  • P5298 [PKUWC2018]Minimax
    P5298[PKUWC2018]Minimax前言顺着线段树合并的标签找到这道题,感觉可做,但一写写了整整一天/kk。题意给出一个以\(1\)为根的\(n\)个节点的二叉树,每个叶子上有一个权值,非叶子节点的权值有一定概率为其子节点中权较大\(/\)较小的那个,问根节点每个不同权值的概率,答案按一定......
  • P5454 [THUPC2018] 城市地铁规划 引发的思考--zhengjun
    有如下背包问题:\(n\)种物品,体积为\(v_i\),价值为\(w_i\),不限量,要求选\(m\)件物品,且总体积为\(V\),求总价值的最大(小)值。解决方法:不妨令\(v_i\)升序,首先先选\(m\)个\(1\)号物品,计算体积\(V_0=m\timesv_1\),然后每选一件物品,就替换掉一件\(1\)号物品。转移式:\(......
  • buuctf-[WesternCTF2018]shrine
    最近学习了一下SSTI,用这个题目来试试手SSTI原理:WEB应用中模板的引用存在可变变量由于有一个渲染函数flask.render_template_string()所以可以判断这是一个SSTI的考点然后观察代码,这个代码需传入一个shrine的值,然后这个对传入的值进行了“()”的过滤,并且可以知道flag储存与当前......
  • P7316 [COCI2018-2019#3] NLO
    考虑延续GDKOI普及组签到题的做法。先枚举\((x,y)\)考虑他会更新哪些节点,那么这个在GDKOI上是体现在一个差分上面。这里\(n\)很大而\(k\)很小,那么我们就可以考虑枚举\(n\)和\(k\),但是使用线段树来做。但是注意到一个事情,我们做区间赋值附的不是简单的$0/1$......