Day29:安全开发-JS应用DOM树加密编码库断点调试逆向分析元素属性操作

news2025/2/28 3:54:11

目录

JS原生开发-DOM树-用户交互

JS导入库开发-编码加密-逆向调试

思维导图


JS知识点:

功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等

技术:原生开发,DOM,常见库使用,框架开发(VueNodeJS),打包器(Webpack)

安全:原生开发安全,NodeJS安全,Vue安全,打包器Webpack安全,三方库安全问题等

JS原生开发-DOM-用户交互

DOM :文档操作对象

浏览器提供的一套专门用来操作网页代码内容的功能,实现自主或用户交互动作反馈

  • 在Web开发中,浏览器将HTML文档解析为DOM树的结构。DOM树由节点(Nodes)组成,节点可以是元素节点、文本节点、注释节点等。每个节点都有与之相关联的属性、方法和事件。
  • 通过使用DOM,您可以通过JavaScript或其他支持DOM的编程语言来访问和操作HTML文档的内容、结构和样式。您可以使用DOM提供的方法和属性来选择元素、修改元素的属性和内容、添加或删除元素,以及响应用户交互等。

安全问题:本身的前端代码通过DOM技术实现代码的更新修改,但是更新修改如果修改的数据可以由用户来指定,就会造成DOM-XSS攻击!

1、获取对象

        标签:直接写

        Class:加上符号.

        id:加上符号#

<h1 id="myHeader" onclick="getValue()">这是标题</h1>
document.querySelector('h1')
document.querySelector('.id')
document.querySelector('#myHeader')

2、获取对象属性

<h1 id="myHeader" onclick="getValue()">这是标题</h1>
const h1=document.querySelector('h1')
const id=h1.id
console.log(id)

2、操作元素数据

        innerHTML 解析后续代码

        innerText 不解析后续代码

3、操作元素属性

可以通过 js 修改页面元素的内容属性文本等,如下修改了页面中图片的 src,实现了图片的变换

className src id等
<img src="iphone.jpg" width="300" height="300"></img>
const src=document.querySelector('img')
src.src='huawei.png

随便下载两张照片放到之前的 js 目录下

创建 dom.html, 内容如下:演示获取图片 src 和标签文本

<h1 id="myHeader" onclick="update1()">这是H1</h1>
 ​
<img src="iphone.jpg" width="300" height="300"><br>
 ​
<button onclick="update()">刷新</button>
 ​
<script>
 function update(){
 const img=document.querySelector('img');
 console.log(img.src);
    }
 function update1(){
 const h1=document.querySelector('h1');
 console.log(h1.innerText);
    }
 ​
</script>

这里开始演示点击刷新修改图片和点击文本修改标签文本



<!--<h1 id="myHeader" onclick="update1()">这是标题</h1>-->

<!--<img src="iphone.jpg" width="300" height="300"><br>-->

<!--<button onclick="update()">刷新</button>-->

<!--<script>-->
<!--    function update(){-->
<!--        const s=document.querySelector('img')-->
<!--        s.src="javascript:alert(‘XSS’);"-->
<!--        //如果这里huawei.png为一个变量由用户传递决定,那么就会造成DOM XSS-->
<!--    }-->

<!--    function update1(){-->
<!--        const s=document.querySelector('h1')-->
<!--        //s.innerText="这是小迪<br>"-->
<!--        s.innerHTML='<img src=# onerror="alert(1)">'-->
<!--        console.log(str)-->
<!--    }-->
<!--</script>-->

<!--<h1 id="myHeader" onclick="update1()">这是H1</h1>-->

<!--<img src="iphone.jpg" width="300" height="300"><br>-->

<!--<button onclick="update1()">刷新</button>-->

<!--<script>-->
<!--    function update(){-->
<!--        const img=document.querySelector('img');-->
<!--        console.log(img.src);-->
<!--    }-->
<!--    function update1(){-->
<!--        const h1=document.querySelector('h1');-->
<!--        console.log(h1.innerText);-->
<!--    }-->

<!--</script>-->
<h1 id="myHeader" onclick="update1()">这里是SuYou</h1>

<img src="iphone.jpg" width="300" height="300"><br>

