ThinkPHP5漏洞分析之文件包含

news2024/9/21 16:38:57

目录

漏洞概要

漏洞环境

环境搭建

配置

测试:

漏洞分析:

extract: 

参数

Lua::assign

示例

array_merge

说明

返回值

 array_merge() 示例

fetch:

漏洞修复


漏洞概要

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

漏洞环境

thinkphp5.0.10

环境搭建

GitHub - top-think/think at v5.0.10

GitHub - top-think/framework at v5.0.10

将这两个文件下载到本地,将framework改名为thinkphp放到think-5.0.10中。

原因是我们要加载的thinkphp框架默认路径写的是thinkphp

这里使用的是nginx,所以将文件放在nginx文件夹下了,这都不重要,根据自己情况决定。

将think-5.0.10改名为tp5010了,这个改不改不影响。

配置

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 文件,内容随意(没有这个模板文件的话,在渲染时程序会报错)

到这里就可以访问了,我这里什么都没写,但是可以访问。。。

http://localhost/tp5010/public/index.php

测试:

写了一个图片马放到public文件下,访问该图片马即可触发 文件包含漏洞

使用蚁剑连接

http://192.168.10.128/tp5010/public/index.php?cacheFile=open.png

成功添加,可以看到已经成功

漏洞分析:

在官方发布的 5.0.19 版本更新说明中,发现其中提到该版本包含了一个安全更新

我们可以查阅其 commit 记录,发现其改进了模板引擎,其中存在危险函数 extract ,有可能引发变量覆盖漏洞。接下来,我们直接跟进代码一探究竟。

extract: 

参数

array

一个关联数组。此函数会将键名当作变量名,值作为变量的值。 对每个键/值对都会在当前的符号表中建立变量,并受到 flags 和 prefix 参数的影响。

必须使用关联数组,数字索引的数组将不会产生结果,除非用了 EXTR_PREFIX_ALL 或者 EXTR_PREFIX_INVALID

flags

对待非法/数字和冲突的键名的方法将根据取出标记 flags 参数决定。可以是以下值之一:

EXTR_OVERWRITE

如果有冲突,覆盖已有的变量。

EXTR_SKIP

如果有冲突,不覆盖已有的变量。

EXTR_PREFIX_SAME

如果有冲突,在变量名前加上前缀 prefix

EXTR_PREFIX_ALL

给所有变量名加上前缀 prefix

EXTR_PREFIX_INVALID

仅在非法/数字的变量名前加上前缀 prefix

EXTR_IF_EXISTS

仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。 举个例子,以下情况非常有用:定义一些有效变量,然后从 $_REQUEST 中仅导入这些已定义的变量。

EXTR_PREFIX_IF_EXISTS

仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。

EXTR_REFS

将变量作为引用提取。这有力地表明了导入的变量仍然引用了 array 参数的值。可以单独使用这个标志或者在 flags 中用 OR 与其它任何标志结合使用。

如果没有指定 flags,则被假定为 EXTR_OVERWRITE

prefix

注意 prefix 仅在 flags 的值是 EXTR_PREFIX_SAMEEXTR_PREFIX_ALLEXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。 如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。前缀和数组键名之间会自动加上一个下划线。

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

Lua::assign

Lua::assign — 将一个php变量赋值给Lua

示例

示例  Lua::assign()示例

<?php
$lua = new Lua();
$lua->assign("php_var", array(1=>1, 2, 3)); //lua table index begin with 1
$lua->eval(<<<CODE
print(php_var);
CODE
);
?>

以上示例会输出:

Array
 (
     [1] => 1
     [2] => 2
     [3] => 3
 ) 

array_merge

array_merge — 合并一个或多个数组

说明

array_merge(array ...$arrays): array

将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。

如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将 不会 覆盖原来的值,而是附加到后面。

如果输入的数组存在以数字作为索引的内容,则这项内容的键名会以连续方式重新索引。

返回值

返回合并后的结果数组。如果参数为空,则返回空 array。

 array_merge() 示例

<?php
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);
?>

以上示例会输出:

Array
(
    [color] => green
    [0] => 2
    [1] => 4
    [2] => a
    [3] => b
    [shape] => trapezoid
    [4] => 4
)

走到这里,GET传入的"cacheFile:open.php"参数给了data,然后data走进fetch方法中 

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

fetch:

/tp5010/thinkphp/library/think/view/driver/Php.php

