当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是会直接抛出异常的

但下述版本是没有__wakeup限制的
? < 4.x ≤ 4.2.3
? < 3.x ≤ 3.9.6
Process这个类并不是CakePHP组件的源码,而是symfony组件的,所以要下载完整的CakePHPweb项目包。
链子

进入stop()

进入isRunning()



终于有了一个动态调用,readAndWrite这里可以用来触发__call
3.x版本利用
选择的方法vendor\cakephp\cakephp\src\ORM\Table.php#__call

去找谁有危险call函数
vendor\cakephp\cakephp\src\ORM\BehaviorRegistry.php#call
因为这是动态调用方法,所以我们可以触发任何我们想要的函数,只是参数是定的,为两个bool值
上图的两个条件判断分别为

都是可控的。所以这条链路可以走通。
因为参数不可控所以最好找个无参或者参数没啥用的函数
vendor\cakephp\cakephp\src\Shell\ServerShell.php#main

因为有个system的参数是拼接成的,可以用命令注入
4.x版本利用
4.x版本ServerShell被删除了
新的sink点:vendor\cakephp\cakephp\src\Database\Statement\CallbackStatement.php#fetch

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

上图fetch方法能控制返回值,即上上图的$callback的参数可控了,$callback也是可控的,即任意函数调用
About this Post
This post is written by DashingBug, licensed under CC BY-NC 4.0.