记一次typecho反序列化漏洞的复现(第一次写poc版)

 一 前言

        ①什么是序列化,什么是反序列化?

        说一说我的个人理解吧。举个例子,php与java之间是如何相互传输的呢?首先,php的类或者对象转化为统一的字符串,这个过程就叫做序列化,然后字符串再转化为java,这个过程就叫做反序列化。

        ②那么反序列化漏洞是如何产生的呢?

        我们都知道,漏洞都是发生在数据交互中的,那么反序列化漏洞也一定不例外,他是因为代码中存在序列化和反序列化的操作,并且序列化的类存在魔术方法且逻辑不严谨,导致用户可以控制代码中的参数,来利用反序列化过程去实现一些比如说RCE漏洞,所以反序列化漏洞一般都是跟别的漏洞结合在一起去造成严重危害的。

二 环境搭建

        ①phpstudy+phpstorm

        ②具体步骤:

        1 下载phpstudy,phpstorm

        2 去github找typecho1.0(14.10.10)的版本,因为官网已经把这个有漏洞的版本剔除了

        3  解压放到phpstudy的www目录下

        4 创建一个typecho的数据库

三 漏洞复现

        ①工具:phpstorm以及seay源代码审计工具(方便我们去进行代码审计,毕竟是小白)

        ②开始审计

      1 审计前期工作

        既然是反序列化漏洞,那么肯定要搜索关键词是unserialize,然后根据搜索的内容一个一个去进行代码审计(这个方法挺适合新手小白去进行白盒测试,搜索危险函数或者关键字)

点进去第一个函数文件里面,看是否有可以利用的点

 发现这里的反序列化好像是没有经过任何校验的,是可以利用的点,然后同样进入webstorm找到这里,进行代码审计,因为可以方便我们去查看类的内容

 然后ctrl点击get函数去查看这个函数具体的内容,发现确实没有任何校验

 然后来详细的对这个函数进行分析,这个函数的意思就是获取cookie或者post里面的$key并赋值给$value,并且$value不能是数组,否则会被置空,说明这里的确没有对反序列化后的内容进行校验,那么问题来了,我们的payload应该如何去写呢?

        2 写payload

        要写payload,我们就必须知道如何去找这一整条利用链,首先要去可利用点那里具体分析,看利用这个点的条件是什么,那么我们继续进行代码审计

 发现这个利用点最终是嵌套在这个if条件下面的,说明我们如果想要进入这里,我们必须先传一个finish参数,那么我们先在本地传一个finish参数试试看

说明我们传的参数并没有进来,那么是不是就说明在这个if语句之前还有地方挡住了我们的传参呢?继续进行代码审计

 发现这里其实就是限制我们传参的一个点,第一个if语句意思就是首先判断是否有finish的传参,有那个配置文件,session里面typecho这个参数是否为空,不满足任何一个条件都会结束,第二个if语句的意思是如果referer为空,或者这个referer不等于本站的referer,那么结束整个语句,那么这里需要用到burp去构造请求包,去进行referer传参。

 

 

可以看到成功绕过了限制,进入了这个if语句,那么接下来该怎么才能进入我们所需要的那个if判断条件里面呢?我们继续进行代码审计。

可以看出,要想进入我们需要的else判断里面,我们首先要使得我们的传参或者cookie里有__typecho_config这个参数,才能进入我们所需要的反序列化里面,然后找poc才刚刚开始。

3 找poc链 

        我们都知道,要想找到反序列化漏洞的poc,我们就要找魔术方法,看是否有魔术方法可以去利用,我们继续进入这个else判断里面,审查代码

 说明$config是一个数组,并且有两个键分别是adapter和prefix,$config也就是我们的__typecho_config这个参数,我们继续查看下面的Typecho_Db

 这句话的意思就是在$adapertName这个变量的前面加上一些字符串,那么如果说,$adapterName是一个对象呢?意思是不是就是将对象转化为了一个字符串呢?如果满足这种情况,我们是不是就可以去利用__tostring()这个魔术方法去写最后的payload呢?因为__tostring这个魔术方法本身就是当对象转化为了字符串时候才会去自动调用的方法(这里的想法确实是有点天马行空的感觉,但是做渗透确实需要这种思维),那么我们现在就需要去找__tostring()这个魔术方法了,继续上我们的代码审计工具

然后我们找定义的地方,这里第一个不是定义,第二个是只有一行静态的内容,都没有用,然后聚焦到第三行,在源代码里面进行审计

 经过一系列的代码审计,终于找到一个可以利用的点,其余的属性全都是写死了的,也就是静态this的调用方式,而这里不是静态的,它可以是别的对象里面去调用这个属性,那么我们可以想到一种魔术方法:__get(),这个魔术方法是当对象中调用不存在的属性时候会自动去调用这个魔术方法,那么我们需要去找到一个既有__get()魔术方法的又没有screenName这个属性的对象(这里终于来点感觉了),继续在代码审计工具里面找__get()

经过我们不懈的查找审计,最后锁定到Request.php这个文件,符合要求并可以被利用

 

 

 看到这两个函数,我们应该能够想到一个漏洞----->RCE漏洞,这两个函数就是RCE漏洞的危险函数,使用不当就会造成RCE漏洞,例如:array_map("eval","array(phpinfo())"),所以,我们可以将$filter赋值eval,将$value赋值array(phpinfo()),来造成RCE的目的,所以核心就是利用反序列化来构成RCE

4 payload组装

        接下来,我们要做的就是反推payload:

        要用的类:Typecho_Feed,Typecho_Request

        最终体现的形式是一个数组,最终写的poc为:

      

 

 payload为:YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVjaG9fRmVlZCI6Mjp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo3OiJSU1MgMi4wIjtzOjIwOiIAVHlwZWNob19GZWVkAF9pdGVtcyI7YToxOntpOjA7YTo0OntzOjU6InRpdGxlIjtzOjM6InNzcyI7czo0OiJsaW5rIjtzOjM6Ind3dyI7czo0OiJkYXRlIjtpOjIwMjM2ODtzOjY6ImF1dGhvciI7TzoxNToiVHlwZWNob19SZXF1ZXN0IjoyOntzOjI0OiIAVHlwZWNob19SZXF1ZXN0AF9wYXJhbXMiO2E6MTp7czo5OiJzY3JlZU5hbWUiO3M6OToicGhwaW5mbygpIjt9czoyNDoiAFR5cGVjaG9fUmVxdWVzdABfZmlsdGVyIjthOjE6e2k6MDtzOjY6ImFzc2VydCI7fX19fX1zOjY6InByZWZpeCI7czo4OiJ0eXBlY2hvXyI7fQ==

根据之前的审计,需要将这段payload放入cookie中并且变量为__typecho_config,所以抓包(不要忘记加上之前那个绕过条件)

 

 成功拿到探针,over

四 感悟

        整个复现过程是比较难受的,因为对于我这种新手小白来讲,找反序列化漏洞,找poc有点过于艰辛,这个过程中我也确实想过放弃,但是我又想,如果连这种困难跨不过去,遇到这种问题都想着逃避,那我也不用学网安了,好在最后坚持了下来,感觉还不错

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网安小白(web渗透阶段)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值