<button onclick="update()">刷新</button>

<script>
    function update(){
        const img=document.querySelector('img');
        img.src = 'huawei.png';
        console.log(img.src);
    }
    function update1(){
        const h1=document.querySelector('h1');
        const str = h1.innerText;
        console.log(str);

        // 迪总是置换了文本,我让它点一下左移一下,小把戏,见笑见笑
        const first = str[0];
        var remain = str.substring(1,str.length);
        var new_str = remain + first;
        h1.innerText = new_str; // innerText不解析后续代码,只是当文本
        // h1.innerHTML = '<h3>' + new_str + '</h3>'; // innerHTML不解析后续代码,只是当文本

    }

</script>

此时点击 h1 刷新标题内容,点击刷新按钮,刷新照片 

安全问题:本身的前端代码通过DOM技术实现代码的更新修改,但是更新修改如果修改的数据可以由用户来指定,就会造成DOM-XSS攻击!

如 update 中的 img.src, 如果这里的 huawei.png 为一个变量,可以由用户传递决定,那么就可能会造成 DOM XSS, 如下

<h1 id="myHeader" onclick="update1()">这是标题</h1>

<img src="iphone.jpg" width="300" height="300"><br>

<button onclick="update()">刷新</button>

<script>
    function update(){
        const s=document.querySelector('img')
        s.src="javascript:alert(‘XSS’);"
        //如果这里huawei.png为一个变量由用户传递决定,那么就会造成DOM XSS
    }

    function update1(){
        const s=document.querySelector('h1')
        //s.innerText="这是小迪<br>"
        s.innerHTML='<img src=# onerror="alert(1)">'
        console.log(str)
    }
</script>

点击刷新:可见浏览器进行了过滤拦截

点击标题,绕过

update1 函数通过 innerHTML 插入带有 onerror 事件的 img 元素,这可能导致 XSS(跨站脚本攻击)漏洞。在实际应用中,需要谨慎处理用户提供的内容,以防止安全漏洞。

实测:网易云翻译:可以使用带外dns,造成数据库ip泄露

发现输入后即使不点翻译,页面仍然发生变化,猜测有 js

参数可控,并且做了替换,怀疑可以是DOM XSS

测试时使用 dnslog,在输入内容中添加。dnslog.cn 是 dnslog 生成的域名,自行替换

<img src="http://dnslog.cn">

在浏览器开发者工具 network 中发现页面确实向 dnslog.cn 发送了请求。

在 source 中搜索关键字 querySelector 发现可疑 js 文件 translate.js

直接在翻译中输入 img 标签会被实体化,即被过滤,但是当鼠标放到右侧滑过之后,左侧 img 标签成功执行,可能是使用了 js 鼠标滑过事件 (盲猜一波类似 mouseover 之类的事件),从左到右被过滤了,从右到左没有,所以导致了成功执行

JS导入库开发-编码加密-逆向调试

md5

<!-- 引入 md5.js 脚本 -->
<script src="js/md5.js"></script>

<!-- JavaScript 代码 -->
<script>
    // 定义字符串变量
    var str1 = 'xiaodi jichu No1';

    // 使用 md5.js 中的 md5 函数对字符串进行加密
    var str_encode = md5(str1);

    // 输出加密后的字符串到控制台
    console.log(str_encode);
</script>

输出:afe5119ec0ab46b55432fc5e24f1dc62

SHA1

<!-- 引入 crypto-js.js 脚本 -->
<script src="js/crypto-js.js"></script>

<!-- JavaScript 代码 -->
<script>
    // 定义字符串变量
    var str1 = 'xiaodisec';

    // 使用 CryptoJS.SHA1 函数对字符串进行 SHA-1 加密,并将结果转为字符串
    var str_encode = CryptoJS.SHA1(str1).toString();

    // 输出加密后的字符串到控制台
    console.log(str_encode);
</script>

输出:ce22eaa1c5ebd3dfb3f4474b66f6d3612d4cb3ee

HMAC

<!-- 引入 crypto-js.js 脚本 -->
<script src="js/crypto-js.js"></script>

