php代码审计总结
字数 2402 2025-08-10 13:48:29

PHP代码审计全面指南

1. 源代码审查概述

源代码审查是指对应用程序源代码进行系统性检查,以发现潜在安全漏洞的过程。主要关注点包括:

  • 输入/输出验证:如SQL注入、未验证用户提交内容或服务器返回数据
  • 安全功能实现:如参数范围限制不足导致信息泄露、cookie泄露等
  • 异常处理:不恰当的异常处理机制

2. MVC架构解析

MVC是一种设计模式,用于创建Web应用程序:

2.1 核心组件

  • Model(模型):处理应用程序数据逻辑,负责数据库存取
  • View(视图):处理数据显示,依据模型数据创建
  • Controller(控制器):处理用户交互,从视图读取数据,向模型发送数据

2.2 处理流程

  1. 获取请求
  2. 全局过滤
  3. 模块文件处理
  4. Controller函数执行
  5. Model函数执行
  6. View显示

2.3 常见架构示例

  • 标准MVC/index.php?m=admin&c=wp_login&f=login
  • ThinkPHP?index.php/index/wp_login/login/id/116

3. 审计方法论

3.1 基本思路

  1. 通读源码,分析函数集文件、配置文件、安全过滤文件和入口文件
  2. 通过敏感关键字回溯参数
  3. 查找可控变量

3.2 功能点定向审计

  • 程序安装过程
  • 文件上传功能
  • 文件管理功能
  • 登录验证机制
  • 备份恢复功能
  • 密码找回功能

4. PHP配置安全

4.1 基本配置语法

  • 大小写敏感:directive = value
  • 运算符:|&~!
  • 空值表达:foo = ;foo = none;foo = "none"

4.2 安全模式配置

  • safe_mode=off(PHP5.4.0已移除)
  • safe_mode_allowed_env_vars:限制可修改的环境变量前缀
  • safe_mode_exec_dir:限制外部程序执行目录

