thinkphp5漏洞分析之文件包含

目录

一、环境

二、开始研究

三、漏洞分析

四、漏洞修复

五、攻击总结


一、环境

thinkphp官网下载

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

二、开始研究

创建一个图片马,并将图片马 1.jpg 放至 public 目录下(模拟上传图片操作)。接着访问 http://localhost:8000/index/index/index?cacheFile=test.php 链接,即可触发 文件包含漏洞

 复制一下文件

我们直接下断点分析

追到数组

判断name是不是一个数组

走入fatch方法

之后生成临时文件,利用vars生成临时变量,之后包含我们的test.jpg包含住,而原因就是extract这个函数

include把见到任何一个文件会将其当做php文件执行

三、漏洞分析

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

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

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

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

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

四、漏洞修复

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

五、攻击总结

最后,再通过一张攻击流程图来回顾整个攻击过程。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端开发刷题 | 链表内指定区间反转【链表篇】

描述 将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n)O(n),空间复杂度 O(1)O(1)。 例如: 给出的链表为 1→2→3→4→5→NULL1→2→3→4→5→NULL, m2,n4 返回 1→4→3→2→5→NULL 数据范围: 链表…

java使用itext 直接生成pdf

itext 使用 需求背景itext 的使用依赖简单示例基础设置(页面大小、边距、字体等)段落内部,特殊设置关键字 字体或颜色生成动态表格页脚展示页数其他设置密码添加水印(背景图)目录Header, Footer分割 PDF合并 PDF 需求背…

Oracle+ASM+High冗余详解及空间计算

Oracle ASM(Automatic Storage Management)的High冗余模式是一种提供高度数据保护的策略,它通过创建多个数据副本来确保数据的可用性和安全性。 以下是关于Oracle ASM High冗余的详细解释: 一、High冗余的特点 1.数据冗余度 在Hi…

ThreadLocal 详解

文章目录 1.什么是Thradlocal2.Thradlocal常见的API3.什么是内存溢出与内存泄漏内存溢出 (Memory Overflow)内存泄漏 (Memory Leak) 4.强 软 弱 虚引用实现区别5.Threadlocal原理分析set方法get方法 6.Threadlocal产生内存泄漏问题断点查看变化 1.什么是Thradlocal ThreadLoca…

Golang基于DTM的分布式事务TCC实战

Golang基于DTM的分布式事务SAGA实战-CSDN博客 源代码:https://github.com/Ssummer520/dtm-gin 我们可以通过canal来监听转账表的binlog来看数据库变更docker-compose 安装canal-CSDN博客 代码在宿主机运行 docker network:bridge docker安装,安装成功后可以访问h…

