PHP代码审计实战思路浅析
字数 1506 2025-08-18 11:37:42
PHP代码审计实战思路教学文档
一、代码审计的战略性思考
1.1 不同编程模式的审计方法差异
-
面向过程程序审计:
- 直接使用Seay审计系统进行扫描
- 重点检查公共函数文件中的可利用点
-
MVC模式程序审计:
- 不能直接依赖自动化工具
- 需要先理解程序运行流程和目录结构
- 重点审计核心类库
- 核心类库无漏洞时再转向功能点审计
1.2 审计失败处理策略
- 多次尝试无果后考虑更换目标程序
- 长期无成果可能需要更换审计人员
二、实战审计流程详解
2.1 环境准备
- 目标:某开源CMS (iCMS)
- 环境:Windows + PHPStudy + Sublime
2.2 目录结构分析
app/ # 应用目录
cache/ # 缓存
core/ # iCMS程序入口
iPHP/ # iPHP框架文件
public/ # 公共资源
res/ # 用户资源
template/ # 模板
2.3 入口文件分析
-
index.php:
- 加载icms.php
- 调用iCMS::run()方法
-
iCMS.php:
- 加载配置和框架文件
- 调用iPHP::bootstrap()方法
-
iPHP.php:
- 加载框架文件
- 调用iPHP::bootstrap()
2.4 核心加载机制
- spl_autoload_register函数实现自动加载
- self::auto_require方法处理类加载规则:
- 无特殊标记:加载app/xx/xx.class.php
- 含Admincp:加载app/xx/xx.Admincp.php
- 含App:加载app/xx/xx.app.php
- 含Func:加载app/xx/xx.func.php
- 其他情况:在iPHP/core/下查找
2.5 框架运行流程
- iCMS::init():初始化配置信息
- iPHP::run():
- 从POST或GET获取应用名
- 加载并实例化类
- 调用相应方法
2.6 重要命名规则
- index.php入口:加载xx.app.php,类名为xxApp
- admincp.php入口:加载xx.admincp.php,类名为xxAdmincp
- user.php等其他入口有各自的加载规则
三、漏洞挖掘实战
3.1 发现SSRF漏洞
-
漏洞位置:iPHP/core/iHttp.class.php中的remote方法
- 封装了curl功能
- 未对URL进行限制或过滤
-
调用分析:
- 全局搜索iHttp::remote调用
- 前台仅一处调用,位于xx.app.php格式文件中
-
参数追踪:
- $avatar参数直接传入remote方法
- 仅经过iSecurity::escapeStr过滤
- escapeStr未对URL做限制
3.2 漏洞利用
-
利用条件:
- 需要提供验证码(secode)
- 获取路径:/public/api.php?app=public&do=seccode
- 验证码信息存储在cookie中
- username和nickname每次请求必须改变
- 这些值会存入数据库
- 需要提供验证码(secode)
-
漏洞限制:
- SSRF无回显
- 可通过端口探测判断:
- 未开启端口:返回特定错误
- 开启端口:返回不同响应
3.3 其他潜在漏洞
- Seay扫描结果分析:
- 发现referer伪造可能导致SQL注入
- 但iSecurity::escapeStr已过滤单引号
- 需要寻找其他利用方式组合
四、审计技巧总结
-
优先手动审计:
- 理解框架运行流程
- 分析核心类库
- 再使用工具辅助
-
工具使用时机:
- 初步手动审计完成后
- 可提高效率,减少重复工作
-
重点关注:
- 用户输入处理流程
- 数据库操作安全
- 文件包含和远程加载机制
- 权限验证逻辑
-
记录分析:
- 记录每个潜在漏洞点的调用链
- 分析过滤机制的有效性
- 尝试绕过方法
通过以上系统化的审计方法,可以有效发现PHP应用程序中的安全漏洞,特别是对于MVC框架的程序,理解其运行机制是成功审计的关键。