zoukankan      html  css  js  c++  java
  • HCTF2018 WarmUp

    BUU第一题,老实说第一次做的时候手足无措。

    0x00

    题目类型:php代码审计,文件包含。

    0x01

    点开链接,开门见山就是一个大大的滑稽。

    查看源代码,注释中提醒有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" />";
        }  
    ?>

    代码比较简单,利用点就在倒数第六行的include函数,会直接将参数传入的值作为文件名包含,并回显在页面中。if语句对文件名进行了一个简单的判断,前两个不太重要,重点在checkFile函数。回头去看emmm这个类,开头进行了一次白名单校验,故file只能取source.php与hint.php两个值。而后判断传入的参数是否在白名单中,若是则返回值为真。mb_substr函数从参数开始处提取一个子串,长度为对参数末尾拼接一个"?"后"?"首次出现的位置。最后对参数进行了二次url解码再截取了一个子串,这里就是代码出现问题的地方,由于file参数完全可控,我们可以将“%”进行一次url编码,绕过第一个截断,在二次url解码时生成一个"?",让返回值为真,而后拼接上语句,实现文件读取。

    0x02

    在hint.php中提示了文件名,思路逐渐明晰,构造payload:http://yourhost/?file=source.php%253f/../../../../ffffllllaaaagggg,由于我们不知道flag的具体位置,../的个数需要一个个试。这是phpmyadmin4.8.1的一个漏洞,CVE编号为CVE-2018-12613,有兴趣可自行搜索。

  • 相关阅读:
    c语言练习17——输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数
    c语言练习16——输入两个正整数m和n,求其最大公约数和最小公倍数
    c语言练习15——条件运算符的嵌套
    c语言练习14——将一个正整数分解质因数
    CentOS下Cassandra集群搭建
    一台linux服务器挂载另外一台linux服务器文件系统
    zabbix分布式监控多网段的部署与实现
    CentOS安装MySQL详解
    vcenter 7.0 安装 vRealize Operations Manager
    Zabbix分布式部署详细
  • 原文地址:https://www.cnblogs.com/BlueDoor1999/p/13301376.html
Copyright © 2011-2022 走看看