4.3 函数禁用

  • disable_functions:禁用危险函数(注意不要禁用dl()
  • com.allow_dcom=false:禁用COM组件创建

4.4 变量控制

  • register_globals=off:防止全局变量注册(PHP4.2后默认关闭)
  • magic_quotes_gpc=off:自动转义引号(PHP5.4.0已移除)

4.5 远程文件控制

  • allow_url_include=off:禁止包含远程文件
  • allow_url_open=on:允许通过URL访问文件

4.6 目录权限

  • expose_php=off:隐藏PHP版本信息
  • upload_tmp_dir:设置文件上传临时目录
  • open_basedir:限制PHP脚本访问目录

4.7 错误信息

  • display_errors=on:显示PHP错误(生产环境应关闭)
  • error_reporting=E_ALL & ~E_NOTICE:设置错误报告级别

5. 审计技巧

5.1 动态调试技术

使用phpStudy + PhpStorm + XDebug组合调试,跟踪变量传递过程

5.2 文件对比技术

对比不同版本CMS,快速定位漏洞相关变量

6. 常见漏洞审计

6.1 SQL注入

审计方法

  1. 使用数据库监控工具跟踪SQL语句执行
  2. 搜索关键字:(update|select|insert|delete|).*?where.*=\$
  3. 检查字符集设置:character_set_connect='gbk'(宽字节注入)

6.2 XSS漏洞

  • 查找htmlspecialchars()等编码函数
  • 检查SQL注入点是否可能被用于XSS(如无引号包裹的参数)

6.3 文件操作漏洞

任意文件上传

  • 关键字:$_FILEStype="file"move_uploaded_file()
  • 检查过滤机制是黑名单还是白名单

任意文件删除

  • 搜索unlink()函数
  • 检查变量来源和过滤
  • 检查目录限制是否可绕过

任意文件读取

  • 搜索函数:file_get_contents()highlight_file()fopen()readfile()
  • 检查变量可控性和过滤

任意文件下载

  • 查找自定义下载函数如download()
  • 检查路径拼接处

任意文件包含

  1. 本地文件包含

    • 常见于模块加载、模板加载、cache调用
    • 检查include()/include_once()require()/require_once()
  2. 远程文件包含

    • 需要allow_url_include = on
  3. 文件包含截断

    • %00截断(PHP<5.3)
    • 问号截断
    • 路径长度截断(Linux>4096,Windows>256)

6.4 RCE漏洞

命令执行

  • 检查函数:system()exec()shell_exec()passthru()

代码执行

  • 检查函数:eval()assert()preg_replace()
  • 特别注意preg_replace()的e修饰符

6.5 反序列化漏洞

魔术方法

  • __construct():对象创建时触发
  • __destruct():对象销毁时触发
  • __wakeup()unserialize()时触发
  • __toString():对象被当作字符串使用时触发

审计方法

  1. 通过serialize()/unserialize()查找触发点
  2. 分析POP链构造
  3. 检查代码/命令执行点

7. 总结

PHP代码审计需要系统性地检查:

  1. 应用程序架构和流程
  2. PHP配置安全性
  3. 输入输出验证
  4. 敏感函数使用
  5. 变量控制和过滤
  6. 异常处理机制

通过结合静态分析和动态调试,可以有效发现潜在安全漏洞。

PHP代码审计全面指南 1. 源代码审查概述 源代码审查是指对应用程序源代码进行系统性检查,以发现潜在安全漏洞的过程。主要关注点包括: 输入/输出验证 :如SQL注入、未验证用户提交内容或服务器返回数据 安全功能实现 :如参数范围限制不足导致信息泄露、cookie泄露等 异常处理 :不恰当的异常处理机制 2. MVC架构解析 MVC是一种设计模式,用于创建Web应用程序: 2.1 核心组件 Model(模型) :处理应用程序数据逻辑,负责数据库存取 View(视图) :处理数据显示,依据模型数据创建 Controller(控制器) :处理用户交互,从视图读取数据,向模型发送数据 2.2 处理流程 获取请求 全局过滤 模块文件处理 Controller函数执行 Model函数执行 View显示 2.3 常见架构示例 标准MVC : /index.php?m=admin&c=wp_login&f=login ThinkPHP : ?index.php/index/wp_login/login/id/116 3. 审计方法论 3.1 基本思路 通读源码,分析函数集文件、配置文件、安全过滤文件和入口文件 通过敏感关键字回溯参数 查找可控变量 3.2 功能点定向审计 程序安装过程 文件上传功能 文件管理功能 登录验证机制 备份恢复功能 密码找回功能 4. PHP配置安全 4.1 基本配置语法 大小写敏感: directive = value 运算符: | 、 & 、 ~ 、 ! 空值表达: foo = ; 、 foo = none; 、 foo = "none" 4.2 安全模式配置 safe_mode=off (PHP5.4.0已移除) safe_mode_allowed_env_vars :限制可修改的环境变量前缀 safe_mode_exec_dir :限制外部程序执行目录 4.3 函数禁用 disable_functions :禁用危险函数(注意不要禁用 dl() ) com.allow_dcom=false :禁用COM组件创建 4.4 变量控制 register_globals=off :防止全局变量注册(PHP4.2后默认关闭) magic_quotes_gpc=off :自动转义引号(PHP5.4.0已移除) 4.5 远程文件控制 allow_url_include=off :禁止包含远程文件 allow_url_open=on :允许通过URL访问文件 4.6 目录权限 expose_php=off :隐藏PHP版本信息 upload_tmp_dir :设置文件上传临时目录 open_basedir :限制PHP脚本访问目录 4.7 错误信息 display_errors=on :显示PHP错误(生产环境应关闭) error_reporting=E_ALL & ~E_NOTICE :设置错误报告级别 5. 审计技巧 5.1 动态调试技术 使用 phpStudy + PhpStorm + XDebug 组合调试,跟踪变量传递过程 5.2 文件对比技术 对比不同版本CMS,快速定位漏洞相关变量 6. 常见漏洞审计 6.1 SQL注入 审计方法 : 使用数据库监控工具跟踪SQL语句执行 搜索关键字: (update|select|insert|delete|).*?where.*=\$ 检查字符集设置: character_set_connect='gbk' (宽字节注入) 6.2 XSS漏洞 查找 htmlspecialchars() 等编码函数 检查SQL注入点是否可能被用于XSS(如无引号包裹的参数) 6.3 文件操作漏洞 任意文件上传 关键字: $_FILES 、 type="file" 、 move_uploaded_file() 检查过滤机制是黑名单还是白名单 任意文件删除 搜索 unlink() 函数 检查变量来源和过滤 检查目录限制是否可绕过 任意文件读取 搜索函数: file_get_contents() 、 highlight_file() 、 fopen() 、 readfile() 等 检查变量可控性和过滤 任意文件下载 查找自定义下载函数如 download() 检查路径拼接处 任意文件包含 本地文件包含 : 常见于模块加载、模板加载、cache调用 检查 include() / include_once() 、 require() / require_once() 远程文件包含 : 需要 allow_url_include = on 文件包含截断 : %00截断(PHP <5.3) 问号截断 路径长度截断(Linux>4096,Windows>256) 6.4 RCE漏洞 命令执行 检查函数: system() 、 exec() 、 shell_exec() 、 passthru() 等 代码执行 检查函数: eval() 、 assert() 、 preg_replace() 等 特别注意 preg_replace() 的e修饰符 6.5 反序列化漏洞 魔术方法 __construct() :对象创建时触发 __destruct() :对象销毁时触发 __wakeup() : unserialize() 时触发 __toString() :对象被当作字符串使用时触发 审计方法 通过 serialize() / unserialize() 查找触发点 分析POP链构造 检查代码/命令执行点 7. 总结 PHP代码审计需要系统性地检查: 应用程序架构和流程 PHP配置安全性 输入输出验证 敏感函数使用 变量控制和过滤 异常处理机制 通过结合静态分析和动态调试,可以有效发现潜在安全漏洞。