ThinkPHP5.0.18_文件包含漏洞分析

ThinkPHP5.0.18_文件包含漏洞分析

  • ThinkPHP5.0.0-ThinkPHP5.0.18/ThinkPHP5.1.0-ThinkPHP5.1.10
  • 漏洞代码
    
    namespace app\index\controller;
    use think\Controller;
    class Index extends Controller
    {
        public function index(){
            $this->assign(request()->get());
            return $this->fetch();
        }
    }
    
  • payload
    /index.php?cacheFile=exp.php
    

漏洞分析

  1. 获取GET参数值的操作就不跟进了,这里直接跟进assign方法
    ThinkPHP5.0.18_文件包含漏洞分析_第1张图片
  2. 经过Controller::assign->View::assign调用,进入View::assign方法,这个方法的操作就是把GET参数传过来的值以键值对的方法存储罢了。
    ThinkPHP5.0.18_文件包含漏洞分析_第2张图片
  3. 回到index方法,$this->assign(request()->get());的操作就是对GET传参的值进行赋值,然后继续跟进Controller::fetch方法,经过Controller::fetch->View::fetch调用链之后进入View::fetch方法
    ThinkPHP5.0.18_文件包含漏洞分析_第3张图片
  4. 这里array_merge方法把GET传入的参数(也就是$this->data)赋值给$vars,然后$method变量是fetch,然后调用Think::fetch
    ThinkPHP5.0.18_文件包含漏洞分析_第4张图片
  5. 跟进fetch方法,通过parseTemplate方法获取默认模板名,也就是application/index/view/index/index.html,这里不用管它,然后进行日志记录,再就是调用Template::fetch方法
    ThinkPHP5.0.18_文件包含漏洞分析_第5张图片
  6. 继续跟进fetch方法,这里先把$vars赋值给$this->data,第二个和第三个if一般条件无法满足,这里不用管它,然后调用File::read方法
    ThinkPHP5.0.18_文件包含漏洞分析_第6张图片
  7. 跟进read方法,发现存在extract函数,当这个函数的第二个参数为EXTR_OVERWRITE时表示变量覆盖时有冲突会覆盖已有变量,所以这里可以构造任何变量的值。且read方法下面有一个文件包含操作,那么覆盖$cacheFile变量即可造成文件包含漏洞!
    ThinkPHP5.0.18_文件包含漏洞分析_第7张图片
  8. 可以上传图片马然后进行利用变量覆盖进行包含图片马获取服务器权限

写在后面

  • 这条链可以进行任意文件包含,利用的其实是一个变量覆盖漏洞
  • 这条链相对于其它的TP链可以说是比较清晰,没那么多干扰代码

你可能感兴趣的:(代码审计,ThinkPHP,安全漏洞,安全,web安全)