浅谈SOAP-SQL注入

本文最后更新于 2024年10月23日 晚上

理清概念

Web Services

简介

Web Services 是一种标准化的、跨平台、跨语言的通信方法,允许不同系统和应用程序通过网络互相交流。它们提供了一种机制,使得不同平台和语言的应用能够相互调用功能或交换数据,而不需要了解彼此的实现细节或平台。

看不懂?没事我也看不懂哈哈。例如,假设 A 公司的 Linux 平台上的 Java 程序需要与 B 公司的 Windows 平台上的 C 程序进行通信,交换数据或调用业务逻辑。通过 Web Services 技术,开发人员可以创建 Web 服务接口,然后在这些接口上进行跨平台、跨语言的通信。这是因为 Web Services 使用统一的标准和协议,确保不同平台和编程语言的系统能够互操作。

Web Services三要素

  • SOAP(Simple Object Access Protocol)
  • **WSDL(WebServicesDescriptionLanguage) **
  • UDDI(UniversalDescriptionDiscovery andIntegration)

Web Services的关键点

  1. 标准化:Web Services 使用标准化的协议(如 SOAP)和数据格式(如 XML 或 JSON),确保不同系统之间的兼容性。
  2. 跨平台和跨语言:无论服务提供者和消费者使用什么平台或编程语言,只要遵循相同的标准,就能进行有效的通信。
  3. 接口描述:Web Services 使用 WSDL 文件来描述服务接口,使得服务的使用者能够理解如何调用这些服务。
  4. 服务发现:通过 UDDI 等目录服务,服务提供者可以注册他们的服务,服务消费者可以查找和使用这些服务。

SOAP

简介

SOAP(Simple Object Access Protocol) 它是一个基于 XML 的协议,注意不是HTTP那种的**”传输协议”,而是“协议”。被设计用于支持分布式计算环境中的消息交换**,常用于实现Web Services

简单来说,SOAP(Simple Object Access Protocol,简单对象访问协议)其实就是一种用于定义 Web 服务之间以及 Web 服务与客户端之间通信的标准化协议

特点

  • XML 基础:SOAP 消息采用 XML 格式,使得它具有良好的平台及语言无关性。

  • 协议独立性SOAP 可以通过不同的传输协议(如 HTTP、SMTP、TCP 等)发送消息,但最常用的是 HTTP

  • 消息结构

    • SOAP Envelope:消息的封装结构,包括头部(Header)和主体(Body)。
    • Header:包含与消息处理相关的元数据。
    • Body包含实际的请求或响应数据
  • 功能:SOAP 支持复杂的操作,如事务处理、安全性和可靠性,但这些功能也使其相对复杂。

SOAP的关键点

通信协议:SOAP 作为通信协议,定义了如何格式化和传输请求和响应消息。它描述了消息的结构、编码方式和传输协议。

接口规范:SOAP 提供了一种标准化的方式来定义和描述 Web 服务的接口,包括如何请求服务、如何发送数据、如何接收响应等。

跨平台和跨语言:因为 SOAP 消息使用 XML 格式,SOAP 协议使得不同平台和编程语言的系统可以通过统一的标准进行通信和交互。

标准化格式:SOAP 消息包含 SOAP Envelope,其中包括 Header(可选)和 Body(包含实际的数据或请求)。这些标准化的结构确保了消息的可解析性和一致性。

扩展性:SOAP 支持多种扩展功能,如安全性、事务处理等,使其能够处理复杂的业务需求。

WSDL

简介

WSDL (Web Services Description Language)是一种用于描述 Web Service的 XML 格式的语言。它定义了 Web Service的接口、操作、数据类型和传输协议。WSDL 文件帮助服务的使用者了解如何访问和使用 Web Service

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<wsdl:definitions xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://www.verisoft.com/JupiterSOAPWebService" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://www.verisoft.com/JupiterSOAPWebService">
<link/>
<script/>
<script/>
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://www.verisoft.com/JupiterSOAPWebService">
<s:element name="getCardStatus">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="wSCardsStatusInDTO" type="tns:CardsStatusInDTO"/>
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="CardsStatusInDTO">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="channelId" type="s:int"/>
<s:element minOccurs="0" maxOccurs="1" name="channelKey" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="cardNumber" type="s:string"/>
</s:sequence>
</s:complexType>
<s:element name="getCardStatusResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="getCardStatusResult" type="tns:CardStatus"/>

