当前位置:   article > 正文

ThinkPHP5 文件包含_thinkphp5文件包含

thinkphp5文件包含

漏洞概要

  • 本次漏洞存在于 ThinkPHP 模板引擎中,在加载模版解析变量时存在变量覆盖问题,而且程序没有对数据进行很好的过滤,最终导致文件包含漏洞的产生
  • 漏洞影响版本: 5.0.0<=ThinkPHP<=5.0.21 、 5.1.3<=ThinkPHP5<=5.1.25

初始配置

  • 获取测试环境代码
composer create-project --prefer-dist topthink/think=5.0.18  tpH3rmesk1t
  • 1

在这里插入图片描述

  • composer.json 文件的 require 字段设置成如下
"require": {
    "php": ">=5.6.0",
    "topthink/framework": "5.0.18"
},
  • 1
  • 2
  • 3
  • 4

然后执行 composer update ,并将 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
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

创建 application/index/view/index/index.html 文件,内容随意(没有这个模板文件的话,在渲染时程序会报错)

在这里插入图片描述

漏洞利用

将图片马 demo.jpg 放至 public 目录下(模拟上传图片操作),访问

http://127.0.0.1/cms/public/index.php/index/index?cacheFile=demo.jpg
  • 1

在这里插入图片描述

漏洞分析

首先,用户可控数据未经过滤,直接通过 Controller 类的 assign 方法进行模板变量赋值,并将可控数据存在 think\View 类的 data 属性中

在这里插入图片描述

接着程序开始调用 fetch 方法加载模板输出,这里如果我们没有指定模板名称,其会使用默认的文件作为模板,模板路径位:当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html ,如果默认路径模板不存在,程序就会报错,跟进到 thinkphp/library/think/View.php

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

我们跟进到 Template 类的 fetch 方法,可以发现可控变量 $vars 赋值给 $this->data 并最终传入 File 类的 read 方法,而 read 方法中在使用了 extract 函数后,直接包含了 $cacheFile 变量,这里就是漏洞发生的关键原因,因为 extract 函数中的参数 $vars 可以由用户控制,可以通过 extract 函数,直接覆盖 $cacheFile 变量

在这里插入图片描述
在这里插入图片描述

完整的方法调用,从下往上

在这里插入图片描述

漏洞修复

官方的修复方法是:先将 $cacheFile 变量存储在 $this->cacheFile 中,在使用 extract 函数后,最终 include 的变量是 $this->cacheFile ,这样也就避免了 include 被覆盖后的变量值

在这里插入图片描述

攻击总结

参考Mochazz师傅的审计流程

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/1011047
推荐阅读
相关标签
  

闽ICP备14008679号