Typecho-反序列化漏洞学习

目录

  • Typecho-反序列化漏洞学习

    • 0x00 前言
    • 0x01 分析过程
    • 0x02 调试
    • 0x03 总结
    • 0xFF 参考

Typecho-反序列化漏洞学习

0x00 前言

补丁:
https://github.com/typecho/typecho/commit/e277141c974cd740702c5ce73f7e9f382c18d84e#diff-3b7de2cf163f18aa521c050bb543084f

这里我下了1.0版本:
git clone https://github.com/typecho/typecho.git --branch v1.0-14.10.10-release

0x01 分析过程

这个漏洞非常有趣。首先是一个可控参数的反序列化表达式。然后构造pop链,寻找__destruct方法,然而没有找到可利用的。但是通过对反序列化后的变量跟踪发现,有对其当作字符串调用,因此寻找__toString方法。

这个程序一共就只有三个__toString,我自己找的时候只找到一个“类似SQL注入”的点,后来通过利用autoload机制(参考p牛的CSRF到任意代码执行)将那个类加载进来。后来又通过一顿分析发现,其只是返回一个SELECT语句的字符串,然后我就没再跟进了,说不定可以构造成一个反射xss(从反序列化到反射xss???)。

然后看了一下大佬的blog,果然大佬就是大佬。在另一处__toString中找到了一个方法调用:$item[..]->screenName。由于$item可控,因此这里可以使$item[..]为一个没有screenName属性的对象,当访问一个对象没有的属性时就会寻找它的__get方法!所以大佬这里就找了一个存在危险操作的__get方法的类。果然我还是太菜了,满脑子就只有__destruct和__wakeup。

跟进__get之后,经过一系列的调用,调用了同类下的某个filter方法,然后在里面进行了call_user_func,两个参数都可控,至此利用链分析完毕。

构建poc后发现页面返回了500错误,我们的phpinfo()并没有回显出来。经过调试发现,因为程序对反序列化之后的内容进行处理时抛出了异常,导致报了错。我们可以将程序提前exit,不经过后面的报错即可。

0x02 调试

首先看一下访问到漏洞点的前置条件

这里会对referer头做一个校验,refer中的host值需要与$_SERVER[‘HTTP_HOST‘]的值相等。

下面看一下漏洞点

这里需要传入一个finish参数,然后在230行将cookie中的__typecho_config的值通过base64解码之后反序列化。
再往下看两行到232行,这里将$config[‘adapter‘]作为第一个参数传入到Typecho_Db()中。$config就是反序列化传来的对象,因此这个参数也是我们可控的。我们跟进一下Typecho_Db()

跟进其构造方法之后发现,这里将我们传来的第一个参数做字符串拼接,如果第一个参数是对象的话,那么这里就会调用其__toString()方法。刚好,第一个参数是我们可控的。

通过寻找__toString方法,找到了一个Typecho_Feed类。

在第二张图中可以看到$item[‘author‘]->screenName。如果$item[‘author‘]是一个不能存在screenName属性的类的话,那么这里就会调用这个类的__get()魔术方法。刚好,这里的$item是我们可控的。因此下面就找哪些类没有screenName属性,并且__get方法存在危险操作。

最后找到了Typecho_Request类

可以看到$value是可控的。下面跟进一下_applyFilter方法

可以看到,这里有个call_user_func方法,且$filter和$value都可控。至此这条pop链基本是构造完了。

可是构造完payload发现页面响应500,我们的phpinfo()并没有回显出来。经过调试发现,因为程序对反序列化之后的内容进行处理时抛出了异常,导致报了错。如下。

可以看到这里首先抛出了一个Typecho_Db_Exception异常,跟进。

可以看到调用了ob_end_clean()清空了缓冲区。接着跟到self::error。

可以看到,这里配置了一些报错变量,并在最后输出到模板中,然后exit退出了程序。

暂时知道有两种方法来输出payload的结果:
1)提前exit程序,让程序不运行到抛出异常处
2)提前将缓冲区内容打印到页面上
对于1),这里有两种实现方法,第一种是seebug作者的方法,通过使程序运行出错自动exit,还有一种是直接简单粗暴地将exit放到我们的payload中。
对于2),我本想使用ob_end_flush()之类的方法,但是程序在调用时会传入一个参数,导致ob_end_flush()执行失败,因为这个方法是不接受参数的,所以对于第2)个方法,目前没找到出路。

所以这里我将exit放到payload中,成功提前退出,回显了phpinfo。

payload如下

<?php

    class Typecho_Feed{
        private $_type;
        private $_items = array();

        public function __construct(){
            $this->_type = "RSS 2.0";
            $this->_items = array(
                array(
                    "title" => "test",
                    "link" => "test",
                    "data" => "20190430",
                    "author" => new Typecho_Request(),
                ),
            );
        }
    }

    class Typecho_Request{
        private $_params = array();
        private $_filter = array();

        public function __construct(){
            $this->_params = array(
                "screenName" => "eval('phpinfo();exit;')",
            );
            $this->_filter = array("assert");
        }
    }

    $a = new Typecho_Feed();

    $c = array(
        "adapter" => $a,
        "prefix" => "test",
    );

    echo base64_encode(serialize($c));

