论坛首页 安全编程开发区 阅读主题

[原创]ThinkPHP框架代码审计(一)

293 浏览 1 回复
#1 楼主 2026-06-01 21:09:08
我所用到的是TP5.1.41+PHP7.3.4+PhpStorm 2024.2.3目录结构tp总目录 application:应用目录 extend:拓展类库目录(可定义) public:网站对外访问目录 runtime:运行时目录(可定义) vendor:第三方类库目录(Composer) thinkphp:框架核心目录 build.php:自动生成定义文件(参考) composer.json:Composer定义文件 LICENST.txt:授权说明文件 README.md:README文件 think:命令行工具入口核心框架目录的结构 thinkphp:框架系统目录        lang:语言包目录        library框架核心类库目录                think:think类库包目录                traits:系统traits目录        tpl:系统模板目录        .htaccess:用于apache的重写        .travis.yml:CI定义文件        base.php:框架基础文件        composer.json:Composer定义文件        console.php:控制台入口文件        convention.php:惯例配置文件        helper.php:助手函数文件(可选)        LICENSE.txt:授权说明文件        phpunit.xml:单元测试配置文件        README.md:README文件        start.php:框架引导文件官方提供的默认应用实际目录结构 application:应用目录(设置)        index:模块目录(可更改)                config.php:模块配置文件                common.php:模块公共文件                controller:控制器目录                model:模型目录                view:识图目录        command.php:命令行工具配置文件        common.php:应用公共文件        config.php:应用配置文件        tags.php:应用行为拓展定义文件        database.php:数据库配置文件        route.php:路由配置文件框架流程1.框架入口文件(public/index.php)先进入到默认的入口文件(public/index.php)// [ 应用入口文件 ]
namespace think;

// 加载基础文件
require __DIR__ . '/../thinkphp/base.php';2.框架基础文件(/thinkphp/base.php)可以看到第二行代码将Loader类载入,注册自动加载机制功能、错误异常机制、日志接口、注册类库别名。
这些机制中最重要的就是自动加载功能,系统会调用Loader::register()方法注册自动加载,这一步完成后,所有符合模范的类库(包括Composer依赖加载的第三方类库)都将自动加载。首先需要注册自动加载功能,注册主要由以下几部分组成:
1.注册系统的自动加载方法\think\Loader::autoload
2.注册系统命名空间定义
3.加载类库映射文件(如果有的话)
4.如果存在Composer安装,则注册Composer自动加载
5.注册extend扩展目录3.注册系统自动加载(spl_autoload_register)
首先需要了解一个方法就是在这个spl_autoload_register
先在根目录下创建一个文件夹然后里面创建一个spl.php的文件里面写入一个不存在的类,当然肯定会报错

假设在创建一个Singwa.php里面写入创建的类其实也是不存在的因为在spl.php找不到Singwa.php里面类的所以运行还是报错

但我们在spl.php写一个spl_autoload_register类就可以执行了

第二个参数(throw)是此参数指定 spl_autoload_register() 在无法注册 callback 时是否应抛出异常。需要注意的是从 PHP 8.0.0 开始,将忽略该参数,如果设置为 false,则会发出 notice。spl_autoload_register() 现在总是会在无效参数上抛出 TypeError。
第三个参数(prepend)是如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。

这个的功能是:
1.注册自动加载器:spl_autoload_register("autoload",true,true)注册了autoload函数;
第二个函数true表示注册失败时抛出异常
第三个参数true将该自动加载器添加到队列前端
2.触发自动加载:当执行new Singwa()时,Singwa类未定义,PHP会调用注册的autoload函数,传入类名“Singwa”。
3.自动加载逻辑:
输出调试信息:类名:Singwa
尝试包含文件:./Singwa.php
4.类实例化:若./Singwa.php文件存在且包含有效的Singwa类定义,则成功创建对象并调用say()方法。
4.自动加载Loader深度分析4.1.属性深度剖析4.1.1Composer自动加载支持上面是做了一个例子,下面是tp框架下spl_autoload_register这个类
这里跟上面举得例子是一样的,只不过这里运用的是三元
如果在base.php注册自动加载那里传了参数的的话会执行Loader.php中$autoload这里

如果调用不存在的类的时候才会去调用2,就是think下loader文件中的autoload类,也就是本类

而下面这个方法是获得根目录并赋值给$rootPath,我这里的根目录是myDebugTest

下面是将vendor目录的composer目录赋值给$composerPath变量

然后下面是判断的是否是目录,如果是目录会判断这个目录下是否存在所指向的文件,如果条件都满足的话他会引入这个文件

再往下的话会有一个php内置的一个方法get_declared_classes,它的作用是返回由已定义类的名字所组成的数组,可以进行一个简单的打印看一下,这是一个简单的调试过程

当然打印出来后最下面有个类“Composer\Autoload\ComposerStaticInitc88d1afc9b8a71981ca7ef1be123a495”
其实这个就是刚才获取指定目录里面的类

当然可以做个测试,打印一下之前创建的Singwa类

下面有一个array_pop函数,这个是获取最后一个类的然后将其赋值给$composerClass


...(已截断)

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-287760.htm
#2 2026-06-01 21:09:08
这种也有漏洞嘛,能渗透不

请登录后参与讨论

立即登录 注册账号