ThinkPHP文件包含漏洞分析

2023-11-01

出品|长白山攻防实验室(ID:A_Tree)

0x00

声明

以下内容,来自长白山攻防实验室的A_Tree作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。

0x02

漏洞介绍

ThinkPHP是一个开源免费的,快速、简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。

近日,监测到其出现文件包含,代码执行漏洞,漏洞编号:QVD-2022-46174,当ThinkPHP开启了多语言功能时,攻击者可以通过lang参数和目录穿越实现文件包含,当存在其他扩展模块如 pear 扩展时,攻击者可进一步利用文件包含实现远程代码执行。

0x03

漏洞类型

文件包含,代码执行

0x04

 漏洞影响范围

ThinkPHP   6.0.1—6.0.13,5.0.x,5.1.x

0x05

漏洞复现

漏洞复现环境:

GITHUB开源项目:

基于ThinkPHP5.0搭建的NIUSHOP开源建站系统。

环境链接:https://github.com/znlccy/niushop

此系统默认没有开启ThinkPHP多语言功能,需要做出如下修改。

修改/application/config.php文件中的lang_swit-ch_on参数为Ture

修改后再主页测试全局lang参数是否生效:

?lang=zh-cn

?lang=en-us

上述两个请求,发现语言进行了切换,环境即搭建成功。在网站根目录创建phpinfo文件作为测试包含文件。

访问URL:?lang=..\..\info

执行info文件,漏洞利用成功。

0x06

漏洞分析

先看PHP官方补丁内容:在think5中修改的文件定位在了think\lang.php的detect方法,定位漏洞位置。

观察未修复的漏洞文件:在detect()其结果为定义了一个self::$range,通过源码分析可得,此参数受到下列参数影响:

我们将其中:$_GET[self::$langDetectVar]输出出来,验证参数内容的可控程度,其参数内容完全可控,并且detect的返回值完全由lang参数决定。

我们继续跟进调用Lang::detect()的文件内容:App.php

App.php文件内容:在config中的多语言机制开启时(lang_switch_on = true)执行了detect()将self::range通过URL中发lang参数定义,我们在上面分析过了,接下来分别执行了range()方法和load()方法。

我们首先跟进range()方法:在App.php中调用range为Lang::range() 因此,range()此时直接return了self::$range此参数在detect中被URL的lang参数控制。

Langset(Lang::range()):继续跟进如langset方法,此时$lang为URL中的lang(污点参数)

非空后将类中私有langset进行赋值,并且$this全部返回。

接下来执行Lang::load()方法:在进入方法前,其中传入load()的变量中,$request->langset()为我们URL中的lang(污点参数)。

跟进lang():可见file参数被转换为列表后进行遍历,当遍历的路径存在时便include目标,file中的内容为我们可控内容,即导致文件包含。

将列表file输出,方便观察:可见内容为从application\lang路径和think\lang路径加上我们URL中lang参数的内容,但是需要我们的此时lang参数为..\..\info.php但是在file列表的内容为info.php.php因此我们不能加上php的后缀。

那么此时我们只需要保证is_file($_file)为真即可包含实现文件包含漏洞。

?Lang = ..\..\info

0x07

总结

此漏洞造成原因相对简单,就是输入参数过滤不严格,修复排查方案为查看当前网站源代码中app目录下的config文件中lang_switch_on是否True即可,如果涉及到语言切换的需要,那么就更新thinkPHP或者手动改一下Lang:: detect()中的源码也行。See Bay!

欢迎关注长白山攻防实验室微信公众号