功能

  • Types:定义服务使用的数据类型。
  • Message:描述传输的数据格式。
  • PortType:定义服务的操作和接口。
  • Binding:指定协议(如 SOAP)和数据格式(如 XML)。
  • Service:定义服务的地址(即服务的具体 URL)。

UDDI(Universal Description, Discovery, and Integration)

简介

UDDI 是一个用于 Web Service注册和发现的目录服务。它允许服务提供者注册他们的服务,并允许服务消费者查找和获取这些服务

功能

  • Business Entity:描述提供服务的组织或公司。
  • Business Service:描述该组织或公司提供的具体服务。
  • Binding Template:提供服务的访问信息,包括 WSDL 文件的位置。
  • Service Description:描述服务的功能和接口,包括如何通过 WSDL 访问服务。

它们之间的关系

  • Web Service:总体概念,指的是通过网络提供的功能或服务
  • SOAP:一种协议,常用于 Web Service的通信,负责定义消息的格式和传输方式。
  • WSDL:描述 Web Service接口的语言,让服务消费者了解如何调用服务。
  • UDDI服务注册和发现的目录,使得服务提供者能够发布服务,消费者能够找到并使用这些服务。

工作流程

(这个可以好好看看,对这几个概念联系的理解会很有帮助)

  1. 服务注册:服务提供者创建一个 Web Service,编写 WSDL 文件来描述其接口,然后将服务注册到 UDDI 注册表中。
  2. 服务发现:服务消费者查询 UDDI 注册表,找到所需的服务及其 WSDL 描述。
  3. 服务调用:消费者根据 WSDL 文件提供的信息,通过 SOAP 协议发送请求,调用 Web Service的功能。
  4. 服务响应:服务处理请求并返回响应,通常也是通过 SOAP 消息传输的。

SOAP的组成

SOAP(Simple Object Access Protocol)是一个基于 XML 的协议,用于在网络上交换信息。SOAP 消息由多个组成部分构成,每部分都有特定的功能和结构。下面是 SOAP 消息的主要组成细节:

SOAP Envelope(SOAP 信封)

  • 功能:SOAP Envelope 是 SOAP 消息的根元素,定义了消息的整体结构。它包裹着消息的其他部分,即 Header 和 Body。

  • 结构

    1
    2
    3
    4
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>...</soap:Header>
    <soap:Body>...</soap:Body>
    </soap:Envelope>

SOAP Header(SOAP 头)

  • 功能:SOAP Header 是可选的部分,包含与消息处理相关的元数据,如安全信息、事务处理信息等。

  • 内容

    • 可以包含多个子元素,每个子元素代表不同的头部信息。
    • 头部信息通常是针对消息处理的附加数据,例如认证、加密信息或其他控制信息。
  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    <soap:Header>
    <wsse:Security>
    <wsse:UsernameToken>
    <wsse:Username>user</wsse:Username>
    <wsse:Password>pass</wsse:Password>
    </wsse:UsernameToken>
    </wsse:Security>
    </soap:Header>

SOAP Body(SOAP 主体)

  • 功能:SOAP Body 是 SOAP 消息的核心部分,包含实际的请求或响应数据。它定义了要传输的具体内容和操作。

  • 内容

    • 包括服务请求的参数或服务响应的结果。
    • 可以包含任意的 XML 数据,具体格式依赖于服务的定义。
  • 示例

    1
    2
    3
    4
    5
    <soap:Body>
    <m:GetStockPrice xmlns:m="http://www.example.org/stock">
    <m:StockName>IBM</m:StockName>
    </m:GetStockPrice>
    </soap:Body>

SOAP Fault(SOAP 错误)

  • 功能:SOAP Fault 是一个特殊的元素,用于表示消息处理过程中发生的错误。它在 SOAP Body 中出现,描述了错误的详细信息。

  • 结构

    • faultcode:表示错误类型的代码。
    • faultstring:对错误的简要描述。
    • faultactor(可选):指示导致错误的消息的发送者。
    • detail(可选):提供额外的错误信息,通常是错误的详细描述或补充信息。
  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <soap:Body>
    <soap:Fault>
    <faultcode>soap:Client</faultcode>
    <faultstring>Invalid request</faultstring>
    <detail>
    <error:InvalidParameter xmlns:error="http://www.example.org/error"/>
    </detail>
    </soap:Fault>
    </soap:Body>