0x03 总结

这个漏洞精彩的部分就是通过调用__toString再来调用一层__get魔术方法,可惜自己没法把这些已有的点联系起来,还是多学习吧。

0xFF 参考

https://paper.seebug.org/424/

原文地址:https://www.cnblogs.com/litlife/p/10798061.html

时间: 2024-11-01 23:56:07

Typecho-反序列化漏洞学习的相关文章

Typecho 反序列化漏洞导致前台 getshell

前言 最早知道这个漏洞是在一个微信群里,说是install.php文件里面有个后门,看到别人给的截图一看就知道是个PHP反序列化漏洞,赶紧上服务器看了看自己的博客,发现自己也中招了,相关代码如下: 然后果断在文件第一行加上了die: <?php die('404 Not Found!'); ?> 今天下午刚好空闲下来,就赶紧拿出来代码看看. 漏洞分析 先从install.php开始跟,229-235行: <?php$config = unserialize(base64_decode(T

PHP反序列化漏洞学习

serialize:序列化 unserialize: 反序列化 简单解释: serialize 把一个对象转成字符串形式, 可以用于保存 unserialize 把serialize序列化后的字符串变成一个对象 我们来看一个实例: <?php class F{ public $filename='a.txt'; } $a = new F(); echo $a->filename.'<br />'; echo serialize($a); 上面例子是创建一个类, 并输出 filena

PHP反序列化漏洞代码审计—学习资料

1.什么是序列化 A.PHP网站的定义: 所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示.unserialize()函数能够重新把字符串变回php原来的值. 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字. 按个人理解就是: serialize()将一个对象转换成一个字符串,unserialize()将字符串还原为一个对象. 当然从本质上来说,反序列化的数据本身是没有危害的,用户可控数据进行反序列化是存在危害的. B.PH

Java反序列化漏洞分析

相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 http://www.tuicool.com/articles/ZvMbIne http://www.freebuf.com/vuls/86566.html http://sec.chinabyte.com/435/13618435.shtml http://www.myhack58.com/Articl

weblogic新漏洞学习cve-2017-3506

一.原理: 很明显啦,readobject又出来背锅了,一个XML的反序列化漏洞导致的命令执行. 具体原理我看不懂java代码的我也只能学习别人的分析.给出一篇参考文章,写的非常详细: 漏洞原理 二.如何构造命令执行的payload-xml: 1 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 2 <soapenv:Header> 3 <work:Wo

java反序列化漏洞原理研习

零.Java反序列化漏洞 java的安全问题首屈一指的就是反序列化漏洞,可以执行命令啊,甚至直接getshell,所以趁着这个假期好好研究一下java的反序列化漏洞.另外呢,组里多位大佬对反序列化漏洞都有颇深的研究,借此机会,努力学习,作为狼群中的哈士奇希望成功的继续伪装下去,不被识破,哈哈哈哈!!! 参考文档:感谢所有参考文献的作者: 1.https://www.cnblogs.com/bencakes/p/6139477.html 2.https://www.cnblogs.com/ssoo

php反序列化漏洞复现

超适合小白的php反序列化漏洞复现 写在前头的话 在OWASP TOP10中,反序列化已经榜上有名,但是究竟什么是反序列化,我觉得应该进下心来好好思考下.我觉得学习的时候,所有的问题都应该问3个问题:what.why.how.what:什么是反序列化,why:为什么会出现反序列化漏洞,how:反序列化漏洞如何利用. 在这里我对反序列化的原理不做详细介绍,大家可以自行到网上搜索.在这里我只叙述自己的复现过程,超简单的好不. 实验环境 Windows 10+phpstudy 2016 实验步骤 测试

2019-11-2:漏洞复现,ActiveMQ反序列化漏洞,CVE-2015-5254

文章仅仅学习使用,所有步骤均来自网络,博主无法鉴别判断用户使用本网站教程及软件的真实用途,敬请用户在本国法律所允许范围内使用,用户一旦因非法使用而违反国家相关的法律法规,所造成的一切不良后果由该用户独立承担,博主不负责也不承担任何直接间接或连带等法律责任. *文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担. ActiveMQ反序列化漏洞,CVE-2015-5254 Apache ActiveMQ是美国阿帕奇(Apache)软件基金会

Java反序列化漏洞通用利用分析

2015年11月6日,FoxGlove Security安全团队的@breenmachine 发布的一篇博客[3]中介绍了如何利用Java反序列化漏洞,来攻击最新版的WebLogic.WebSphere.JBoss.Jenkins.OpenNMS这些大名鼎鼎的Java应用,实现远程代码执行. 然而事实上,博客作者并不是漏洞发现者.博客中提到,早在2015年的1月28号,Gabriel Lawrence (@gebl)和Chris Frohoff (@frohoff)在AppSecCali上给出了