thinkphp 5.0.x 源码分析系列(一)请求基本流程

4 篇文章 0 订阅
3 篇文章 0 订阅
0x01 前言

最近看到smile 师傅发的一篇thinkphp 5 的 rce 文章,
TinkPHP5.0.X RCE-PHP7 新利用方式挖掘

文章中有一些细节的东西,原理,自己不是很熟悉,所以打算自己结合 thinkphp 5.0.x 的两个典型的rce :
(1) 变量覆盖 filter
(2) 未开启强制路由导致的任意方法调用
以及smile 师傅文章中提到的一些方法来分析分析 thinkphp 的源码。

本来想着是全部放到一篇文章中写,但是感觉那样会比较乱,所以打算开一个系列来分析一下。

这是这个系列的第一篇。本篇涉及除了涉及到了框架的基本流程外,还涉及了thinkphp 中类的自动加载机制。

0x02 thinkphp 安装

首先是thinkphp 的安装,选择的是thinkphp 5.0.22 完整版,下载的地址: http://www.thinkphp.cn/down/1260.html

0x03 目录结构

在这里插入图片描述
这是官方文档上的目录结构。

0x04 请求基本流程分析

thinkphp是单入口框架,所有的请求都先经过 public/index.php 文件,我们来到这个文件
在这里插入图片描述
首先定义了APP_PATH 常量,为application 文件夹所在的路径。
接着 require 了start.php ,跟进start.php :
在这里插入图片描述
同样包含了一个base.php
然后调用App::run()->send() 来执行应用 。

下面我们来深入 base.php 和 App::run->send() 。

0x04.1 base.php

跟进base.php:
在这里插入图片描述
在这里插入图片描述
可以看到base.php 先是定义了一些thinkphp 中用到的常量,这里说一个坑,起初直接在base.php 中看APP_PATH :
在这里插入图片描述
没有注意前面index.php 中已经定义了APP_PATH , 从这里看的APP_PATH是public/ 。

然后34行和35行,判断是否命令行启动和是否是windows.

38 行和59 行进行注册自动加载

41行到56行 加载环境变量配置文件,也就是说可以在根目录下面,自己创建.env 文件,里面设置环境变量。通过parse_ini_file() 函数来解析.env 文件,然后通过putenv() 来具体配置。

parse_ini_file() 函数:
在这里插入图片描述
然后62 行注册错误和异常处理机制

0x04.1.1 自动加载

base.php 中38 行 require Loder.php ,然后59行,注册自动加载,我们跟进register() 函数:
在这里插入图片描述
Loder::register 其实就是注册系统的自动加载,我们跟进Loder::autoload() 函数,
在这里插入图片描述
82行关键点Loader::findFile($class) 函数,跟进之后其实就是根据PSR-4 或者PSR-0 来寻找类 所在的文件。
然后85行 把这个文件 include 进来,这就完成了自动加载。

0x04.1 App:run()
直接贴出总结的 APP:run() 的流程:
1.初始化$requests
2.初始化$config
3.通过$config ,设置$requests的filter
4.设置语言
5.返回调度信息  【这一步分又是复杂的一部分,比如路由匹配,没有匹配上则解析path】
6.设置requests 缓存检查
7.使用App::exec() 执行调度,返回datad 
8.清空类的实例化 ,Loader::clearInstance() [在exec 中利用了Loader 加载了一些类,比如要执行的类]
9.判断需要返回的type, create一个response 对象,内容为data 
10.App::run() 返回的是一个response 对象,然后调用send() 发送数据给客户端。

0x05 其他

在Loader.php 中,我们注意到了一个__indlue__file($file) 函数:在这里插入图片描述
那么在rce 的时候,如果disable_function 限制了大量函数的时候,我们可以调用Loader.php 中的__include__file 来包含一些日志文件或者session 文件来getshell 。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值