演练学习笔记之ruoyi
字数 1926 2025-08-18 11:36:47
RuoYi框架安全演练学习笔记
1. RuoYi框架简介
RuoYi是一款基于Spring Boot和Apache Shiro的快速开发框架,广泛应用于企业级管理系统开发。该框架提供了完善的权限管理、代码生成、监控管理等功能模块。
2. RuoYi常见安全漏洞分析
2.1 默认凭证漏洞
- 问题描述:早期版本存在默认管理员账号admin/admin123
- 影响版本:v3.x及以下版本
- 修复方案:
- 升级到最新版本
- 首次安装后强制修改默认密码
- 部署时检查并删除默认账户
2.2 SQL注入漏洞
- 漏洞位置:部分动态SQL拼接处
- 攻击示例:
// 错误示例 String sql = "SELECT * FROM sys_user WHERE username = '" + username + "'"; // 正确写法应使用预编译 String sql = "SELECT * FROM sys_user WHERE username = ?"; - 修复方案:
- 使用MyBatis的#{}占位符而非${}拼接
- 启用MyBatis的SQL注入防护
- 对用户输入进行严格过滤
2.3 XSS漏洞
- 漏洞位置:未转义的用户输入展示点
- 攻击示例:
<script>alert('xss')</script> - 修复方案:
- 前端使用Vue的v-html指令自动转义
- 后端使用HtmlUtils.htmlEscape进行转义
- 设置HTTP头X-XSS-Protection
2.4 CSRF防护缺陷
- 问题描述:早期版本未启用CSRF防护或实现不完善
- 修复方案:
- 启用Shiro的CSRF防护
- 确保表单包含_csrf令牌
- 检查请求头X-Requested-With
2.5 权限绕过漏洞
- 漏洞类型:
- 注解配置不当导致的权限校验缺失
- URL路径权限配置遗漏
- 修复方案:
- 检查所有Controller方法的@RequiresPermissions注解
- 定期审计权限配置表(sys_menu)
- 实现权限的自动扫描校验机制
3. RuoYi安全加固指南
3.1 认证安全
-
密码策略:
- 启用复杂度要求(大小写、数字、特殊字符)
- 实现密码历史记录防止重复使用
- 设置密码有效期(如90天)
-
多因素认证:
- 集成Google Authenticator
- 实现短信/邮件验证码
-
会话管理:
- 设置会话超时(30分钟无操作)
- 限制并发登录
- 实现登录失败锁定(5次失败后锁定15分钟)
3.2 数据安全
-
敏感数据保护:
- 数据库加密:使用AES加密敏感字段
- 日志脱敏:手机号、身份证号等
- 传输加密:强制HTTPS
-
审计日志:
- 记录关键操作(登录、权限变更、数据删除)
- 实现日志防篡改机制
- 定期备份审计日志
3.3 安全配置
-
依赖安全:
<!-- 示例:确保使用安全版本的依赖 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.11.0</version> <!-- 使用最新稳定版 --> </dependency> -
HTTP安全头:
// Spring Security配置示例 http.headers() .contentSecurityPolicy("default-src 'self'") .xssProtection().block(true) .and() .httpStrictTransportSecurity() .includeSubDomains(true) .maxAgeInSeconds(31536000); -
生产环境配置:
- 禁用Swagger等开发工具
- 关闭调试模式(spring.profiles.active=prod)
- 修改默认错误页面避免信息泄露
4. RuoYi渗透测试要点
4.1 信息收集
-
指纹识别:
- 检查/login路径
- 识别RuoYi特有的静态资源路径
- 分析HTTP响应头中的Server/X-Powered-By
-
版本识别:
- 检查HTML注释中的版本信息
- 通过/js/ruoyi.js的修改时间判断
- 访问/actuator/info(如果开启)
4.2 漏洞利用
-
未授权访问测试:
- 尝试直接访问管理接口
- 测试API权限控制
- 检查跨目录访问
-
接口安全测试:
# 使用Burp Suite测试接口 POST /system/user/list HTTP/1.1 Content-Type: application/json {"pageSize":10, "pageNum":1}- 测试参数注入
- 检查越权访问
- 验证分页参数安全
-
文件上传测试:
- 尝试绕过上传限制
- 测试Webshell上传
- 检查文件类型校验逻辑
4.3 后渗透测试
-
权限提升:
- 分析权限设计缺陷
- 测试垂直/水平越权
- 尝试获取管理员会话
-
数据泄露测试:
- 检查敏感接口的数据返回
- 测试SQL注入获取数据
- 分析备份文件泄露
5. RuoYi安全开发规范
5.1 安全编码实践
-
输入验证:
// 使用Hibernate Validator进行输入验证 @NotBlank(message = "用户名不能为空") @Size(min = 4, max = 20, message = "用户名长度必须在4-20之间") private String username; -
输出编码:
// 使用Spring的HtmlUtils进行输出编码 model.addAttribute("safeContent", HtmlUtils.htmlEscape(userInput)); -
安全查询:
// 使用MyBatis预编译 @Select("SELECT * FROM sys_user WHERE username = #{username}") SysUser selectByUsername(@Param("username") String username);
5.2 权限设计规范
-
RBAC模型:
- 角色继承关系清晰
- 最小权限原则
- 定期权限审计
-
权限注解使用:
// 控制器方法权限控制 @RequiresPermissions("system:user:view") @GetMapping("/list") public TableDataInfo list(SysUser user) { // ... } -
数据权限:
- 实现部门数据过滤
- 防止横向越权
- 敏感操作二次确认
6. 应急响应与修复
6.1 漏洞修复流程
-
确认漏洞:
- 复现漏洞场景
- 确定影响范围
- 评估风险等级
-
临时解决方案:
- WAF规则拦截
- 禁用相关功能
- 权限临时调整
-
永久修复:
- 代码层面修复
- 安全测试验证
- 版本更新发布
6.2 安全监控
-
异常检测:
- 监控失败登录尝试
- 检测敏感操作
- 审计权限变更
-
入侵检测:
- 部署RASP防护
- 分析请求日志
- 监控Webshell行为
7. 总结与最佳实践
-
定期安全评估:
- 每季度进行安全审计
- 依赖组件漏洞扫描
- 渗透测试
-
安全开发生命周期:
- 需求阶段考虑安全
- 设计阶段威胁建模
- 编码阶段安全审查
- 测试阶段安全测试
-
持续安全改进:
- 跟踪安全公告
- 参与安全社区
- 建立安全知识库
通过以上全面的安全措施,可以显著提升RuoYi框架应用的安全性,有效防御常见Web攻击,保障企业管理系统安全稳定运行。