什么是SOAP?
1、基于 XML 的跨平台、跨语言的通信协议;
2、核心用于不同系统(如 Java 后端、.NET 服务、硬件设备)之间通过网络交换结构化数据,本质是 “用 XML 规范封装请求 / 响应数据的通信标准”
3、通过HTTP携带标准规范的XML,完成数据的传递和翻译;
SOAP的基础架构
使用XML的标准和规范,必须头尾闭合的语法,<xxxxx> 必须使用</xxxxx>闭合;无数据的话可直接<xxxx/>闭合;
SOAP 协议规定了外层的 <Envelope> <Header> <Body> 结构,其中<Body> 里面存携带核心业务数据;
结构示例:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
</soap:Header>
<soap:Body>
</soap:Body>
</soap:Envelope>
这是基本架构,其中代表的意义通俗化来说如下:
1、把一个数据包送到服务器端,这个时候,快递公司呢就是HTTP协议,他负责进行数据包裹的运输;
2、<soap:Envelope>代表包含数据的纸箱子,并且通过xmlns(命名空间)详细解释要运行给那个模块的,为后续的解析提供铺垫;
3、 <soap:Header>则代表纸箱子上面的快递单号,告诉快递人员这个需要怎么传递,提前声明需要调用的那个模块的那个接口,需要执行什么动作;
4、<soap:Body>就是代表数据,至于里面是什么,传输者不关系,要求送到就可以;
那首先怎么理解上边提到的命名空间,是否必要?下面做详细介绍:
命名空间(Namespace,简称 xmlns)
核心目的是 解决 “不同场景下相同标签名冲突” 的问题—— 就像现实中 “同名的人” 需要用 “身份证号” 或 “所属公司” 区分一样,XML 标签通过 “命名空间” 明确其 “归属系统”,避免解析器混淆。
提前声明这个包裹是那个业务系统,提前压入所需要的标签集等;
格式为:
xmlns:前缀="命名空间URI"
这个命名空间URI都是官方指定的,之前博客中提到的都有:
| 组件 / 场景 | 命名空间 URI | 常用前缀 |
|---|---|---|
| SOAP 1.1 | http://schemas.xmlsoap.org/soap/envelope/ | soapenv、soap |
| WS-Management(wsmv) | http://schemas.microsoft.com/wbem/wsman/1/windows/shell | wsmv |
| WS-Management 基础 | http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd | wsman |
| Exchange EWS | http://schemas.microsoft.com/exchange/services/2006/messages | exch |
| .NET PowerShell 序列化 | http://schemas.microsoft.com/powershell/2004/04 | 无(默认) |
命名空间分为全局声明和局部声明;示例中为全局声明,即在<soap:Envelope>中进行;
局部声明则是在某个子标签中声明,仅该标签及其子标签可用(较少用,不如全局声明简洁);
示例:
<Body>
<exch:ProxyRequest xmlns:exch="http://schemas.microsoft.com/exchange/services/2006/messages">...</exch:ProxyRequest>
</Body>
序列和反序列数据
序列化是发送者把对象转换成可传输 / 存储的格式(如 XML),反序列化是接收者把这种格式还原为对应类型的对象(正常场景是约定的指定对象,攻击场景可能被篡改);
所以之前提到过的CVE-2022-41082,就是通过服务器端反序列化数据时他们不会校检抓换后对

60

被折叠的 条评论
为什么被折叠?



