soap 注入简介

soap注入就是在webservice 的soap协议,连接web服务和客户端的接口处的注入,通过在发送的soap消息参数内添加注入语句来达到注入效果,常见的有sql注入,也有xml注入,代码注入

什么是soap

首先介绍webservice,webservice是一种跨平台,跨语言的规范,用于不同平台,不同语言间的交互,webservice有三要素,分别为soap,wsdl和uddl,uddl用于提供发布和查询webservice方法,wsdl是webservice服务描述语言,用于web服务说明,它是一个xml文档,用于说明一组soap消息如何访问接口,soap是简单对象访问协议,用于分布式环境的基于信息交换的同行协议,描述传递信息的格式和规范,它可以用于连接web服务和客户端之间的接口,是一个可以在不同操作系统上运行的不同语言编写的程序之间的传输通信协议,格式为xml,soap消息

soap协议又分为soap 1.1 和 soap 1.2 两个版本
这两个协议间的区别在于soap 1.1里存在soapAction请求头,而soap 1.2没有,soap 1.2里用了action来代替,两者的wsdl文件也不同,体现在命名空间和定义service差别里,不过这些对注入没有影响

soap SQL注入

SOAP sql注入原理

soap sql 注入就是攻击者修改发送的soap消息参数,达到发起SQL注入的效果,在服务提供端,soap信息被解析,参数在访问数据库前没有被检测,导致执行sql语句,造成sql注入

soap的消息格式

之前提到过soap的格式为xml的

<?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>
<soap:Fault>
</soap:Fault>
</soap:Body>

</soap:Envelope>

Envelope:用于把xml信息标记为soap
header:包含请求信息
Body:包含了请求和相应信息
Fault:包含了发生的错误信息

这里重点关注Body,Body处包含了请求和相应信息,当Body内有存在数据可控时,就有可能存在注入

例如

<?xml version="1.0" encoding="utf-8"?>
<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:Body>
<GetServiceCustomer xmlns="http://tempuri.org/">
<UserID>string</UserID>
<ServiceType>string</ServiceType>
<CO_CODE>string</CO_CODE>
</GetServiceCustomer>
</soap:Body>
</soap:Envelope>

如果这里的UserID处的参数被放入数据库查询,就有可能触发漏洞,当然,这里需要知道此处web服务的功能,sql注入一般发生在数据查询处

或者可以去通过查看asmx下的wsdl,wsdl是一个xml,用于说明soap消息及如何使用这些消息,通常形式为asmx?wsdl,后面测试里会提到的。

实践

image

经过目录遍历发现了这个地址,其中的数据包就是SOAP包

image

有一个特征是以WSDL后缀作为结束的

http://XXXXXXX:8001/PosWcfService.svc?singleWsdl
image

这些是WSDL其中的接口,以XML格式展示的,看上去不是很方便。

使用Burp的插件可以解析到这些接口路径。

image

把其中的WSDL路径右键解析过去,插件即可识别出接口。

image

那么就找接口中的注入什么的,命令执行什么的。

image

经过测试,我在CheckUpload模块发现了PostID存在注入,使用sqlmap跑即可。

POST /PosWcfService.svc HTTP/1.1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://xxxxxx:8001/PosWcfService.svc
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
SOAPAction: http://tempuri.org/IPosWcfService/CheckUpload
Content-Type: text/xml;charset=UTF-8
Host: XXXXXXX:8001
Content-Length: 583

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:CheckUpload>
         <!--type: string-->
         <tem:sessionId>gero et</tem:sessionId>
         <!--type: string-->
         <tem:posId>*</tem:posId>
         <!--type: int-->
         <tem:shopid>3</tem:shopid>
         <!--type: int-->
         <tem:id>3</tem:id>
         <!--type: string-->
         <tem:msg>quae divum incedo</tem:msg>
      </tem:CheckUpload>
   </soapenv:Body>
</soapenv:Envelope>
image

注入就出来了。

附录

另外还有一些自动化API测试的,比如ReadyAPI

2.ReadyAPI

配置Burp代理

readyAPI

readyAPI

打开ReadyAPI选择New Security Test(创建新的安全测试)

new

new

这里三个都可以选择,我选择第一个

new

new

填入需要测试的API接口

api

api

点击Finish自行自动探测

Finish

Finish

扫描

扫描

从Burp历史请求记录中可以看到已经产生大量的payload

payload

payload

输出结果发现存在sql注入:

down

但是我感觉这玩意不是很准。。

image

参考

https://www.xffbk.cn/archives/23.html

https://freebuf.com/articles/web/325085.html

https://www.anquanke.com/post/id/85410