Thinkphp5文件包含漏洞解析
作者:XINO 发布时间:2023-07-01 19:42:51
前言
ThinkPHP,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的开源轻量级PHP框架。随着框架代码量的增加,一些潜在的威胁也逐渐暴露,本文给大家带来的是对Thinkphp5版本框架里面的文件包含漏洞进行分析,浅谈原理以及如何应用。
什么是文件包含漏洞
首先我们先了解一下什么是文件包含漏洞,文件包含可以分为本地包含和远程包含,有些时候网站会将文件进行包含来执行,这属于是常规操作,但若网站并没有对包含文件进行限制,攻击者便可以包含一些恶意文件来达到命令执行的效果。这里列出四个常见的PHP包含函数:
漏洞简述
在该框架中,由于在加载模版解析变量时存在变量覆盖问题,但像上面所说的一样没有对信息进行过滤,从而框架中产生了文件包含漏洞。影响版本如下:
5.0.0 <= Thinkphp <= 5.0.18
5.1.0 <= ThinkPHP <= 5.1.10
漏洞复现
首先我们先搭建一个存在该漏洞的框架版本:
配置好服务后我们开始进行代码审计,首先先在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/ 下创建html模板文件,之后便可以进行分析:
我们根据上面代码:
public function index()
{
$this->assign(request()->get());
return $this->fetch();
}
跟进至assign函数,后继续跟进:
我们审计到library/think/View.php下,分析下面的代码:
里面有一个arrar_merge()函数,我们简单看一下如何应用:
可以看到该函数起到一个合并数组的作用,赋值后跟进到fetch,直到下面图片这个位置:
我们这里有一段代码:
$this->engine->$method($template, $vars, $config);
我们跟进method值在view\driver\Think.php,跟进fetch后再跟进read方法,最后走到了template\driver\File.php,这里有一段代码:
extract($vars, EXTR_OVERWRITE);
同时下面还有一个文件包含函数,因为之前有个vars变量是用户进行get传入的,也就是说变量可控,经过 $this->data 走到了read,而这里面有个extract函数可以实现变量覆盖:
而它的规则如下:
若第二个参数值不指定(默认EXTR_OVERWRITE)可能存在变量覆盖的,覆盖变量后再进行文件包含恶意文件。这里简单测试下,我们在public下传入图片木马之后(里面写入了查询phpinfo信息的代码)进行访问:
public/?cacheFile=1.jpg
成功实现了文件包含:
修复
对于如何修复也是十分简洁的,get传参里是否有cachefile键,有的话就删掉,也删掉_think_cachefile键,然后文件包含即可防止该漏洞的产生。
来源:https://juejin.cn/post/7202231477252784183
猜你喜欢
- 远程服务器配置可以使得数据库管理员在服务器以外的主机上连接到一个SQL Server实例,以便管理员在没有建立单据连接的情况下在其他的SQL
- win7 +Navicat Lite 9+ VMware7在VMware中安装openSUSE11.x mysql5 Navicat Lit
- zyw147 提出问题:ASP读取指定xml 的节点?怎么用ASP《不是JS》取出指定的节点? 例如我想取出北京,我在ASP客户端提交的是
- 总结常用基本点如下: 1、触发器有两种类型:数据定义语言触发器(DDL触发器)和数据操纵语言触发器(DML触发器)。 DDL触发器:在用户对
- 如果你有一字段dm记录了一个url,为了更好的优化模糊查询速度或统计速度,在数据表原有的结构上增加3个字段,分别为 `sdm`
- 在golang中,网络协议已经被封装的非常完好了,想要写一个Socket的Server,我们并不用像其他语言那样需要为socket、bind
- 代码如下:--CAST 和 CONVERT 函数 Percentage DECLARE @dec decimal(5,3), @var va
- 背景(background)在项目中经常会使用。这篇文章主要讲解的是实际项目中的5个实例。通过具体的分析来达到学习的目的。1,Li列表通过u
- 阅读上一篇文章《WEB2.0网页制作标准教程(5)head区的其他设置》在开始正式内容制作之前,我们必须先了解一下web标准有关代码的规范。
- 数据库,网站运营的基础,网站生存的要素,不管是个人用户还是企业用户都非常依赖网站数据库的支持,然而很多别有用心的攻击者也同样非常&l
- 秦歌这篇文章总结得很不错,俺挑刺来啦:1. 优先级的描述不严谨,有 !important 时,网页样式可以覆盖用户自定义样式。用户!impo
- AXObject可用来解决IE需要激活 ActiveX 控件和生成控件调用代码 AXObjec
- 大家知道,在js里encodeURIComponent 方法是一个比较常用的编码方法,但因工作需要,在asp里需用到此方法,查了好多资料,没
- 设置Table的细边框通常有这么几种方式:1、设置边框的BORDER=0 、cellspacing=1,设置Table的背景色为所要的边框色
- Javascript 正常取来源网页的URL只要用: document.referrer就可以了!但,如果来源页是Jav
- 此前piscdong已经做过一次评测了,这次的Beta正式推出,我也来参与一下.当回小白鼠吧.新的界面设计非常让人兴奋750){this.r
- CSS的背景属性“background”提供了众多属性值,如颜色、图像、定位等,为网页背景图像的定义提供了极大的便利。看看backgroun
- 任何数据库系统都无法避免崩溃的状况,即使你使用了Clustered,双机热备等等,仍然无法完全根除系统中的单点故障,何况对于大部分用户来说,
- 本文介绍了在js和asp中使用FileSystemObject(fso)来: 创建、添加或删除数据,以及读取文件; 移动、复制和删除文件;创
- 引伸阅读解读absolute与relativeposition:relative/absolute无法冲破的等级定位一直是WEB标准应用中的