给了IndexController
且可以看到版本为Willphp2.1.5
查了一下发现TP3.2.x 利用assign函数RCE的漏洞,因为题中的PHP框架是基于TP的,怀疑存在同样的漏洞,跟进一下发现的确,利用方式差不多只需要稍微改一下
原TP利用姿势 https://0xcreed.jxustctf.top/2021/07/ThinkPHP3-2-x-RCE%E5%A4%8D%E7%8E%B0/
调试过程
调用assgin会为View->_vars赋值
index执行view(),进入View的fetch方法
这里会为vfile赋好默认值,不用管,然后把vfile和_vars传入Tple::render()
C会去调用getConfig,检测config中有没有设置shtml_open,默认感觉是没有的,所以函数shtml_open为false,进入renderTo
extract把上面设定好的cfile覆盖为传入的value,include包含
即get传入name=cfile&value=xxx时,可以包含xxx
继续审计源码
发现debug=false时error或exception会写入log,且log名固定,所以通过报错在log写入恶意代码并包含来getshell
比赛的时候找了半天,没有发现可以报错的点,一开始发现在value处传恶意代码,框架会因为include时找不到文件名而报错,并把恶意代码(也就是文件名)报在log里,但是php好像默认对include中的内容做了转义,<、>都会被转义,所以没办法执行php代码
后面发现题目中的环境和官网下载的代码有点不一样,读了下其他文件,发现他重写了EmptyController
这样就多了一个抛出异常的点,我们只需要访问不存在的MODULE或者ACTION,他就会把访问的模块和方法名报在日志里,这里传入恶意代码就可以包含了
如直接访问/index.php/biodog/<?php phpinfo();?>
但由于框架的某些原因,对传入的代码做了很多莫名的过滤,大写字符会被强转成小写,且不能传/
我用了chdir跳转路径,exp类似如下
<?php
chdir(..);
chdir(..);
chdir(..);
chdir(..);
system(ls);
?>
骚操作之利用pearcmd.php
https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp