Thinkphp5文件包含

审完这个暂时就先不审了,去刷下ctfshow的tp题先试试手

影响版本

5.0.0<=ThinkPHP5<=5.0.18 、5.1.0<=ThinkPHP<=5.1.10

环境

我这里有之前安好的5.0.12就直接用了

\application\index\controller\index.php

<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
    public function index()
    {
        $this->assign(request()->get());
        return $this->fetch(); // 当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html

    }
}

application/index/view/index/index.html 内容任意(空文件亦可),主要是作为控制器中index方法的模板

分析

payload

?cacheFile=1.php			#我在public下写了一个1.php便于文件包含

首先是进入get(),其实get()就是获取我们get传参的值,内容也比较简单所以就粗略的跟进下。

$this->get不为空,$name是字符串,所以没进入if,直接进入input()(圈出来的是各参数值)
在这里插入图片描述

input的前两个if都绕开了,getFilter()给$filter多赋了个null值,之后进入array_walk_recursive()回调filterValue()(这里的$data就是上一步的$get值)
在这里插入图片描述

跟进后其实也没执行啥,就执行了最后的filterExp(),对用户传参进行过滤,但这个基本上是针对sql的所以对我们的payload没影响最终返回$data的值,其实$data的值自始至终没发生过改变

在就跟进assign()了,$name就是get()方法retrun的值,也就是$data的值

protected function assign($name, $value = '')
{
    $this->view->assign($name, $value);
}

再跟进$this->view->assign($name, $value);assign()

通过array_merge(),将$this->data$name的值合并传给$data,但$this->data默认为null,所以也就相当于把$name给了它,retrun返回$this
在这里插入图片描述

回到我们自己定义的控制器$this->assign(request()->get());就执行完了,再跟进下一行的fetch()

protected function fetch($template = '', $vars = [], $replace = [], $config = [])
{
    return $this->view->fetch($template, $vars, $replace, $config);
}

又是套娃继续跟进(四个参数默认为空)

还是array_merge()合并,1和3参数为空,所以$vars=$data;也就是我们get传参的值,$method三目运算,$renderContent=false所以$method=fetch160行就相当于又执行了fetch()
在这里插入图片描述

跟进$template默认为空,parseTemplate()获取我们模板文件的路径(看下底下的值就明白了),之后又又进入了fetch(),可以看下三个参数的值
在这里插入图片描述

跟进,前边三个if只有第一个执行了,然后进入parseTemplateFile(),里边其实就执行了一个记录模板文件的更新时间的操作,不看了

下边if,对$cacheFile赋值缓存的一个路径,之后直接进入read()
在这里插入图片描述

跟进,进入if进行了个变量覆盖在,EXTR_OVERWRITE标记的情况下,如果有冲突,覆盖已有的变量。所以就将原有的缓存路径替换成了1.php最后文件包含
在这里插入图片描述
在这里插入图片描述

不得不说TP非RCE的链真的很友好!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值