定期更新优质文章分享

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ThinkPHP文件包含漏洞分析 的相关文章

  • 检测 JPEG 图像质量

    我允许用户上传图像 但是 我希望保持 JPEG 质量不超过 90 我打算做的是检测当前的质量 如果低于 90 什么都不做 如果超过90 则使用Image Magick将图像重新压缩到90 可以这样做吗 我更喜欢 PHP 但任何语言都会有帮助
  • 如何发布数组多维角度js

    我在 angularjs 中有一个数组 示例如下 scope order qty 20 scope order adress Bekasi scope order city Bekasi 这个数组可以用这个代码发布 http method
  • PHP设置全局环境变量的方法

    我已阅读问题 答案here https stackoverflow com questions 13568191 how to get system environment variables into php while running
  • PHP 中给定日期的下一个工作日

    有人有一个 PHP 代码片段来计算给定日期的下一个工作日吗 例如 需要如何转换 YYYY MM DD 才能找到下一个工作日 例子 对于 03 04 2011 DD MM YYYY 下一个工作日是 04 04 2011 对于 2011 年 4
  • 在 woocommerce 管理订单页面中单击自定义按钮运行函数

    基于 在 woocommerce 中的管理订单列表顶部添加一个按钮 https stackoverflow com questions 49437781 add a button on top of admin orders list in
  • 在 Windows 中使用 PHP 创建受密码保护的 Zip 文件

    我正在 PHP 中创建给定文件的 zip 文件 下面是函数 function create zip file file name zip new ZipArchive zip name file name zip Zip name zip
  • 如何在codeigniter中插入具有多个单选名称的单选按钮值?

    我正在尝试使用 codeigniter 进行在线测验 其中有一个针对某些主题的动态测验 用户可以在每个问题中添加问题和多项选择答案 我如何获得每个问题的每个多项选择答案中每个答案的值 p p
  • 如何使用 PHP 从图像文件中读取 Lightroom 关键字?

    我有一个照片社区 www jungledragon com http www jungledragon com 允许用户上传照片 我的平台是 PHP CodeIgniter 作为上传过程的一部分 我已经使用 PHP 读取 EXIF 信息ex
  • php - 未知:第 0 行需要打开失败。laravel 5.6

    我刚刚安装了 laracast flash 并通过 Composer 更新了 nesbot carbon 下载碳时命令发疯了 Cmd界面显示了一会界面上散落的文字和方框 下载完成 做过php artisan serve at localho
  • PHP 数组到 JavaScript 数组

    假设我在 php 中有这个数组 cities array Caracas gt array air gt array 4 3 5 Working Days Saturday sea gt array 18 3 5 Days Wednesda
  • PHP—array_merge_recursive() - 相同键没有数组

    php a php gt data1 tag gt div classes gt 1 2 3 php gt data2 tag gt section classes gt 2 3 4 5 6 php gt result array merg
  • 如果 Row1 = 值 1,则更新其他行

    我有一个小的 php 脚本 用于访问 mySql 数据库 我想在数据库中插入新记录之前查看该数字 值 1 是否等于数据库中的记录 这也在第 1 行 所以我想 查看传入的电话号码是否等于数据库中的电话号码 如果是这样 则必须保持电话号码相同的
  • 多维数组内的移动

    我有一个用表格显示的数组 如何使用用户输入进行移动 目前 0 被分配给每个数组 但我计划为该数组分配其他值 我的问题是 如何使用用户输入在数组内向上 向下 向右 向左移动和对角移动 Array 0 gt Array 0 gt 0 1 gt
  • Laravel 验证规则仅针对字母

    我正在尝试添加验证规则以仅接受信件 我正在使用regex规则 但它仍然不起作用 下面是我的代码 Validate request input this gt validate request name gt required regex p
  • 支持通过 OAuth 进行 Facebook/Twitter 身份验证的 CAS 服务器

    我正在寻找一个支持 Facebook Twitter 通过 OAuth 进行单点登录身份验证的 CAS 服务器 我检查过 JASIG CAS 服务器 但它看起来不支持它们 我的 java web 应用程序基于 Spring Security
  • 如何将 WordPress 类别选择限制为只有一个?

    我有一个自定义帖子类型和一个自定义分类设置 非常标准的东西 但是 我想知道如何限制我的客户在每个帖子中选择多个分类类别 我不介意他们能够创建和删除分类类型 但我不希望他们选择多个分类类型 因为这些是复选框 所以它们可以 也许单选按钮可以工作
  • 通过 jQuery 从输入类型=“文件”多个中删除文件

    我在使用 PHP 和 jQuery 上传文件时遇到问题 表单可以一次上传多个图像 这些图像可以在滑块中预览 表单还包含两个字段标题和描述 滑块通过 jQuery 工作 当用户通过单击选择文件来选择多个图像时
  • 纠正装饰器模式的一个大缺点

    不久前 我在重构一些游戏战斗代码时决定尝试装饰器模式 战斗者可以拥有各种被动能力 也可能是不同类型的生物 我认为装饰器可以让我在运行时以各种组合添加行为 因此我不需要数百个子类 我几乎已经完成了 15 个左右的被动能力装饰器 在测试中我发现
  • Zend Framework 生成唯一的字符串

    我想生成一个唯一的 4 6 个字符长的字母数字字符串 以便与每个记录 用户 一起保存在数据库中 db 字段具有唯一索引 因此尝试保存预先存在的字符串会生成错误 现在我正在生成一个随机字符串并使用 try catch 因此在添加新记录时如果抛
  • 检查php中位字段是否打开的正确方法是什么

    检查位字段是否打开的正确方法是什么 在 php 中 我想检查来自 db mysql 的位字段是否打开 这是正确的方法吗 if bit 1 还有其他方法吗 我看到有人使用代码ord http jameslow com 2008 08 12 m