总结

  • SOAP Envelope:封装整个 SOAP 消息的结构,包括 Header 和 Body。
  • SOAP Header:包含与消息处理相关的元数据,是可选的部分。
  • SOAP Body:包含实际的请求或响应数据,是消息的主体部分。
  • SOAP Fault:用于描述在处理消息时发生的错误,位于 SOAP Body 中。

SOAP-SQL注入原理

其实原理很简单,这是SOAP的消息格式(XML)

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
</soap:Header>
<soap:Body>
<test:SearchUser xmlns:m="http://www.example.org/stock">
<test:UserID>10</test:UserID>
</test:SearchUser>
</soap:Body>
</soap:Envelope>

回顾一下SQL注入的原理,在涉及数据库交互的地方,SQL语句直接拼接可控参数带入数据库查询,导致了SQL语句在语法结构上被攻击者直接可控

那么如果这里的**test:UserID**也涉及数据库的查询,并且在后端是直接拼接可控参数带入数据库查询的,那不就也能导致SQL注入吗

1
<test:UserID>10</test:UserID>

其实也就和我们平时遇到的SQL注入差不多的,比如这种POST或者GET的普通传参点的注入

1
2
3
4
5
GET
http://www.baidu.com/test.php?UserID=10' or 1=1 #

POST
UserID=10' or 1=1 #

又比如这种JSON数据格式的

1
2
3
POST

{"UserID":"10' or 1=1 #"}

那么这里的test:UserID其实也就只是传输数据的格式不一样而已,所以平时SQL注入是怎么注入的,这里的SOAP仍然是怎么注入

1
<test:UserID>10' or 1=1 #</test:UserID>

SOAP-SQL注入实战

寻找SOAP

既然要找SOAP-SQL注入漏洞,那么肯定得要网站使用了SOAP,WebService才行啊。怎么找到这些网站呢?一般来说,使用了SOAP通信的接口或者相关功能页面都存在一些特征,我们使用搜索引擎、FOFA、鹰图再结合这些特征去找就好啦

页面关键词特征

Service Description

WebServices Description Language

WebServices

Soap

WSDL

文件后缀特征

?WSDL

.wsdl

.svc

.asmx

.soap

目录特征

/webservice

/service

/ws/

样例

一般情况下,发现SOAP注入的场景就是通过FUZZ目录,FUZZ出了类似于**/webservice**的目录,访问就可以看到这样的类似主界面,那么这种情况就可以考虑测试SOAP相关的漏洞了

image

image

image

如果是在JAVA环境下遇到了SOAP接口文档(jws),或者别的类型的webservice,页面上可能和上面会有很大不同

image

但是页面上一般都会有那些关键词,Soap、WebServices、WSDL

测试SOAP-SQL注入

上文提到:”那么这里的test:UserID其实也就只是传输数据的格式不一样而已,所以平时SQL注入是怎么注入的,这里的SOAP仍然是怎么注入”,也就是说,其实对于SOAP相关漏洞的测试也没啥特别的,仍然和其他基本漏洞测试完全一样,只是在传输格式,表现形式等等方面有所不同,就相当于一种变形而已,所以使用了SOAP的地方也完全可能存在SQL注入,文件上传,SSRF,XXE等等基本漏洞,测试方法仍然一点没变,只是格式变形了而已

那么本文只讲SOAP的SQL注入,至于其他的漏洞遇到了案例再说吧:

手工测试

首先来到这个asmx接口列表界面,可以看到有很多接口,既然是找SQL注入,那么就可以通过接口描述,优先选择可能涉及数据库操作的接口,然后一个一个地测试其他接口、参数。以这个GetArriverListByUserid为例:

image

打入SQL注入payload,这里很像Swagger UI接口文档的测试

image

运气很好,直接注出了所有的日志数据

image

普通自动化测试

手工测试的话无法满足大量接口、参数的场景,于是可以使用这个漏洞扫描工具Acunetix Web Vulnerability Scanner 10进行自动化测试

  1. 获取WSDL地址,以?WSDL结尾,于是在.asmx后缀加一个**”?WSDL”**就可以了,”http://111.111.111.111:8001/Service1.asmx?WSDL

image

它定义了 Web Service的接口、操作、数据类型和传输协议。WSDL 文档帮助服务的使用者了解如何访问和使用 Web Service

image

  1. 使用Acunetix Web Vulnerability Scanner 10漏洞扫描工具的WebService模块,填入WSDL文档地址就OK,Start开始扫描

