最近看到smile 师傅发的一篇thinkphp 5 的 rce 文章,
文章中有一些细节的东西,原理,自己不是很熟悉,所以打算自己结合 thinkphp 5.0.x 的两个典型的rce :
(1) 变量覆盖 filter
(2) 未开启强制路由导致的任意方法调用
以及smile 师傅文章中提到的一些方法来分析分析 thinkphp 的源码。
本来想着是全部放到一篇文章中写,但是感觉那样会比较乱,所以打算开一个系列来分析一下。
这是这个系列的第一篇。本篇涉及除了涉及到了框架的基本流程外,还涉及了thinkphp 中类的自动加载机制。
thinkphp是单入口框架,所有的请求都先经过 public/index.php 文件,我们来到这个文件
下面我们来深入 base.php 和 App::run->send() 。
跟进base.php:
然后34行和35行,判断是否命令行启动和是否是windows.
38 行和59 行进行注册自动加载
parse_ini_file() 函数:
base.php 中38 行 require Loder.php ,然后59行,注册自动加载,我们跟进register() 函数:
直接贴出总结的 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() 发送数据给客户端。
在Loader.php 中,我们注意到了一个__indlue__file($file) 函数:
因篇幅问题不能全部显示,请点此查看更多更全内容