漏洞深度分析|Thinkphp 多语言 RCE

news2024/11/16 18:09:09

项目介绍

ThinkPHP 是一个快速、简单的面向对象的轻量级 PHP 开发框架,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。

根据目前FOFA系统最新数据(一年内数据),显示全球范围内(header="think_lang")共有 73,302 个相关服务对外开放。中国使用数量最多,共有44,788 个;美国第二,共有 12,295;中国香港特别行政区第三,共有5,009 个;新加坡第四,共有 896 个;日本第五,共有 246 个。

项目地址

https://www.thinkphp.cn/

漏洞概述

如果 Thinkphp 程序开启了多语言功能,攻击者可以通过 get、header、cookie 等位置传入参数,实现目录穿越+文件包含,通过 pearcmd 文件包含这个 trick 即可实现 RCE。

默认情况下,系统只会加载默认语言包,如果需要多语言自动侦测及自动切换,需要在全局的中间件定义文件中添加中间件定义。因此只有启用多语言并且使用存在漏洞的版本时才存在漏洞。

影响版本

v6.0.1 < Thinkphp < v6.0.13

Thinkphp v5.0.x

Thinkphp v5.1.x

环境搭建

docker run -it -d -p 80:80 vulfocus/thinkphp:6.0.12

漏洞复现

 

漏洞分析

这里以thinkphp 6为例进行分析,thinkphp 5类似。

Thinkphp的中间件默认会调用handle函数,因此直接在LoadLangPack.php的handle函数中下断点

在detect函数中会从request中提取多个参数

查看config可知,detect就是从请求的不同位置中提取lang等参数        

默认情况下,allow_lang_list 这个配置为空,因此从lang参数中拿到的变量没有过滤直接传给了$this->range并返回该值

得到lang值之后,会调用switchLangSet函数加载对应的语言。在该函数中会先根据$langset拼接路径(这里我们就可以目录穿越),然后调用load进行加载

在load函数中调用了parse,处理上面拼接过的文件

在parse中可以看到,当后缀为php时直接include

因此攻击者可以通过目录穿越实现任意 php 文件的包含

分析了官方的修复方式,发现官方通过两个commit修复了此漏洞,核心改动如下,即判断了$langSet是否满足条件否则获取默认值:

修复方式

官方已经发布最新版,请升级到最新版

参考链接

删除废弃方法 优化多语言检测 · top-think/framework@c4acb8b · GitHub

调整 · top-think/framework@4c328dc · GitHub

Thinkphp 多语言 RCE - 跳跳糖

Docker PHP裸文件本地包含综述 | 离别歌

https://nosec.org/home/detail/5050.html

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

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

相关文章

基于昇思MindSpore,实现使用胶囊网络的图像描述生成算法

项目链接 https://github.com/Liu-Yuanqiu/acn_mindspore 项目描述 图像描述生成算法 人类可以轻易的使用语言来描述所看到的场景&#xff0c;但是计算机却很难做到&#xff0c;图像描述生成任务的目的就是教会计算机如何描述所看到的内容&#xff0c;其中涉及到了对视觉信…

JavaOOP面试题(108道)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

mybatis以及mybatisplus批量插入问题

1. 思路分析&#xff1a; 批量插入是我们日常开放经常会使用到的场景&#xff0c;一般情况下我们也会有两种方案进行实施&#xff0c;如下所示。 方案一 就是用 for 循环循环插入&#xff1a; 优点&#xff1a;JDBC 中的 PreparedStatement 有预编译功能&#xff0c;预编译之…

vue3较vue不同的地方

自定义指令的区别&#xff1a; vue2的写法&#xff1a; Vue.directive(scroll, {}) //scroll是指令名称 vue3的写法&#xff1a; 定义全局的&#xff1a;在main.js文件中定义&#xff1a; createApp(App).directive("hello",{}).use(store).use(router).mount(#…

小程序import及include引用的简单理解

场景&#xff1a;在小程序中&#xff0c;WXML 提供两种文件引用方式import和include 我自己记录下自己的一些简单理解 官方文档&#xff1a;引用 | 微信开放文档 第一&#xff1a;import import&#xff0c;就是可以引入自定义指定的template模板 比如&#xff1a;我在import页…

stm32f767之ADC

一&#xff0c;基本介绍 1&#xff0c;ADC时钟。 ADC时钟一般常用来自于经可编程预分频器分频的APB2 时钟&#xff0c;该预分频器允许ADC 在fPCLK2/2、 /4、/6 或/8 下工作。ADCCLK 的最大值限制。2&#xff0c;ADC通道。 有16 条复用通道。我的理解是每个ADC&#xff08;1&…

气泡水位计安装示意图 气泡水位计工作原理

气泡式水位计测量精度高&#xff0c;免气瓶&#xff0c;免测井&#xff0c;免维护&#xff0c;抗振动&#xff0c;寿命长&#xff0c;特别适用于流动水体、大中小河流等水深比较大的场合。具有安装简单&#xff0c;操作、组网灵活&#xff0c;尤其是无井水位测量最理想的水位监…

