Files
Sec-Interview/_book/Chapter20/20-4.md
T
2025-11-08 21:00:06 +08:00

43 lines
3.5 KiB
Markdown

### ThinkPHP 框架审计起来有什么不同
**1. 核心差异:文件结构与路由机制**
- **传统 PHP 代码**:
- **文件结构**: 通常比较随意,一个页面一个文件,或者通过 `include`/`require` 组织
- **入口点**: 可能会有多个入口文件,例如 `index.php``login.php``upload.php`
- **审计思路**: 从每个入口文件开始,逐个跟踪用户输入,找到所有可能被利用的敏感函数,例如 `eval``system``include`
- **ThinkPHP 框架**:
- **文件结构**: 严格遵循 MVC(模型-视图-控制器)架构,有固定的目录结构,如 `app``config``public``route`
- **入口点**: 通常只有一个统一的入口文件,`public/index.php`。所有请求都通过这个文件,然后由框架的路由系统进行分发
- **审计思路**: 重点分析**路由文件**(`route` 目录),理解请求如何被分发到哪个**控制器**的哪个**方法**。审计不再是线性的文件流,而是基于路由-控制器-模型-视图的调用链
**2. 安全机制与新漏洞点**
- **传统 PHP 代码**:
- **安全机制**: 几乎没有内置的安全机制,所有安全检查(如输入过滤、SQL 预处理)都需要开发者手动实现,非常依赖开发者的安全意识
- **常见漏洞**: 由于缺乏统一的过滤,SQL 注入、XSS、命令执行等漏洞非常普遍且容易发现
- **ThinkPHP 框架**:
- **安全机制**:
- **自动路由解析**: 框架会根据 URL 自动将参数传入控制器方法,但若使用不当会产生漏洞
- **SQL 预处理**: 提供了 ORM(对象关系映射)和查询构造器,鼓励开发者使用参数化查询,从而有效防御 SQL 注入
- **自动过滤**: 在早期版本中(如 ThinkPHP 5.x),`Request` 对象会进行自动过滤,但若开发者使用 `get()``post()` 等函数而不做安全处理,仍可能存在风险
- **跨站请求伪造(CSRF)防护**: 内置了 CSRF Token 机制
- **新漏洞点**:
- **路由解析漏洞**: 早期版本曾出现因 URL 解析不当导致的代码执行漏洞
- **SQL 注入**: 尽管有 ORM,但若开发者仍使用原始的 `query()` 方法或拼接字符串,SQL 注入依然会存在
- **文件包含**: 尽管框架本身减少了 `include` 的使用,但若开发者在控制器中动态加载了用户可控的文件,仍可能导致文件包含漏洞
- **远程命令执行(RCE)**: 框架本身可能存在一些高危的 RCE 漏洞,如历史上的 **ThinkPHP RCE 漏洞**,这些是框架自身的问题,而非开发者代码问题。
**3. 审计流程的差异**
- **审计传统 PHP 代码**:
- **方法**: 重点是“找”,即找到所有用户输入点和敏感函数
- **关键**: 逐个文件、逐个功能地进行黑盒或白盒测试
- **审计 ThinkPHP 框架代码**:
- **方法**: 重点是“理解和跟踪”
- **关键**:
1. **理解路由**: 从 `route` 文件开始,理解 URL 如何映射到控制器和方法
2. **跟踪参数**: 找到控制器方法中使用了 `Request::get()``Request::post()` 或直接从参数列表接收用户输入的地方
3. **检查数据流**: 跟踪这些用户输入是如何被使用,是否直接进入了数据库查询、文件操作或命令执行函数
4. **关注框架漏洞**: 检查框架版本,看是否存在已知的框架级别漏洞
5. **ORM 审计**: 检查 ORM 查询,看是否存在使用原始 SQL 语句的情况,或者在使用 `where``find` 等方法时,参数是否被正确处理