随机推荐

  • 小程序创建公共js获取接口数据,全局调用

    新建一个js文件 let app getApp function getImageurl return new Promise function resolve reject wx request url 接口地址 method get d
  • STM32通过esp8266连接WiFi接入MQTT服务器

    上文我们讲到如何搭建本地MQTT服务器http t csdn cn aHNcO 现在介绍如何通过stm32连接MQTT 一 首先我们初始化esp8266这里我们使用的是USART4与其通信代码如下 void UART4 Init uint3
  • 计算机网络应用层协议部分学习

    计算机网络学习第二章 应用层协议部分 应用层 协议原理 研发网络应用程序的核心是写出能够运行在不同的端系统和通过网络彼此通信的程序 例如 在Web应用程序中 有两个互相通信的不同的程序 一个是运行在用户主机 桌面机 膝上机 PDA 蜂窝电话
  • PCL分割:Conditional Euclidean Clustering官方历程,在自己配置环境上调错

    本人环境 VS2015 PCL1 8 1 1 首先遇到遇到了 无法解析的外部符号 提示和normal estimation等错误 解决办法 打开项目属性页 gt C C gt 预处理器 添加 PCL NO PRECOMPILE 2 erro
  • postman(二)——全局变量&环境变量

    一 全局变量 1 1 例如 token 1 作用范围 针对postman中所有使用该变量的请求 作用 方便维护 举例 有一个系统 含有100个接口 所有的接口服务器地址 或者某一个参数都是固定的值 那么把这个值设置全局变量接口中调用 这样接
  • python安装cv2

    pip install opencv python
  • [开发过程]<RTOS>关于RT-Thread

    以前一直折腾FreeRTOS 没时间折腾RT Thread 虽然暂时对RT Thread学的不深 但是从学习难度和社区支持来看 相信多年后RT Thread会成为主流 大概是因为很多RT Thread的中文资料吧 入门还要先学FreeRTO
  • matlab工作区显示的是什么,matlab工作区介绍

    Workspace 工作区窗口 Command History 指令历史记录窗口 Current Directory 当前目录选择窗口 主要内容 Matlab简介 数组和矩阵 Matlab绘图 Matlab Workspace 工作区窗口
  • Spring oauth2.0 刷新token后设置原token5分钟内继续可用

    默认情况下刷新token后原token会立马不可用 但是在某些情况下我们需要刷新token后原token在一定时间内继续可用 例如微信的刷新token 通过查看DefaultTokenServices中的刷新token方法refreshAc
  • 栈破坏检测

    在C C 语言中 由于代码书写人员能够直接通过指针来操作内存的内容 在通常的时候没有可靠的方法来防止对数组的越界访问读写操作 但是 我们可以在发生了越界访问的时候 在没有造成任何有害结果之前 尝试检测到他 栈保护机制是在栈帧中任何局部缓冲区
  • Maven之pom.xml文件中的Build配置

    Maven之pom xml文件中的Build配置 前言 在日常的开发中 我们经常使用maven来管理和构建我们的项目 即使现在使用了各种springboot等方便快捷的框架 jar包的引入也是通过maven来进行的 因此有必要了解pom x
  • Batch和Epoch之间的区别是什么?

    写在前面 快速理解 随机梯度下降 SGD 是一种迭代学习算法 它使用训练数据集来更新模型 Batch 批量 大小是梯度下降算法的超参数 在模型的内部参数更新之前控制训练样本的数量 一个周期内一次批量训练的样本数 Epoch数是梯度下降算法的
  • python 图片与二进制之间的转换

    一 PIL格式图片转成二进制 先读取为PIL格式 再转为二进制 import io import base64 from PIL import Image def image2byte image 图片转byte image 必须是PIL格
  • java代码分层 handle_java 代码分层

    JAVA代码层次 阿里推荐 开放接口层 可直接封装 Service 方法暴露成 RPC 接口 通过 Web 封装成 http 接口 进行 网关安全控制 流量控制等 终端显示层 各个端的模板渲染并执行显示的层 当前主要是 velocity 渲
  • PyTorch torch.optim.lr_scheduler 学习率设置 调参 -- CosineAnnealingLR

    lr scheduler 学习率 学习率的参数调整是深度学习中一个非常重要的一项 Andrew NG 吴恩达 认为一般如果想调参数 第一个一般就是学习率 作者初步学习者 有错误直接提出 热烈欢迎 共同学习 感谢Andrew ng的机器学习和
  • easyui tabs 一个窗口修改完成后刷新另一个窗口

    在一个tab中添加或删除数据后 要改变主页 相当于链接的另一个tab 的内容 1 在要刷新的窗口的初始化中添加 js 刷新方法 并保存到 window top 中 window top Refresh CloudHomePage Conte
  • 二、基础平滑、面积折线图与折线堆叠、面积堆叠《手把手教你 ECharts 数据可视化详解》

    注 本系列教程需要对应 JavaScript html css 基础 否则将会导致阅读时困难 本教程将会从 ECharts 的官方示例出发 详解每一个示例实现 从中学习 ECharts ECharts 官方示例 https echarts
  • Mybatis学习(二)--getMapper接口绑定方案和多参数传值

    在Mybatis的基础使用中 如果想向一个sql语句中传递多个参数 只能将parameterType设置为某个类或者Map 不能直接传入多个参数 接口绑定方案可以实现直接传入多个参数 Mybatis的接口绑定方案与基本的使用方法不同的地方在
  • unity 射线获取坐标

    射线 碰到障碍物就会断开 鼠标点击屏幕获得一个二维坐标 通过相机的射线转换为三维世界坐标 private Vector3 worldPos 鼠标点击的点所对应的世界里面的位置 点击鼠标右键 if Input GetMouseButton 1
  • ThinkPHP文件包含漏洞分析

    出品 长白山攻防实验室 ID A Tree 0x00 声明 以下内容 来自长白山攻防实验室的A Tree作者原创 由于传播 利用此文所提供的信息而造成的任何直接或间接的后果和损失 均由使用者本人负责 长白山攻防实验室以及文章作者不承担任何责