<!-- JavaScript 代码 -->
<script>
    // 定义密钥和字符串变量
    var key = 'key';
    var str1 = 'xiaodisec';

    // 使用 CryptoJS.HmacSHA256 函数生成 HMAC-SHA256 散列
    var hash = CryptoJS.HmacSHA256(key, str1);

    // 将散列结果转为十六进制字符串
    var str_encode = CryptoJS.enc.Hex.stringify(hash);

    // 输出加密后的字符串到控制台
    console.log(str_encode);
    // 输出示例:'11a7960cd583ee2c3f1ed910dbc3b6c3991207cbc527d122f69e84d13cc5ce5c'
</script>

输出:08ac6dc8773bd34dcadeffb2b90a8b8f5be9453a9dce7cf09d4da2fcb363d9e7

AES

<script src="js/crypto-js.js"></script>
<script type="text/javascript">
    var aseKey = "12345678"     // 定制秘钥,长度必须为:8/16/32位, 长度不一致也没问题
    var message = "xiaodisec";  // 需要加密的内容
    // 加密 DES/AES切换只需要修改 CryptoJS.AES <=> CryptoJS.DES
    var encrypt = CryptoJS.AES.encrypt(message, CryptoJS.enc.Utf8.parse(aseKey),  // 参数1=密钥, 参数2=加密内容
        {
            mode: CryptoJS.mode.ECB, // 为DES的工作方式
            padding: CryptoJS.pad.Pkcs7  // 当加密后密文长度达不到指定整数倍(8个字节、16个字节)则填充对应字符
        }
    ).toString(); // toString=转字符串类型

    console.log(encrypt);
    var decrypt = CryptoJS.AES.decrypt(encrypt, CryptoJS.enc.Utf8.parse(aseKey), // 参数1=密钥, 参数2=解密内容
        {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        }
    ).toString(CryptoJS.enc.Utf8); // toString=转字符串类型,并指定编码
    console.log(decrypt); // "xiaodisec"
</script>

输出:g4ohopaiYA34XXLsV92Udw== xiaodisec

DES

<script src="js/crypto-js.js"></script>
<script type="text/javascript">
    var aseKey = "12345678"     // 定制秘钥,长度必须为:8/16/32位, 长度不一致也没问题
    var message = "xiaodisec";  // 需要加密的内容
    // 加密 DES/AES切换只需要修改 CryptoJS.AES <=> CryptoJS.DES
    var encrypt = CryptoJS.DES.encrypt(message, CryptoJS.enc.Utf8.parse(aseKey),  // 参数1=密钥, 参数2=加密内容
        {
            mode: CryptoJS.mode.ECB, // 为DES的工作方式
            padding: CryptoJS.pad.Pkcs7  // 当加密后密文长度达不到指定整数倍(8个字节、16个字节)则填充对应字符
        }
    ).toString(); // toString=转字符串类型

    console.log(encrypt); // 控制台打印 CDVNwmEwDRM

    //解密
    var decrypt = CryptoJS.DES.decrypt(encrypt, CryptoJS.enc.Utf8.parse(aseKey), // 参数1=密钥, 参数2=解密内容
        {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        }
    ).toString(CryptoJS.enc.Utf8); // toString=转字符串类型,并指定编码
    console.log(decrypt); // 控制台打印 "i am xiaozhou ?"

</script>

输出:WVSwdlodMcV2n1FH72uXgw== xiaodisec

RSA

