PHP代码审计实战思路浅析
字数 1506 2025-08-18 11:37:42

PHP代码审计实战思路教学文档

一、代码审计的战略性思考

1.1 不同编程模式的审计方法差异

  1. 面向过程程序审计

    • 直接使用Seay审计系统进行扫描
    • 重点检查公共函数文件中的可利用点
  2. MVC模式程序审计

    • 不能直接依赖自动化工具
    • 需要先理解程序运行流程和目录结构
    • 重点审计核心类库
    • 核心类库无漏洞时再转向功能点审计

1.2 审计失败处理策略

  • 多次尝试无果后考虑更换目标程序
  • 长期无成果可能需要更换审计人员

二、实战审计流程详解

2.1 环境准备

  • 目标:某开源CMS (iCMS)
  • 环境:Windows + PHPStudy + Sublime

2.2 目录结构分析

app/        # 应用目录
cache/      # 缓存
core/       # iCMS程序入口
iPHP/       # iPHP框架文件
public/     # 公共资源
res/        # 用户资源
template/   # 模板

2.3 入口文件分析

  1. index.php

    • 加载icms.php
    • 调用iCMS::run()方法
  2. iCMS.php

    • 加载配置和框架文件
    • 调用iPHP::bootstrap()方法
  3. 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 框架运行流程

  1. iCMS::init():初始化配置信息
  2. iPHP::run():
    • 从POST或GET获取应用名
    • 加载并实例化类
    • 调用相应方法

2.6 重要命名规则

  • index.php入口:加载xx.app.php,类名为xxApp
  • admincp.php入口:加载xx.admincp.php,类名为xxAdmincp
  • user.php等其他入口有各自的加载规则

三、漏洞挖掘实战

3.1 发现SSRF漏洞

  1. 漏洞位置:iPHP/core/iHttp.class.php中的remote方法

    • 封装了curl功能
    • 未对URL进行限制或过滤
  2. 调用分析

    • 全局搜索iHttp::remote调用
    • 前台仅一处调用,位于xx.app.php格式文件中
  3. 参数追踪

    • $avatar参数直接传入remote方法
    • 仅经过iSecurity::escapeStr过滤
    • escapeStr未对URL做限制

3.2 漏洞利用

  1. 利用条件

    • 需要提供验证码(secode)
      • 获取路径:/public/api.php?app=public&do=seccode
      • 验证码信息存储在cookie中
    • username和nickname每次请求必须改变
    • 这些值会存入数据库
  2. 漏洞限制

    • SSRF无回显
    • 可通过端口探测判断:
      • 未开启端口:返回特定错误
      • 开启端口:返回不同响应

3.3 其他潜在漏洞

  1. Seay扫描结果分析
    • 发现referer伪造可能导致SQL注入
    • 但iSecurity::escapeStr已过滤单引号
    • 需要寻找其他利用方式组合

四、审计技巧总结

  1. 优先手动审计

    • 理解框架运行流程
    • 分析核心类库
    • 再使用工具辅助
  2. 工具使用时机

    • 初步手动审计完成后
    • 可提高效率,减少重复工作
  3. 重点关注

    • 用户输入处理流程
    • 数据库操作安全
    • 文件包含和远程加载机制
    • 权限验证逻辑
  4. 记录分析

    • 记录每个潜在漏洞点的调用链
    • 分析过滤机制的有效性
    • 尝试绕过方法

通过以上系统化的审计方法,可以有效发现PHP应用程序中的安全漏洞,特别是对于MVC框架的程序,理解其运行机制是成功审计的关键。

PHP代码审计实战思路教学文档 一、代码审计的战略性思考 1.1 不同编程模式的审计方法差异 面向过程程序审计 : 直接使用Seay审计系统进行扫描 重点检查公共函数文件中的可利用点 MVC模式程序审计 : 不能直接依赖自动化工具 需要先理解程序运行流程和目录结构 重点审计核心类库 核心类库无漏洞时再转向功能点审计 1.2 审计失败处理策略 多次尝试无果后考虑更换目标程序 长期无成果可能需要更换审计人员 二、实战审计流程详解 2.1 环境准备 目标:某开源CMS (iCMS) 环境:Windows + PHPStudy + Sublime 2.2 目录结构分析 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每次请求必须改变 这些值会存入数据库 漏洞限制 : SSRF无回显 可通过端口探测判断: 未开启端口:返回特定错误 开启端口:返回不同响应 3.3 其他潜在漏洞 Seay扫描结果分析 : 发现referer伪造可能导致SQL注入 但iSecurity::escapeStr已过滤单引号 需要寻找其他利用方式组合 四、审计技巧总结 优先手动审计 : 理解框架运行流程 分析核心类库 再使用工具辅助 工具使用时机 : 初步手动审计完成后 可提高效率,减少重复工作 重点关注 : 用户输入处理流程 数据库操作安全 文件包含和远程加载机制 权限验证逻辑 记录分析 : 记录每个潜在漏洞点的调用链 分析过滤机制的有效性 尝试绕过方法 通过以上系统化的审计方法,可以有效发现PHP应用程序中的安全漏洞,特别是对于MVC框架的程序,理解其运行机制是成功审计的关键。