• 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,有兴趣可自行搜索。

  • 相关阅读:
    html的输出&,空格,大小于号
    html如何修改hr水平直线的粗细
    LODOP指定window默认打印机和临时默认打印机
    微软面试题: 找出二叉树上任意两个结点的最近共同父结点。
    说说自己对hibernate一级、二级、查询、缓存的理解。
    MySql中添加用户,新建数据库,用户授权,删除用户,修改密码
    修改MySQL的默认密码的四种小方法
    java中Scanner的nextLine()和next()的区别
    JAVA中String字符串比较equals()和equalsIgnoreCase()的区别
    HashMap与HashTable的区别
  • 原文地址:https://www.cnblogs.com/BlueDoor1999/p/13301376.html
Copyright © 2020-2023  润新知