<script src="js/jsencrypt.js"></script>
<script type="text/javascript">
    // 公钥 私匙是通过公匙计算生成的,不能盲目设置
    var PUBLIC_KEY = '-----BEGIN PUBLIC KEY-----MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALyBJ6kZ/VFJYTV3vOC07jqWIqgyvHulv6us/8wzlSBqQ2+eOTX7s5zKfXY40yZWDoCaIGk+tP/sc0D6dQzjaxECAwEAAQ==-----END PUBLIC KEY-----';
    //私钥
    var PRIVATE_KEY = '-----BEGIN PRIVATE KEY-----MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAvIEnqRn9UUlhNXe84LTuOpYiqDK8e6W/q6z/zDOVIGpDb545NfuznMp9djjTJlYOgJogaT60/+xzQPp1DONrEQIDAQABAkEAu7DFsqQEDDnKJpiwYfUE9ySiIWNTNLJWZDN/Bu2dYIV4DO2A5aHZfMe48rga5BkoWq2LALlY3tqsOFTe3M6yoQIhAOSfSAU3H6jIOnlEiZabUrVGqiFLCb5Ut3Jz9NN+5p59AiEA0xQDMrxWBBJ9BYq6RRY4pXwa/MthX/8Hy+3GnvNw/yUCIG/3Ee578KVYakq5pih8KSVeVjO37C2qj60d3Ok3XPqBAiEAqGPvxTsAuBDz0kcBIPqASGzArumljkrLsoHHkakOfU0CIDuhxKQwHlXFDO79ppYAPcVO3bph672qGD84YUaHF+pQ-----END PRIVATE KEY-----';
    //使用公钥加密
    var encrypt = new JSEncrypt();//实例化加密对象
    encrypt.setPublicKey(PUBLIC_KEY);//设置公钥
    var message = 'xiaodisec' // 需要加密的数据
    var encrypted = encrypt.encrypt(message);//对指定数据进行加密
    console.log(encrypted)  // 'JQ83h8tmJpsSZcb4BJ3eQvuqIAs3ejepcUUnoFhQEvum8fA8bf1Y/fG+DO1bSIVNJF6EOZKe4wa0njv6aOar9w=='
    //使用私钥解密
    var decrypt = new JSEncrypt(); // 创建解密对象
    decrypt.setPrivateKey(PRIVATE_KEY); //设置私钥
    var uncrypted = decrypt.decrypt(encrypted); //解密 'xiaodisec'
    console.log(uncrypted);
</script>

输出:Fw1H5KoC6zZnwAzLee8z5ubmQYSqaVqu711VI+NBavYT9bkWpzxUtZHmbSUvLbuCblPO96NdfoQHtPe9TURo6A== xiaodisec

‘admin’ OR 1=1 — ‘的含义

首先,让我们逐步解析这个语句的含义。在MySQL中,’admin’表示一个字符串常量,OR关键字表示逻辑或运算符,而1=1是一个恒定为真的条件。最后的’– ‘表示注释,使得引号后的内容成为注释而不被解析。

换句话说,这个语句在条件中使用了1=1,这个条件总是为真,因此结果总是返回真。这就可以绕过许多条件验证,让用户以admin的身份执行相关操作。

举个例子,假设SQL语句如下:
 

SELECT * FROM users WHERE username = 'admin' OR 1=1 -- ' AND password = '123456'

这个语句的意图是从users表中选择username为’admin’且password为’123456’的记录。然而,由于’admin’ OR 1=1 — ‘这个条件恒为真,实际上会选择所有的记录,而不仅仅是admin账户。

若 payload 的测试数据为 admin ‘1=1, 但网站接受的是加密数据,你直接发明文过去,肯定是没用效果的,需要将 payload 也以相同的加密算法加密发送才会有效

逆向调试加密算法

