代码编织梦想

image-20211117223456251

漏洞概要

漏洞存在于 ThinkPHP模板引擎中,在加载模版解析变量时存在变量覆盖问题,而且程序没有对数据进行很好的过滤,最终导致文件包含漏洞 的产生。

影响版本

5.0.0 <= Thinkphp <= 5.0.18

5.1.0 <= ThinkPHP <= 5.1.10

环境搭建

Phpstudy:

  • OS: Windows
  • PHP: 7.3.4
  • ThinkPHP: 5.0.18

创建测试环境:

composer create-project topthink/think=5.0.18 thinkphp5.0.18

composer.json 文件的 require 字段设置成如下:

"require": {
    "php": ">=5.4.0",
    "topthink/framework": "5.0.18"
},

执行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
    }
}

创建 application/index/view/index/index.html 文件,内容任意,作为这个index控制器的index方法的模板。

在public目录放置一个图片马,模拟文件上传操作

漏洞复现

http://localhost:8090/public/?cacheFile=1.jpg

访问即可文件包含

image-20211130235551702

漏洞分析

public function index()
    {
        $this->assign(request()->get());
        return $this->fetch(); 
    }

跟进assign()方法

image-20211201002846035

跟进$this->view->assign

在:thinkphp/library/think/View.php

image-20211201093144107

将参数赋值后返回,跟进fetch

image-20211201093317181

继续跟进

image-20211201093932731

变量$vars为我们get传入的参数并赋值给$this->data

跟进$this->engine->$method($template, $vars, $config);

think/view/driver/Think.php

image-20211201095558659

可以看到,$data是get传参。parseTemplate()函数获取模板文件名,得到默认文件名

继续跟进fetch方法

public function fetch($template, $vars = [], $config = [])
    {
        if ($vars) {
            $this->data = $vars;
        }
        ...
        if ($template) {
        	...
            // 读取编译存储
            $this->storage->read($cacheFile, $this->data);
            // 获取并清空缓存
            ...
            echo $content;
        }
    }

跟进$this->storage->read($cacheFile, $this->data);

在:think/template/driver/File.php

image-20211201115020846

这里有extract($vars, EXTR_OVERWRITE);。在EXTR_OVERWRITE标记的情况下,如果有冲突,覆盖已有的变量。那么我们可以通过变量覆盖$cacheFile变量,从而实现文件包含。

方法调用栈:

image-20211201115312700

漏洞修复

判断get传参里是否有cacheFile键,有的话就删掉,也删掉_think_cacheFile键,然后再进行文件包含。

image-20211201120146191

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cosmoslin/article/details/121652488

thinkphp任意代码执行漏洞_云生2342的博客-爱代码爱编程

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!             

thinkphp3.x、5.x框架任意文件包含-爱代码爱编程

ThinkPHP简介 ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标

ThinkPHP5 远程代码执行漏洞分析-爱代码爱编程

前言 消息刚刚曝出来的时候还以为自己能半天把漏洞给找出来,果然是太菜太年轻了,23333 漏洞分析 漏洞点 此次漏洞出现在ThinkPHP用于处理HTTP请求的Request类中,其中的method方法用于获取当前的请求类型。 thinkphp/library/think/Request.php var_method为“表单伪装变量”,可在

solidity合约结构-爱代码爱编程

solidity 合约结构 什么是智能合约? 一种旨在以信息化方式传播、验证、或执行合同的计算机协议,它允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。 从技术上,通常我们把在区块链上运行的程序称为智能合约 1. 一个简单的智能合约 下面我们用一个简单的智能合约作为示例,来看看智能合约的基本结构: pragma solidity

Web安全实战系列:文件包含漏洞-爱代码爱编程

**本文转自:freebuf  山东安山**  前言 《Web安全实战》系列集合了WEB类常见的各种漏洞,笔者根据自己在Web安全领域中学习和工作的经验,对漏洞原理和漏洞利用面进行了总结分析,致力于漏洞准确性、丰富性,希望对WEB安全工作者、WEB安全学习者能有所帮助,减少获取知识的时间成本。   0x01 文件包含简介 服务器执行PHP文件

ThinkPHP漏洞总结(利用)-爱代码爱编程

ThinkPHP介绍 ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标

ThinkPHP5RCE漏洞复现-爱代码爱编程

又到了闲来无事的漏洞复现时间~~~   ThinkPHP RCE漏洞是由于变量覆盖而引起的,漏洞源于可以对thinkphp/library/think/Request.php文件中的method方法可以进行变量覆盖,通过覆盖类的核心属性filter导致RCE,其攻击点较为多,有些还具有限制条件,另外该漏洞在利用上会出现一些问题。 漏洞影响范围:<

ThinkPHP5.0.18_文件包含漏洞分析-爱代码爱编程

ThinkPHP5.0.18_文件包含漏洞分析 ThinkPHP5.0.0-ThinkPHP5.0.18/ThinkPHP5.1.0-ThinkPHP5.1.10漏洞代码<?php namespace app\index\controller; use think\Controller; class Index extends Controller