我们可以通过这个路径找到View类所在的源代码文件。在View.php源文件中,有一个View类,其中定义了fetch()方法的代码,如下所示:

/**
* 渲染模板输出
* @access public
* @param string    $templateFile 模板文件名
* @param array     $vars         模板输出变量
* @param array     $config       模板参数
* @return void
* @throws Excepton
*/
public function fetch($templateFile =&#39;&#39;,$vars =[],$config =[])
{
    //将变量赋值到视图模板中
    if(!empty($vars)){
       $this->assign($vars);
    }
    //处理模板文件名并判断是否存在
    $templateFile =$this->parseTemplateFile($templateFile);

    if(!is_file($templateFile)){
        throw new Exception(&#39;template file not exists:&#39; . $templateFile);
    }

    // 模板输出过滤
    $this->filter($templateFile);

    // 解析视图模板中的函数
    $content =$this->fetchParse($templateFile, $config);

    // 视图模板编译缓存
    if ($this->config(&#39;tpl_cache&#39;)&& !empty($TemplateCache)){
        $TemplateCache->set($cacheFile,$content);
    }

    //返回解析后的视图模板内容
    return $content;
}

在这段代码中,我们可以看到fetch方法的定义和具体实现。

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

漏洞修复

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2039410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录 day 39 动态规划 打家劫舍

第九章 动态规划part07 今天就是打家劫舍的一天&#xff0c;这个系列不算难&#xff0c;大家可以一口气拿下。 198.打家劫舍 视频讲解&#xff1a;https://www.bilibili.com/video/BV1Te411N7SX https://programmercarl.com/0198.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8D.html…

Ubuntu虚拟机安装及汉化

一、安装 1.勾选典型(推荐)(T)——点击下一步 2.点击浏览找到光盘映像文件打开&#xff08;此文件很重要安装好后安装包不要卸载&#xff0c;放在不容易被删除的地方&#xff09;——点击下一步 3.将信息补充完整——点击下一步 4.点击浏览选择要将虚拟机安装在哪个路径&…

【IT行业研究报告】Internet Technology

一、引言 随着信息技术的飞速发展&#xff0c;IT行业已成为全球经济的重要驱动力。从云计算、大数据、人工智能到物联网&#xff0c;IT技术正深刻改变着各行各业的生产方式、商业模式和人们的生活方式。本报告旨在深入分析IT行业的现状、发展趋势和挑战&#xff0c;探讨其在各…

基于C11的简单log,支持C++的‘<<’风格和C的‘可变参数’风格

基于C11的简单log&#xff0c;支持C的‘<<’风格和C的‘可变参数’风格 日志仅由richlog.h单个文件实现功能&#xff0c;软件集成简单。 支持C的std::cout的<<风格的日志打印&#xff0c;也支持C的printf风格的日志打印 日志多线程安全&#xff0c;采用C11 mute…

Adobe PhotoShop - 制图操作

1. 排布照片 菜单 - 视图 - 对齐&#xff1a;打开后图层将会根据鼠标的移动智能对齐 菜单 - 视图 - 标尺&#xff1a;打开后在页面出现横纵标尺&#xff0c;方便图层的对齐与排列 2. 自动生成全景照 在日常处理中&#xff0c;我们常常想要将几张图片进行拼接获得一张全景图&…

Linux:文件管理,目录管理,文件系统,链接类型

1&#xff0c;文件管理 用户&#xff08;标识号&#xff1a;UID&#xff09;&#xff1a;一定资源的使用者&#xff0c;可以创建和管理文件以及访问其他用户文件。可以从属于多个群组。 用户组&#xff08;标识号&#xff1a;GID&#xff09;&#xff1a;由一定数量的对某些文件…

GlobalMapper软件安装流程

目录 一、环境准备 二、安装步骤 三、软件激活 一、环境准备 系统&#xff1a;win7操作系统 安装包下载&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1Vb4VVRFBRYawt3MT-5gYOw 提取码&#xff1a;sxdj 二、安装步骤 1、解压&#xff0c;右键global-mapper-23_1-x…

NVDLA专题5:具体模块介绍——Convolution Buffer

概述 卷积缓冲器(CBUF)是卷积流水线中的一个阶段&#xff0c;module定义在NV_NVDLA_cbuf.v&#xff0c;module信息如下&#xff1a; module NV_NVDLA_cbuf (nvdla_core_clk //|< i,nvdla_core_rstn //|< i,cdma2buf_dat_wr_addr //|< i,cdma2buf_dat_wr_…

轻松提升效率:10款工时管理软件推荐

本文将介绍以下10款工具&#xff1a;PingCode、Worktile、百宝云、华为云项目管理、Yonyou NC、云效、红圈通、Asana、7pace Timetracker、Toggl Track。 管理项目工时时&#xff0c;面对繁杂的数据和紧迫的截止日期&#xff0c;很多人都会感到压力倍增。选择一款合适的项目工时…

各大App又要出年度报告啦,看看往年的,谁家能够打动你。

还有几个月就到年终了&#xff0c;各大app都要出年度报告或者年度账单了&#xff0c;咱们先看看往年的效果&#xff0c;你觉得那家好呢&#xff1f;

阿一网络安全实践演练之查找并利用未使用的 API 端点

描述 为了解决实验室问题&#xff0c;利用一个隐藏的 API 端点购买一件 Lightweight l33t 皮夹克。您可以使用以下凭据登录您自己的账户&#xff1a;wiener:peter。 所需知识 要解决这个实验室问题&#xff0c;您需要了解以下内容&#xff1a; 如何利用错误消息构造有效的请…

凡图公益新篇章:凡图家庭教育携手舜和社区,共绘心理健康蓝图

在这个充满挑战与机遇并存的时代&#xff0c;心理健康作为衡量社会文明与进步的重要标尺&#xff0c;正日益受到社会各界的广泛关注。 正是基于这份对美好生活的共同向往与追求&#xff0c;凡图(山东)教育科技集团有限公司与济南市中区舜和社区正式签署了心理援助协议&#xf…

Linux操作系统安装

Linux操作系统安装 Linux操作系统简介VMware 虚拟机简述安装 VMware 虚拟机创建新的虚拟机 安装 Linux 操作系统&#xff08;以 CentOS 为例&#xff09;远程工具连接 Linux查看Linux的ip链接Linux操作步骤 Linux操作系统简介 Linux内核kernel最初是由芬兰人李纳斯托瓦兹&#…

基于计算机爱心小屋公益机构智慧管理(源码+论文+部署讲解等)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台的优…

Alignment

一、前置 1、我们的目的是&#xff1a;给一串声学特征&#xff0c;得出tokens的概率。 2、LAS要计算P(Y|X)&#xff0c;可以直接计算 3、training&#xff0c;就是要找到得到概率结果最大的network的参数 4、CTC、RNN-T要计算P(X|Y)依赖于要知道alignment&#xff08;下图以CT…

模型意识对比学习:摆脱训练中的一致性-容忍度困境

论文出处: ICML2023 Model-Aware Contrastive Learning: Towards Escaping Uniformity-Tolerance Dilemma in Training 什么是uniformity-tolerance困境? 温度参数 τ 的设置会影响模型性能 如果 τ 太小,模型会对训练不足的阶段施加过大的惩罚,导致难以区分潜在阳性样本,…

浙大数据结构慕课课后题(06-图3 六度空间)

题目要求&#xff1a; 输入格式: 输入第1行给出两个正整数&#xff0c;分别表示社交网络图的结点数N&#xff08;1<N≤103&#xff0c;表示人数&#xff09;、边数M&#xff08;≤33N&#xff0c;表示社交关系数&#xff09;。随后的M行对应M条边&#xff0c;每行给出一对正…

简单案例:搞定 SpringBoot 接口恶意刷新和暴力请求

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 前言 恶意刷新和暴力请求是指攻击者通过大量重复发送请求来对服务器进行攻击的行为。这些请求可能包括频繁刷新页面、提交表单、尝试登录等&#xff0c;旨在消耗服务器资源、导致服务不可用或破坏正常用户的…

WSL 忘记ubuntu的密码

文章目录 1. 以管理员身份打开 PowerShel2.输入命令 wsl.exe -d Ubuntu-20.04 --user root3.输入命令 passwd username 修改用户密码&#xff0c;username即待重置的用户的名称 1. 以管理员身份打开 PowerShel 2.输入命令 wsl.exe -d Ubuntu-20.04 --user root 注意版本号是自…

机械行业数字化生产供应链产品解决方案(一)

在机械行业数字化生产供应链产品解决方案中&#xff0c;通过全面融合物联网技术、数据分析、自动化控制系统和智能供应链管理平台&#xff0c;企业能够实现生产过程的实时监控、智能优化和高效管理&#xff0c;从而显著提升生产效率、降低运营成本&#xff0c;并增强供应链的响…