SOAP注入

零基础学黑客,搜索公众号:白帽子左一

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,后面测试里会提到的

测试环境

这里我们使用vulnhub去测试

首先访问靶机

在这里插入图片描述

一般存在注入的地方发生在数据查询处,查看4个功能点功能,AddUser 为添加用户,list 为列举用户,getuser 为获取用户,delete 为删除用户,这里最有可能存在漏洞处为获取用户信息处

点击查看它的消息布局

在这里插入图片描述

发现username处为string 此处传入为字符串,可能存在注入

也可以通过查看它的wsdl去分析,去看soap消息及如何使用这些消息
找到getuser处
在这里插入图片描述

查看此处的GetUser元素,此处元素为内部创建的子元素,这里子元素名称为username,类型为字符串类型

往下看,查找它的operation,也就是它的操作活动
在这里插入图片描述

找到GetUserHttpGetIn 这个可以看作是 Get User Http Get In 为获取用户的输入

以此为突破口进行测试

这个靶场的数据库为PostgreSQL 数据库,那么要用 PostgreSQL注入来做

首先测试下是否有注入
输入 ‘ or 1=1 — qwe

在这里插入图片描述

得到结果

再输入 ‘ or 1=2 — qwe

在这里插入图片描述

可以说明此处存在注入
这里我们用联合查询的方式去操作,PostgreSQL的联合查询和mysql的十分相似

先用order by去判断字段数,到order by 3时报错

在这里插入图片描述

可以看到,此处3个字段超过了,这里为两个字段

接下来查询数据
首先判断显错位

admin’ union select aaa,aaa — qwe

结果报错
在这里插入图片描述

因为这里必须是以字符串传入,所以换 admin’ union select ‘aaa’,’aaa’ — qwe 语句去尝试下

在这里插入图片描述

两处都为显错位

那么填入我们要查询的数据试下,先查看当前数据库

aaa’ union select current_database(),’ccc’ — qwe

在这里插入图片描述

得到当前库名为 vulnerable

由于postgresql数据库和用户相关,所以要先去查看当前用户名以及了解当前用户的权限
语句
aaa’ union select current_user,’ccc’ — qwe
得到结果
在这里插入图片描述

用户名为postgres
postgres用户为PostgreSQL数据库的默认用户名,有足够权限去查询其他的库和表

再找表名
aaaa’ union select table_name,’ccc’ from information_schema.tables limit 1 offset 17 — qwe

在这里插入图片描述

新版本的PostgreSQL数据库的查询方法和mysql的差不多,都有information_schema 去辅助查询,当然还有其他方法也可以查找,比如利用postgresql数据库的统计收集器pg_stat_database去查询

PostgreSQL数据库里的limit语法和mysql的不同,用法为 limit 1 offset 0
limit 1为列出一条数据, offset 0 为从第0位开始

得到表名user

再查找字段名
bbb’ union select column_name,’ccc’ from information_schema.columns where table_name=’users’ limit 1 offset 0 — qwe

得到第一个字段名为password
在这里插入图片描述

查找其他字段
bbb’ union select column_name,’ccc’ from information_schema.columns where table_name=’users’ limit 1 offset 1 — qwe

在这里插入图片描述

得到第二个用户名的字段

查找数据
bbb’ union select username,password from users limit 1 offset 1 — qwe

得到结果
在这里插入图片描述

SOAP SQL注入查找(初级)

通常而言通过搜索特定后缀去找webservice地址,比如通过在fofa搜索 asmx,asmx是webservice服务程序的后缀名,asp.net 使用 asmx 来进行对webservice的支持,通过fofa上搜索找目标,或者可以使用google语法搜索,inurl:asmx?wsdl,inurl:.php?wsdl inurl:.ashx?wsdl通过去查找webservice的服务描述的xml文档来找寻可能的注入点

SOAP SQL注入查找(进阶)

因为wsdl内的信息过于繁杂,可以借助辅助工具来对wsdl进行分析,常用的有soapui,或者用burp的wsdler模块,都可以分析wsdl来得到

soapui使用
在这里插入图片描述

点击file,选择create new project,填入地址

在这里插入图片描述

然后就可以对wsdl地址进行解析

在这里插入图片描述

burp的wsdler
抓取访问wsdl的数据包,然后右键,选择parse wsdl

在这里插入图片描述
在这里插入图片描述

得到分析结果,这里可以结合sqlmap使用,把抓到的包保存为txt文件,然后sqlmap去测试

参考连接

http://emonsec.com/web/51995.html
http://ccg-lenovo.com/2020/03/27/SOAP%E6%B3%A8%E5%85%A5/
https://blog.csdn.net/niexinming/article/details/49491643
https://resources.infosecinstitute.com/topic/soap-attack-2/
https://skysec.top/2018/08/17/SOAP%E5%8F%8A%E7%9B%B8%E5%85%B3%E6%BC%8F%E6%B4%9E%E7%A0%94%E7%A9%B6/
https://www.xffbk.cn/archives/23.html
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Java 提供的 Handler 机制可以在客户端对 SOAP 请求包注入 Header。以下是一个示例代码: ```java // 创建一个 SOAP 消息处理程序 public class MySOAPHandler implements SOAPHandler<SOAPMessageContext> { @Override public boolean handleMessage(SOAPMessageContext context) { // 获取是否为请求消息 Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (isRequest) { try { // 获取 SOAP 消息 SOAPMessage soapMsg = context.getMessage(); // 获取 SOAP 头部 SOAPHeader header = soapMsg.getSOAPHeader(); if (header == null) { header = soapMsg.getSOAPPart().getEnvelope().addHeader(); } // 创建一个 SOAP 头部元素 QName qname = new QName("http://example.com", "MyHeader", "my"); SOAPHeaderElement headerElement = header.addHeaderElement(qname); // 设置 SOAP 头部元素的值 headerElement.setValue("MyHeaderValue"); } catch (SOAPException e) { // 异常处理 } } return true; } // 其他方法省略 } ``` 然后,在客户端调用 Web 服务时,将该处理程序添加到 Handler 链中: ```java // 创建一个服务 URL wsdlUrl = new URL("http://example.com/MyService?wsdl"); QName serviceName = new QName("http://example.com", "MyService"); Service service = Service.create(wsdlUrl, serviceName); // 获取服务端点 QName portName = new QName("http://example.com", "MyPort"); MyPortType port = service.getPort(portName, MyPortType.class); // 创建一个处理程序链 BindingProvider bp = (BindingProvider) port; List<Handler> handlerChain = bp.getBinding().getHandlerChain(); handlerChain.add(new MySOAPHandler()); bp.getBinding().setHandlerChain(handlerChain); // 调用 Web 服务 port.myMethod(); ``` 这样,在客户端调用 Web 服务时,SOAP 请求包就会自动添加一个名为 MyHeader 的 Header 元素,值为 MyHeaderValue。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值