image

缺点是接口太多时速度很慢

image

进阶测试

更专业一点的测试可以使用SOAP UI开发调试工具来进行进一步的测试,是SOAP数据格式的

SOAP调试
  1. 导入WSDL链接

image

  1. 点击接口的Requests就可以进行SOAP的手工调试了,也就和Burp的改包一样,如下成功也是注入

image

  1. 还可以先打开File->Preferences->Proxy Settings配置burp代理,让流量经过burp

image

image

WSDLER 解析
  1. 除了使用SOAP-UI调试,也可以在Burp插件商店下载wsdler-WSDL的解析器

image

  1. 抓住?WSDL的数据包,右键发送给wsdler解析

image

  1. 这里就可以看到许多解析好的接口,再一一改包测试就行

image

Sqlmap联动
  1. 通过前面的调试与解析,得到了SOAP数据包,可以直接复制保存为txt,放在sqlmap去跑,也可以下载一个burp与sqlmap联动的插件sqlmap4burp++ ,这样更方便

image

  1. 配置好sqlmap路径,然后就自动调用sqlmap了,只不过sqlmap有点慢

image

实战案例

声明–以下案例来自:J0o1ey:https://github.com/J0o1ey/BountyHunterInChina/blob/main/%E9%87%8D%E7%94%9F%E4%B9%8B%E6%88%91%E5%9C%A8%E5%AE%89%E5%85%A8%E8%A1%8C%E4%B8%9A%E8%AE%A8%E5%8F%A3%E5%AD%90(%E4%B8%80)-%E8%BD%BB%E6%9D%BEGET%E6%9F%90src%20soap%E6%B3%A8%E5%85%A5.pdf

  1. 通过批量目录扫描C段,得到一处/webservice目录,访问发现soap特征

image

  1. 获取到接口 http://180.*.*.*/webservice/syncOrderToOdcService

  2. 使用 soup ui 进行调试,当中间无参数值时 Soap 接口抛出了一个 Oracle 的错误信息,并提示“Date format error,YY-MM-DD”

1
2
3
4
5
6
7
8
9
10
11
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:odc="http://odc.ws.qiku.com/">
<soapenv:Header/>
<soapenv:Body>
<odc:syncOrderInfo>
<!--Optional:-->
<arg0></arg0>
</odc:syncOrderInfo>
</soapenv:Body>
</soapenv:Envelope>
<arg0></arg0>
<arg0></arg0>
  1. 那么构造一个符合条件的 date 数据 2021-9-23
1
2
3
4
5
6
7
8
9
10
11
Soap request:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:odc="http://odc.ws.qiku.com/">
<soapenv:Header/>
<soapenv:Body>
<odc:syncOrderInfo>
<!--Optional:-->
<arg0>2021-9-23</arg0>
</odc:syncOrderInfo>
</soapenv:Body>
</soapenv:Envelope>

  1. arg0 处为日期参数,指定日期,即可查询到 xx src 商城所有订单信息属于严重泄露客户数据的漏洞未授权信息泄露get

image

  1. 测试sql注入,但是在注入的时候发现程序会将括号()过滤掉,导致函数无法执行,sqlmap注入不出来

  2. 怎么办?这时候就要用到骚姿势了:在 Oracle 中文版本中,中文括号()可以代替英文()而且不报错!剩下的就很简单了,改一个 tamper 出来,再SQLmap就行了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python
""" Copyright (c) 2006-2016 sqlmap developers (http://sqlmap.org/)
See the file 'doc/COPYING' for copying permission
"""
import os
import re
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
from lib.core.enums import PRIORITY __priority__ = PRIORITY.HIGHEST
def dependencies():
singleTimeWarnMessage("tamper script '%s' is unlikely to work against %s" %(os.path.basename(__file__).split(".")[0], DBMS.PGSQL))
def tamper(payload, **kwargs):
retVal = payload
if payload:
retVal = re.sub(r"\s*(\s*", "(", retVal)
retVal = re.sub(r"\s*)\s*", ")", retVal)
return retVal
  1. python sqlmap.py -r xxx.txt –dbs –tamper=brackets.py

image

工具推荐

Acunetix Web Vulnerability Scanner 10

https://www.xue51.com/soft/8035.html#xzdz

soap ui

https://www.soapui.org/downloads/latest-release/

sqlmap4burp

http://github.com/c0ny1/sqlmap4burp-plus-plus