python提取b站视频的音频(提供源码

如果我想开一家咖啡厅,那么咖啡厅的音乐可得精挑细选!又假设我非常喜欢o叔,而o叔只在b站弹钢琴,那这时候我就得想方设法把b站的视频转为音频咯! 一、首先打开网页版bilibili,按F12: 二、刷新页面…

力扣爆刷第174天之TOP200五连刷136=140(最小k数、字典序、跳跃游戏)

力扣爆刷第174天之TOP200五连刷136140(最小k数、字典序、跳跃游戏) 文章目录 力扣爆刷第174天之TOP200五连刷136140(最小k数、字典序、跳跃游戏)一、LCR 159. 库存管理 III二、450. 删除二叉搜索树中的节点三、440. 字典序的第K小…

【Spark集群部署系列一】Spark local模式介绍和搭建以及使用(内含Linux安装Anaconda)

简介 注意: 在部署spark集群前,请部署好Hadoop集群,jdk8【当然Hadoop集群需要运行在jdk上】,需要注意hadoop,spark的版本,考虑兼容问题。比如hadoop3.0以上的才兼容spark3.0以上的。 下面是Hadoop集群部署…

【Oracle篇】统计信息和动态采样的深度剖析(第一篇,总共六篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…

网络协议 十一 ARP,RARP,icmp,websocket,webservice,HTTPDNS,FTP,邮件相关的协议, SMTP,POP,IMAP

ARP 已知IP 求 MAC 的过程 RARP 已知MAC 求 IP 的过程,已被DHCP取代 ICMP websocket 协议,html5中提出的前端使用协议 webservice 技术,已过时 HTTPDNS 之前我们要获得 某一个域名的 IP ,要通过DNS协议 去 运营商的ISP 查询&…

计算机毕业设计 饮食营养管理信息系统 平衡膳食管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

一文入门re 正则表达式

一、常用方法 (一)匹配 一般使用方法 第一个参数:正则模式 第二个参数:需要处理的字符串 第三个参数:附加处理方法result从任意位置开始匹配,返回match,没有匹配到返回None result re.searc…

Linux:CentOS配置

一,安装VMware 这个可以通过官网获取 vmware下载 也可以联系我,我发给你 二,安装CentOS Centos官网找要下载的版本: https://vault.centos.org/ 阿里云镜像:https://mirrors.aliyun.com/centos-vault/?spma2c6h.13…

window搭建代理ip池:详细的搭建指南分享

在Windows上搭建代理IP池的指南 在进行网络爬虫或其他需要频繁请求的任务时,建立一个代理IP池可以有效提高抓取效率和隐私保护。本文将详细介绍如何在Windows环境下搭建一个简单的代理IP池。 1. 准备工作 在开始之前,请确保你具备以下条件&#xff1a…

使用Nexus3为containerd和docker配置镜像代理

1.Nexus3介绍: Nexus3(Nexus Repository Manager3)是一个用于存储、组织和管理软件组件(如 JAR文件、npm包、Docker镜像等)的仓库管理系统。它由Sonatype开发并维护。Nexus Repository Manger支持许多流行的包管理工具…

java 函数接口Consumer简介与示例【函数式编程】【Stream】

Java 8 中的 消费者接口Consumer 是一个函数接口&#xff0c;它可以接受一个泛型 类型参数&#xff0c;它属于java.util.function包。我们来看看Java函数接口库中的定义&#xff1a; FunctionalInterface public interface Consumer<T> {/*** Performs this operation o…

vue+elmentui 定义狂拽黑金配色的按钮+消息框

1 修改效果 通过自定义样式的方式可以修改elmentui的配色&#xff0c;例如下面我们修改掉了button的primary配色为黑金色&#xff1a; 修改前&#xff1a; 修改后 修改了elementui 的$message(success类型&#xff09;颜色为黑金色、图标也修改为金色了&#xff1a; 修改前…

Windows 环境下 Go 语言使用第三方压缩包 gozstd 的报错处理

该文章主要记录在windows平台用go语言使用gozstd包时&#xff0c;遇到的错误及处理过程&#xff08;踩坑之旅&#xff09;&#xff01; 一、gozstd简介 gozstd是一个针对Zstandard&#xff08;简称Zstd&#xff09;的Go语言包装器&#xff0c;它提供了简单且高效的API&#xf…

Blazor开发框架Known-V2.0.8

V2.0.8 Known是基于Blazor的企业级快速开发框架&#xff0c;低代码&#xff0c;跨平台&#xff0c;开箱即用&#xff0c;一处代码&#xff0c;多处运行。目前已有部分客户在使用&#xff0c;最近客户的项目和产品&#xff0c;有的在Docker中运行&#xff0c;有的在重新升级改造…

使用 ESP32 和 TFT 屏幕显示实时天气信息 —— 基于 OpenWeatherMap API

实时监测环境数据是一个非常常见的应用场景&#xff0c;例如气象站、智能家居等。这篇博客将带你使用 ESP32 微控制器和一个 TFT 屏幕&#xff0c;实时显示当前城市的天气信息。通过 OpenWeatherMap API&#xff0c;我们能够获取诸如温度、天气情况以及经纬度等详细的天气数据&…