ThinkPHP5.x RCE 复现

ThinkPHP5.x RCE 复现

其实去年开始是复现过这个漏洞的,但是总觉得并没有吃透,分析写得漏洞百出,于是再来审计一遍。

漏洞影响范围

5.x < 5.1.31
5.x < 5.0.23

复现环境

php7.3  thinkphp5.1.29 phpstorm

漏洞复现

测试成功

漏洞分析

进入入口文件,

$this->dispatch 无初始值。

直接跟进路由检测routeCheck

直接跟进 path() 方法

跟进pathinfo()

pathinfo 从当前类中的 config 中获取,

也就是我们可以通过 ?s的方式传入路由信息,这在tp的文档中也有说明。

然后我们继续跟进此处的路由检测。

跟进route类中的 check 方法。

在检查完路由后会返回

url类,这个类是继承 dispatch类,然后会执行这个对象的init() 方法。

然后又会实例化 Module类并执行 init() 方法返回,init() 返回值是当前实例化的对象。

所以我们在一开始的路由检测后

$dispatch值是 实例化的Molude对象。

继续往下看,当程序执行到这里时,

$data 在上面已经被赋值为null,会去执行Module类的 run()方法,run()方法在其父类中被调用。

又会去执行 exec() 方法,

继续跟进

注意这里,又去调用了当前appcontroller方法,

继续跟进 parseModuleAndClass 方法

如果控制器的名字中存在 \或者以\开头,会被会被当作一个类,可以利用命名空间,实例化任意类。。

回到controller方法,会检查类是否存在,存在就会去调用__get()方法,其实一开始有很多地方都会调用到 __get 方法,比如这些

$this->route->check() $this->request->module(),这些属性不存在,就会去调用 __get() 方法,

make方法用来将类实例化。

继续看module类里exec方法的后半部分,

获取我们的操作名,也就是我们需要执行的实例化类的方法,然后方法里面对应的参数通过get请求传入。

tp的路由规则是 ?s=模块/控制器/操作名

寻找可以利用的类以及方法

think\app

container类里,存在 invokeFunction 方法,用来动态调用函数。

payload:

?s=index/\think\app/invokefunction?function=call_user_func&vars[0]=system&vars[1]=whoami

think\request

在 request 类里,其实也有一个很好的rce利用点,

跟进 filterValue()

这里存在回调函数,且参数可控。

payload

?s=index/\think\request/input?data[]=-1&filter=phpinfo

think\template\driver\file

可以利用此方法写马,

payload

?s=index/\think\template\driver\file/write?cacheFile=shell.php&content=<?php%20phpinfo();?>

然后当前目录访问shell.php 就ok了。

写在后面

这个rce漏洞归根结底就是因为 把控制器名字的 \ 开头作为类名导致我们可以实例化任意类,后面的payload也不过是基于此漏洞的利用。如有问题还请及时告知。

本文来源于: https://xz.aliyun.com/t/9361

相关推荐

fofa爬虫 + 源码泄露PoC之梦幻联动(有福利)

写在前面 相信大家一定对源码泄露并不陌生,这里也不赘述这个漏洞的原理和危害了,网上一搜也都有好多好多,看都看不完~~~ 那今天这里我们讲啥呢?那就直入主题吧~今天这里我就贴出我自己参考的加上自己写的fofa爬虫 + 源码泄露PoC之梦幻联动

PHP的无参数RCE

PHP无参数RCE 因为先前只是参照大佬的payload解题,从未自己本地复现过,索性借复习的机会,在本地搭建并尝试。 题目: GXYCTF2019—禁止套娃 [极客大挑战 2020]Roamphp4-Rceme 限制条件: /[^\W]+

记某CMS漏洞getshell

记极致CMS漏洞getshell 今天下午比较空闲,就去搜索一些cms,突然对极致CMS感兴趣,而网上已经有一些文章对它进行分析利用,sql注入,xss,后台修改上传后缀名前台getshell等等。 于是就引起了我的兴趣想去测试一下。 信息

CVE-2016-0165 Win32k漏洞分析笔记

CVE-2016-0165 是一个典型的整数上溢漏洞,由于在 win32k!RGNMEMOBJ::vCreate 函数中分配内核池内存块前没有对计算的内存块大小参数进行溢出校验,导致函数有分配到远小于所期望大小的内存块的可能性。而函数本身并

记一次无意的渗透测试

由于最近再写一个web漏洞扫描器,准备在fofa上找网站测试的时候,无意间看到了个标题,xx系统, 点进去一看,好家伙,这不就是我很收悉的,那个xxcms嘛(具体的忘记了) 正好通过这个网站的cms漏洞,测试下我的扫描器,结果,好家伙,

FastAdmin前台文件上传

漏洞通告 FastAdmin是一款基于ThinkPHP和Bootstrap的极速后台开发框架。 2021年3月28日,360漏洞云漏洞研究员发现,FastAdmin框架存在有条件RCE漏洞,当攻击者具有一定用户权限的前提下,可以实现任意文件

draytek漏洞分析

分析复现一下几个draytek的漏洞 1.CVE-2020-8515 漏洞描述如下: DrayTek Vigor2960 1.3.1_Beta, Vigor3900 1.4.4_Beta, and Vigor300B 1.3.3_Beta,

ELK在渗透测试中的利用与安全配置解析

通过此文章,我将提供有关ELK在攻击利用与安全防护。关于利用ELK 的信息在网上非常罕见。因此,这篇文章只是本人在日常工作和学习中的个人笔记,虽不完善,但可作为学习参考。通过这篇文章希望能为你提供一些在渗透测试期间可能有用的方法。 背景 E

记一次简单的审计

前言 上次在逛先知的时候,无意间看到了L4zily师傅的这篇文章:https://xz.aliyun.com/t/9114 ,所以有了这篇,该版本为金微手机商城 V0.3.8版本 正题 我们直接去官方搭建的演示站,直接访问/admin.ph

TP5 漏洞分析

RCE1 影响版本 TP 5.0.7 - 5.0.24 TP 5.1.0 - 5.1.30 payload 5.0 ?s=index/think\config/get&name=database.username // 获取配置信息 ?s=

记一次SSRF->getshell

这个是2个月前的项目,思路也是挺简单的,还是给兄弟们分享分享,首先还是常规的站点,我们进去看看 可以看见这个网站为thinkphp,当然,当时就很开心,因为自己打tp的站打的太多了,然后再进一步细看。 我们可以得知这个web站点的版本为