打开页面,选择密码右击鼠标打开检查,找到相关id值edtPassWord,并进行搜索$("#btnPost").click(function() 加#后证明是想取id值中的edtPassWord

加密方式

分析代码过程:发出疑问如果加密格式不显示出来,怎样判断加密的方式是什么?

可以借助检查的控制台,尝试输入获取加密后的密码值,再和提交表单的加密值进行比对,若一致则证明识别出。(一般安全防护比较强的,不会把运行的所以东西全加载到浏览器上)

断点调试:一般安全防护比较强的,不会把运行的所有东西全加载到浏览器上,所以要执行断点调试

https://my.sto.cn/

打开页面,选择密码右击鼠标打开检查找到相关id值numPassword并进行搜索

找到密码的加密格式,但是没有明文展现出来

采用之前的方式在控制台中输入相应的代码encodeURI(encrypt.encrypt(numPassword))报错encrypt is not defined,有一些文件只在服务器本地执行,不会加载到浏览器中

说明这部分文件是放在浏览器上的,并不是在本地的,只有用到的时候才会传输到本地执行

必须采用调试断点的方式来,通过服务器获取其执行文件,然后修改对应的返回密文即可

对应地方打上断点,点击登录,进入断点调试,发现右侧出现输入的账号密码内容

点击最右侧按钮,进入调试,再次打开控制台,并输入encodeURI(encrypt.encrypt(numPassword))发现成功回显加密后的密码

这时候可以执行是因为加密的文件已经被放入浏览器的内存中

思维导图

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

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

相关文章

HTML 学习笔记——标签创建小技巧

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Emmrt工具</title></head><body>&…

超越Chain-of-Thought LLM 推理

原文地址&#xff1a;Beyond Chain-of-Thought LLM Reasoning 2024 年 2 月 13 日 介绍 最近的一项研究解决了需要增强大型语言模型 (LLM) 的推理能力&#xff0c;超越直接推理 (Direct Reasoning&#xff0c;DR) 框架&#xff0c;例如思想链和自我一致性&#xff0c;这些框架可…

ARM/Linux嵌入式面经(一):海康威视

海康威视 1.函数指针和指针函数区别 1.定义的差异 函数指针&#xff1a;函数指针的定义涉及到函数的地址。例如&#xff0c;定义一个指向函数的指针 int (*fp)(int)&#xff0c;这里 fp 是一个指针&#xff0c;它指向一个接受一个整数参数并返回整数的函数。 指针函数&#…

了解华为(PVID VLAN)与思科的(Native VLAN)本征VLAN的区别并学习思科网络中二层交换机的三层结构局域网VLAN配置

一、什么是二层交换机&#xff1f; 二层交换机&#xff08;Layer 2 Switch&#xff09;是一种网络设备&#xff0c;主要工作在OSI模型的数据链路层&#xff08;第二层&#xff09;&#xff0c;用于在局域网内部进行数据包的交换和转发。二层交换机通过学习MAC地址表&#xff0…

Excel F4键的作用

目录 一. 单元格相对/绝对引用转换二. 重复上一步操作 一. 单元格相对/绝对引用转换 ⏹ 使用F4键 如下图所示&#xff0c;B1单元格引用了A1单元格的内容。此时是使用相对引用&#xff0c;可以按下键盘上的F4键进行相对引用和绝对引用的转换。 二. 重复上一步操作 ⏹添加或删除…

【打工日常】使用docker部署个人实时在线文档协助编辑器

一、Etherpad介绍 Etherpad是一个高度可定制的开源在线编辑器&#xff0c;提供真正实时的协作编辑。放在自己的服务器里面&#xff0c;可以更大程度的保护自己工作的隐私&#xff0c;并且Etherpad允许您实时协作编辑文档&#xff0c;就像在浏览器中运行的实时多人编辑器一样这样…

接口自动化测试从入门到高级实战!

接口测试背景和必要性 接口测试是测试系统组件间接口&#xff08;API&#xff09;的一种测试&#xff0c;主要用于检测内部与外部系统、内部子系统之间的交互质量&#xff0c;其测试重点是检查数据交换、传递的准确性&#xff0c;控制和交互管理过程&#xff0c;以及系统间相互…

grafana table合并查询

注&#xff1a;本文基于Grafana v9.2.8编写 1 问题 默认情况下table展示的是一个查询返回的多个field&#xff0c;但是我想要的数据在不同的metric上&#xff0c;比如我需要显示某个pod的读写IO&#xff0c;但是读和写这两个指标存在于两个不同的metirc&#xff0c;需要分别查…

Excel 快速填充/输入内容

目录 一. Ctrl D/R 向下/右填充二. 批量输入内容 一. Ctrl D/R 向下/右填充 ⏹如下图所示&#xff0c;通过快捷键向下和向右填充数据 &#x1f914;当选中第一个单元格之后&#xff0c;可以按住Shift后&#xff0c;再选中最后一个单元格&#xff0c;可以选中第一个单元格和最…

【决策树】预测用户用电量

决策树预测用户用电量 文章目录 决策树预测用户用电量  &#x1f449;引言&#x1f48e;一、 数据预处理数据预处理初步数据分析 二、 机器学习算法决策树回归预测用电量决策树模型介绍&#xff1a;回归预测 三、 可视化结果四、 数据分析与结论代码如下 &#x1f449;引言&a…

日期问题---算法精讲

前言 今天讲讲日期问题&#xff0c;所谓日期问题&#xff0c;在蓝桥杯中出现众多&#xff0c;但是解法比较固定。 一般有判断日期合法性&#xff0c;判断是否闰年&#xff0c;判断日期的特殊形式&#xff08;回文或abababab型等&#xff09; 目录 例题 题2 题三 总结 …

docker 子网

当需要给容器分配指定 ip &#xff0c;为避免ip 冲突&#xff0c;指定容器子网处理 创建 subnet 子网 docker network create --subnet 10.0.0.0/24 --gateway 10.0.0.1 subnet-testdocker network ls NETWORK ID NAME DRIVER SCOPE ... f582ecf297bc sub…

跑马灯样式

这里的公告是要做成&#xff0c;跑马灯的样式&#xff0c;文字是会移动并且隐藏掉的。 HTML&#xff1a; <div class"notice"><div class"yrr"><img src"./img/ia_100000018.png" alt"" /></div><div …

(关键点检测)YOLOv8实现多类人体姿态估计的输出格式分析

&#xff08;关键点检测&#xff09;YOLOv8实现多类人体姿态估计的输出格式分析 任务分析 所使用的数据配置文件 网络结构 导出模型 用 netron 可视化 输出格式分析 参考链接 1. 任务分析 判断人体关键点时一并给出关键点所属的类别&#xff0c;比如男人&#xff0c;女…

使用Tokeniser估算GPT和LLM服务的查询成本

将LLM集成到项目所花费的成本主要是我们通过API获取LLM返回结果的成本&#xff0c;而这些成本通常是根据处理的令牌数量计算的。我们如何预估我们的令牌数量呢&#xff1f;Tokeniser包可以有效地计算文本输入中的令牌来估算这些成本。本文将介绍如何使用Tokeniser有效地预测和管…

如何在Mapbox GL中处理大的GEOJSON文件

Mapbox GL可以将 GeoJSON 数据由客户端(Web 浏览器或移动设备)即时转换为 Mapbox 矢量切片进行显示和处理。本文的目的是教大家如何有效加载和渲染大型 GeoJSON 源,并优化渲染显示速度,增强用户体验,减少客户端卡顿问题。本文以Mapbox 为例,至于其它框架原理大致相同,可…

对中国境内所有地区KFC门店基本信息的统计(简略版)

我们要获取每个地区的kfc信息就要先获取中国一共有哪些地区 中国所有城市名称获取 import requests from lxml import etreewith open(f./省份.txt, w) as fp:fp.write() with open(f./城市.txt, w) as fp:fp.write()url1http://www.kfc.com.cn/kfccda/storelist/index.aspx#…

golang实现正向代理和反向代理

文章目录 正向代理反向代理区别与联系:总结代理服务器实现正向代理反向代理正向代理 正向代理是客户端代理,它位于客户端和目标服务器之间。它的作用是保护客户端的隐私和安全。 如我们现在想要访问谷歌,但是由于某些原因,无法直接访问到谷歌,我们可以通过连接一台代理服务…

2024 年中国高校大数据挑战赛赛题 D:行业职业技术培训能力评价完整思路以及源代码分享

中国是制造业大国&#xff0c;产业门类齐全&#xff0c;每年需要培养大量的技能娴 熟的技术工人进入工厂。某行业在全国有多所不同类型&#xff08;如国家级、 省级等&#xff09;的职业技术培训学校&#xff0c;进行 5 种技能培训。学员入校时需要 进行统一的技能考核&#xf…

Feign实现微服务间远程调用续;基于Redis实现消息队列用于延迟任务的处理,Redis分布式锁的实现;(黑马头条Day05)

目录 延迟任务和定时任务 使用Redis设计延迟队列原理 点评项目中选用list和zset两种数据结构进行实现 如何缓解Redis内存的压力同时保证Redis中任务能够被正确消费不丢失 系统流程设计 使用Feign实现微服务间的任务消费以及文章自动审核 系统微服务功能介绍 提交文章-&g…