城市燃气系统安全解决方案

汽车制造业 MES系统 DNC系统 生产 安全域1 管理层 工控安全隔离装置 交换机 安全配置核查系统 HMI 历史数据库 运行监控系统 实时数据库 打印机过程 安全域2 监控层 工控漏洞扫描系统 安全交换机 工控安全审计系统 工控入侵检测系统工程师站 A 操作员站 A 实时数据库A 操作员站…

[附源码]Python计算机毕业设计SSM基于的冠状病毒疫情防控资讯交流推荐网站(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

stream_open函数分析

在讲 stream_open() 函数之前&#xff0c;需要先了解 stream_open() 里面使用到的一些基本的数据结构。如下&#xff1a; 第一个数据结构是 struct VideoState &#xff0c;VideoState 可以说是播放器的全局管理器。字段非常多&#xff0c;时钟&#xff0c;队列&#xff0c;解…

Android 11 的状态栏的隐藏

概述 Android 11 的状态栏与导航栏较之前的版本有较大的差异, 在Android 7.0 SystemUI 状态/导航栏的隐藏与显示中所描述的部分内容已不再适用. 比如, 自动隐藏的时间, 隐藏的动画, 较之前的版本已面目全非, 本文将对隐藏状态栏部分的内容进行一些补充. APP如何隐藏状态栏 参…

Yield Guild Games 成功举办首届 SubDAO 峰会

Yield Guild Games&#xff08;YGG&#xff09;于 2022 年 11 月 18 日在菲律宾马尼拉举行了第一届 SubDAO 峰会。 SubDAO 峰会与菲律宾 Web3 狂欢节两个活动同时举行&#xff0c;为 YGG 的区域 SubDAO 提供了在 Web3 应用中心——菲律宾进行面对面交流的机会。此次活动旨在传达…

运维开发实践 - helm

1. helm介绍 helm 是一个用于管理部署在kubernetes上的应用的工具 使用要求&#xff1a;一个Kubernetes集群 2.下载安装 Helm Github Download Helm Huawei Source 按照自己的操作系统版本下载相应的helm压缩包 并将helm添加到环境变量中; # 检查是否安装成功 helm version…

read_thread解复用线程分析

read_thread() 线程的主要作用从 MP4 里面读取 AVPacket&#xff0c;然后丢进去 PacketQueue 队列。所以需要先学习一下 strcut PacketQueue 跟 struct MyAVPacketList 数据结构。如下&#xff1a; typedef struct MyAVPacketList {AVPacket *pkt;int serial; } MyAVPacketLis…

html文件里怎么引用vue组件?

这里我们使用 http-vue-loader 来实现&#xff1a;https://www.npmjs.com/package/http-vue-loader Load .vue files directly from your html/js. No node.js environment, no build step. 我做了个demo如下&#xff1a; html文件里面写下面的代码 <!DOCTYPE html> &l…

计算机研究生就业方向之当老师(中小学)

我一直跟学生们说你考计算机的研究生之前一定要想好你想干什么&#xff0c;如果你只是转码&#xff0c;那么你不一定要考研&#xff0c;至少以下几个职位研究生是没有啥优势的&#xff1a; 1&#xff0c;软件测试工程师&#xff08;培训一下就行&#xff09; 2&#xff0c;前…

股票购买接口系统怎么使用vn.py进行量化策略?

一般情况下&#xff0c;股票购买接口系统主要是可以运用在股票量化交易系统开发的一个大方向&#xff0c;也就是说&#xff0c;股票购买接口系统是根据这些量化的特点来开发的&#xff0c;就比如使用vn.py进行量化策略&#xff0c;在这方面&#xff0c;对交易者进行量化分析也起…

Web前端105天-day-41-JSCORE

JSCORE01 目录 前言 一、声明提升 二、宿主 window 三、断点功能 四、匿名函数解决全局污染 五、作用域链 六、闭包 七、私有 八、arguments 九、函数重载 十、方括号属性语法 十一、重载练习 十二、this 总结 前言 JSCORE01学习开始 一、声明提升 报错方案: 让…

走进SpringCloud微服务

微服务概述一、注册中心&#xff1a;Eureka ⭐⭐⭐1.1 原理1.2 代码二、负载均衡&#xff1a;Ribbon ⭐三、远程调用&#xff1a;Feigh ⭐⭐⭐3.1 原理3.2 代码四、熔断限流&#xff1a;Hystrix ⭐⭐⭐4.1线程池策略4.2 信号量隔离策略4.3 方法降级4.4 断路器、熔断器五、网关&…

MongoDB和MongoTemplate对于嵌套数据的判空查询

前言&#xff1a; 不知道有没有和小名一样&#xff0c;接触MongDB时间不长的小伙伴。由于MongoDB是以文档形式存储数据的&#xff0c;所以其中的数据类型相对MySql或者Oracle关系型数据库丰富一些&#xff08;MongoDB是NoSQL数据库这里比较不是很准确&#xff09; 我们在关系…