Skip to content

CakePHP-POP链

当php>=7.1.0时,不能无参调用有参函数,会直接Fatal Error

当php<=7.0.33时,可以无参调用有参函数,只是会有一个Warning

CakePHP<=4.2.8

第一处

位于vendor\cakephp\cakephp\src\Mailer\Transport\SmtpTransport.php

详情请见参考文章

第二处

位于vendor\symfony\process\Process.php

在较新版本的CakePHP中Process#__wakeup是会直接抛出异常的

image-20250707102510943

但下述版本是没有__wakeup限制的

? < 4.x ≤ 4.2.3
? < 3.x ≤ 3.9.6

Process这个类并不是CakePHP组件的源码,而是symfony组件的,所以要下载完整的CakePHPweb项目包。

链子

image-20250707122521902

进入stop()

image-20250707122720706

进入isRunning()

image-20250707122750449

image-20250707122814153

image-20250707122845784

终于有了一个动态调用,readAndWrite这里可以用来触发__call

3.x版本利用

选择的方法vendor\cakephp\cakephp\src\ORM\Table.php#__call

image-20250707123419831

去找谁有危险call函数

vendor\cakephp\cakephp\src\ORM\BehaviorRegistry.php#callimage-20250707123818042

因为这是动态调用方法,所以我们可以触发任何我们想要的函数,只是参数是定的,为两个bool值

上图的两个条件判断分别为image-20250707133111837

image-20250707133123064

都是可控的。所以这条链路可以走通。

因为参数不可控所以最好找个无参或者参数没啥用的函数

vendor\cakephp\cakephp\src\Shell\ServerShell.php#main

image-20250707210226058

因为有个system的参数是拼接成的,可以用命令注入

4.x版本利用

4.x版本ServerShell被删除了

新的sink点:vendor\cakephp\cakephp\src\Database\Statement\CallbackStatement.php#fetch

image-20250707213023910

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

image-20250707230846200

上图fetch方法能控制返回值,即上上图的$callback的参数可控了,$callback也是可控的,即任意函数调用

参考:CakePHP反序列化POP链挖掘-先知社区

About this Post

This post is written by DashingBug, licensed under CC BY-NC 4.0.