php代码审计总结
字数 2402 2025-08-10 13:48:29
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配置安全性
- 输入输出验证
- 敏感函数使用
- 变量控制和过滤
- 异常处理机制
通过结合静态分析和动态调试,可以有效发现潜在安全漏洞。