自我认为挺全面的【Web Service渗透测试总结】
一、Web Service基礎(chǔ)
Web Service簡介
Web Service是一個(gè)平臺(tái)獨(dú)立的、低耦合的、自包含的、基于可編程的Web的應(yīng)用程序,可使用開放的XML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個(gè)子集)標(biāo)準(zhǔn)來描述、發(fā)布、發(fā)現(xiàn)、協(xié)調(diào)和配置這些應(yīng)用程序,用于開發(fā)分布式的交互操作的應(yīng)用程序。
Web Service技術(shù), 能使得運(yùn)行在不同機(jī)器上的不同應(yīng)用無須借助附加的、專門的第三方軟件或硬件, 就可相互交換數(shù)據(jù)或集成。依據(jù)Web Service規(guī)范實(shí)施的應(yīng)用之間, 無論它們所使用的語言、 平臺(tái)或內(nèi)部協(xié)議是什么, 都可以相互交換數(shù)據(jù)。Web Service是自描述、 自包含的可用網(wǎng)絡(luò)模塊, 可以執(zhí)行具體的業(yè)務(wù)功能。Web Service也很容易部署, 因?yàn)樗鼈兓谝恍┏R?guī)的產(chǎn)業(yè)標(biāo)準(zhǔn)以及已有的一些技術(shù),諸如標(biāo)準(zhǔn)通用標(biāo)記語言下的子集XML、HTTP。Web Service減少了應(yīng)用接口的花費(fèi)。Web Service為整個(gè)企業(yè)甚至多個(gè)組織之間的業(yè)務(wù)流程的集成提供了一個(gè)通用機(jī)制。
Web Service的本質(zhì),就是通過網(wǎng)絡(luò)調(diào)用其他網(wǎng)站的資源。Web Service架構(gòu)的基本思想,就是盡量把非核心功能交給其他人去做,自己全力開發(fā)核心功能。
更簡單地說,Web Service是一種跨編程語言、跨操作系統(tǒng)平臺(tái)的遠(yuǎn)程調(diào)用技術(shù)。
Web Service基本原理
Web Service通過HTTP協(xié)議發(fā)送請(qǐng)求和接收結(jié)果時(shí),發(fā)送的請(qǐng)求內(nèi)容和結(jié)果內(nèi)容都采用XML格式封裝,并增加了一些特定的HTTP消息頭,以說明HTTP消息的內(nèi)容格式,這些特定的HTTP消息頭和XML內(nèi)容格式就是SOAP協(xié)議規(guī)定的。
Web Service服務(wù)器端首先要通過一個(gè)WSDL文件來說明自己有什么服務(wù)可以對(duì)外調(diào)用。WSDL就像是一個(gè)說明書,用于描述Web Service及其方法、參數(shù)和返回值。WSDL文件保存在Web服務(wù)器上,通過一個(gè)URL地址就可以訪問到它。客戶端要調(diào)用一個(gè)Web Service服務(wù)之前,要知道該服務(wù)的WSDL文件的地址。Web Service服務(wù)提供商可以通過兩種方式來暴露它的WSDL文件地址:1.注冊(cè)到UDDI服務(wù)器,以便被人查找;2.直接告訴給客戶端調(diào)用者。
Web Service交互的過程就是,Web Service遵循SOAP協(xié)議通過XML封裝數(shù)據(jù),然后由HTTP協(xié)議來傳輸數(shù)據(jù)。
【技術(shù)干貨文檔】
Web Service分類
一般的,Web Service分為:
- SOAP型Web Service:SOAP型Web Service允許使用XML格式與服務(wù)器進(jìn)行通信;
- REST型Web Service:REST型Web Service允許使用JSON格式(也可以使用XML格式)與服務(wù)器進(jìn)行通信。與HTTP類似,該類型服務(wù)支持GET、POST、PUT、DELETE方法。不需要WSDL、UDDI;
Web Service三要素
Web Service三要素包括SOAP(Simple Object Access Protocol)、WSDL(WebServicesDescriptionLanguage)、UDDI(UniversalDescriptionDiscovery andIntegration)。其中SOAP用來描述傳遞信息的格式, WSDL用來描述如何訪問具體的接口, UDDI用來管理、分發(fā)、查詢Web Service 。
Web Service相關(guān)技術(shù)
SOAP
SOAP(Simple Object Access Protocol)簡單對(duì)象訪問協(xié)議是交換數(shù)據(jù)的一種協(xié)議規(guī)范,是一種輕量的、簡單的、基于XML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個(gè)子集)的協(xié)議,它被設(shè)計(jì)成在WEB上交換結(jié)構(gòu)化的和固化的信息。SOAP不是Web Service的專有協(xié)議。
SOAP使用HTTP來發(fā)送XML格式的數(shù)據(jù),可以簡單理解為:SOAP = HTTP +XML
SOAP結(jié)構(gòu)如圖:
包括以下元素:
- 必需的 Envelope 元素,可把此 XML 文檔標(biāo)識(shí)為一條 SOAP 消息
- 可選的 Header 元素,包含頭部信息
- 必需的 Body 元素,包含所有的調(diào)用和響應(yīng)信息
- 可選的 Fault 元素,提供有關(guān)在處理此消息所發(fā)生錯(cuò)誤的信息
REST
REST(Representational State Transfer)即表述性狀態(tài)傳遞,是Roy Fielding博士在2000年他的博士論文中提出來的一種軟件架構(gòu)風(fēng)格。它是一種針對(duì)網(wǎng)絡(luò)應(yīng)用的設(shè)計(jì)和開發(fā)方式,可以降低開發(fā)的復(fù)雜性,提高系統(tǒng)的可伸縮性。
REST是一組架構(gòu)約束條件和原則。滿足這些約束條件和原則的應(yīng)用程序或設(shè)計(jì)就是RESTful。需要注意的是,REST是設(shè)計(jì)風(fēng)格而不是標(biāo)準(zhǔn)。REST通常基于使用HTTP,URI,和XML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個(gè)子集)以及HTML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個(gè)應(yīng)用)這些現(xiàn)有的廣泛流行的協(xié)議和標(biāo)準(zhǔn)。
在三種主流的Web服務(wù)實(shí)現(xiàn)方案中,因?yàn)镽EST模式的Web服務(wù)與復(fù)雜的SOAP和XML-RPC對(duì)比來講明顯的更加簡潔,越來越多的Web服務(wù)開始采用REST風(fēng)格設(shè)計(jì)和實(shí)現(xiàn)。例如,Amazon.com提供接近REST風(fēng)格的Web服務(wù)進(jìn)行圖書查找;雅虎提供的Web服務(wù)也是REST風(fēng)格的。
WSDL
WSDL(Web Services Description Language)即網(wǎng)絡(luò)服務(wù)描述語言,用于描述Web服務(wù)的公共接口。這是一個(gè)基于XML的關(guān)于如何與Web服務(wù)通訊和使用的服務(wù)描述;也就是描述與目錄中列出的Web服務(wù)進(jìn)行交互時(shí)需要綁定的協(xié)議和信息格式。通常采用抽象語言描述該服務(wù)支持的操作和信息,使用的時(shí)候再將實(shí)際的網(wǎng)絡(luò)協(xié)議和信息格式綁定給該服務(wù)。
WSDL給出了SOAP型Web Service的基本定義,WSDL基于XML語言,描述了與服務(wù)交互的基本元素,說明服務(wù)端接口、方法、參數(shù)和返回值,WSDL是隨服務(wù)發(fā)布成功,自動(dòng)生成,無需編寫。少數(shù)情況下,WSDL也可以用來描述REST型Web Service。SOAP也是基于XML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個(gè)子集)和XSD的,XML是SOAP的數(shù)據(jù)編碼方式。
WADL
WADL(Web Application Description Language)即Web應(yīng)用程序描述語言,是一個(gè)可用計(jì)算機(jī)處理的表達(dá)基于HTTP的Web應(yīng)用(如RESTWeb服務(wù))的XML詞匯。WADL描述了Web服務(wù)提供的資源及他們的聯(lián)系。WADL試圖簡化重用基于HTTP架構(gòu)的Web服務(wù)。它是一個(gè)平臺(tái),且與語言無關(guān),并試圖推動(dòng)除Web瀏覽器的基本使用外的應(yīng)用重用。
WADL于2009年8月31日由Sun微系統(tǒng)提交至萬維網(wǎng)聯(lián)盟,但聯(lián)盟目前沒有標(biāo)準(zhǔn)化它的計(jì)劃并且它并沒有被廣泛地支持。WADL依照描述基于SOAP的RPC式服務(wù)的XML詞匯WSDL定義,用于描述REST服務(wù),而WSDL也可用于描述RESTWeb服務(wù)。
WADL主要用于REST基礎(chǔ)。
WADL與WSDL的區(qū)別:
- WSDL是面向接口的描述,WADL是面向資源的描述;
- WADL是基于HTTP的,WSDL 2.0是接口獨(dú)立的;
UDDI
UDDI(Universal Description Discovery and Integration)即統(tǒng)一描述、發(fā)現(xiàn)和集成,是一種用于描述、發(fā)現(xiàn)、集成Web Service的技術(shù),它是Web Service協(xié)議棧的一個(gè)重要部分。通過UDDI,企業(yè)可以根據(jù)自己的需要?jiǎng)討B(tài)查找并使用Web服務(wù),也可以將自己的Web服務(wù)動(dòng)態(tài)地發(fā)布到UDDI注冊(cè)中心,供其他用戶使用。
UDDI是核心的Web服務(wù)標(biāo)準(zhǔn)之一。它通過SOAP進(jìn)行消息傳輸,用Web服務(wù)描述語言描述Web服務(wù)及其接口使用。
SOAP型Web Service服務(wù)架構(gòu)
如圖,Web Service服務(wù)提供方將自己的Web服務(wù)通過SOAP動(dòng)態(tài)地發(fā)布到UDDI注冊(cè)中心,其中是以WSDL文件來進(jìn)行描述,Web Service服務(wù)消費(fèi)方先向UDDI注冊(cè)中心通過SOAP請(qǐng)求WSDL文件回來解析服務(wù)提供方提供哪些方法后,再和提供方建立XML格式的HTTP通信:
WSDL文檔結(jié)構(gòu)
WSDL文檔結(jié)構(gòu)如下,以本地WSDL文檔為例,:
標(biāo)簽說明:
- definitions:所有WSDL文檔的根元素都是definitions元素;
- types:數(shù)據(jù)類型(標(biāo)簽)定義的容器,里面使用schema定義了一些標(biāo)簽結(jié)構(gòu)供message引用 ;
- message:通信消息的數(shù)據(jù)結(jié)構(gòu)的抽象類型化定義。引用types中定義的標(biāo)簽;
- operation:對(duì)服務(wù)中所支持的操作的抽象描述,一個(gè)operation描述了一個(gè)訪問入口的請(qǐng)求消息與響應(yīng)消息對(duì);
- portType:對(duì)于某個(gè)訪問入口點(diǎn)類型所支持的操作的抽象集合,這些操作可以由一個(gè)或多個(gè)服務(wù)訪問點(diǎn)來支持;
- binding:特定端口類型的具體協(xié)議和數(shù)據(jù)格式規(guī)范的綁定;
- service:相關(guān)服務(wù)訪問點(diǎn)的集合
- port:定義為協(xié)議/數(shù)據(jù)格式綁定與具體Web訪問地址組合的單個(gè)服務(wù)訪問點(diǎn);
那么我們一般如何閱讀WSDL文件呢?——WSDL文檔都是從下往上閱讀的。
先看最底下的service標(biāo)簽,查看其中port標(biāo)簽的binding屬性值,然后通過值查找上面的binding標(biāo)簽:
通過binding標(biāo)簽可以獲得具體協(xié)議等信息,然后查看binding的type屬性:
通過binding的type屬性,查找對(duì)應(yīng)的portType,可以獲得可操作的方法和參數(shù)、返回值等:
通過portType下的operation標(biāo)簽的message屬性,可以向上查找message獲取具體的數(shù)據(jù)參數(shù):
二、編寫Web Service程序
簡單看下各語言怎么編寫Web Service程序。
Java版
編寫接口類ICalculator,其中聲明兩個(gè)方法,注意接口要用@WebService修飾:
編寫接口實(shí)現(xiàn)類CalculatorImpl,其中重寫實(shí)現(xiàn)兩個(gè)方法,在@WebService修飾中指定端點(diǎn)接口為com.mi1k7ea.ICalculator且服務(wù)名為Calcutator:
package com.mi1k7ea; import javax.jws.WebService; @WebService(endpointInterface = "com.mi1k7ea.ICalculator", serviceName = "Calcutator")public class CalculatorImpl implements ICalculator { @Override public int add(int a, int b) { return a + b; }@Override public String concat(String a, String b) { return a + b; }}編寫Web Service服務(wù)端,通過Endpoint.publish()函數(shù)來發(fā)布指定地址上的Web Service服務(wù):
import com.mi1k7ea.CalculatorImpl; import javax.xml.ws.Endpoint; public class WebService { public static void main(String[] args) { System.out.println("[*]Start Web Service..."); CalculatorImpl calculator = new CalculatorImpl();String address = "http://127.0.0.1:8081/calculator"; Endpoint.publish(address, calculator);System.out.println("[*]Web Service is working..."); }}運(yùn)行服務(wù)即可訪問:
三、搜索Web Service服務(wù)
Google Hack
filetype:asmx inurl:(_vti_bin | api | webservice | ws )allinurl:dll?wsdl filetype:dll inurl:jws?wsdlinurl:asmx?wsdlinurl:aspx?wsdlinurl:ascx?wsdlinurl:ashx?wsdlinurl:dll?wsdlinurl:exe?wsdlinurl:php?wsdlinurl:pl?wsdlinurl:?wsdlfiletype:jwsfiletype:asmxfiletype:ascxfiletype:aspxfiletype:ashxfiletype:dllfiletype:exefiletype:phpfiletype:plfiletype:wsdl通過代理流量篩選
可以在如BurpSuite這種代理工具中設(shè)定的過濾規(guī)則來篩選Web Service請(qǐng)求。比如“.dll?wsdl”、“.ashx?wsdl”、“.exe?wsdl”、“.php?wsdl”等。
四、針對(duì)Web Service的滲透測試
Web Service服務(wù)也是一些包裝過的接口而已,針對(duì)Web Service服務(wù)的滲透測試和對(duì)常規(guī)API滲透測試是一樣的、只是,可以使用安全工具來輔助進(jìn)行,包括但不限于如下的工具:
- WebScarap
- SoapUI
- WCFStorm
- SOA Cleaner
- WSDigger
- wsScanner
- Wfuzz
- RESTClient
- BurpSuite
- WS-Attacker
- ZAP
- Metasploit
- WSDL Analyze
這里主要講下如何使用BurpSuite和ReadAPI/SoapUI這兩個(gè)工具來對(duì)Web Service服務(wù)進(jìn)行滲透服務(wù)。
ReadyAPI+BurpSuite
網(wǎng)上的資料都是說的用SoapUI NG Pro+BurpSuite組合進(jìn)行Web Service的滲透測試,但是現(xiàn)在SoapUI NG Pro試用版的下載已經(jīng)更名為ReadyAPI了。
下載地址:https://smartbear.com/product/ready-api/api-functional-testing/free-trial/
整個(gè)過程如圖:
其實(shí)就是SoapUI NG Pro作為Web Service的測試工具,Burp作為代理、監(jiān)聽SoapUI NG Pro用自己構(gòu)造的payload報(bào)文打Web Service的流量報(bào)文,其中可以篡改對(duì)應(yīng)的報(bào)文參數(shù)實(shí)現(xiàn)滲透測試。
這里本地以ReadyAPI為例。
先設(shè)置Burp代理,在File->Preferences->Proxy中設(shè)置Burp代理服務(wù)器地址:
然后新建安全測試任務(wù),選擇WSDL相關(guān)的API模塊定義:
填寫目標(biāo)Web Service的WSDL地址,這里以前面編寫的Demo為例:
點(diǎn)擊Next,當(dāng)WSDL解析完成后,會(huì)自動(dòng)生成一系列的安全測試用例,默認(rèn)都選上安全測試用例,點(diǎn)擊Finish,然后運(yùn)行測試用例:
掃描完成之后會(huì)給出掃描總結(jié)報(bào)告、還提供PDF版詳細(xì)報(bào)告供查閱:
此時(shí)Burp中已經(jīng)監(jiān)聽到了大量ReadAPI安全測試用例的報(bào)文,只需要將對(duì)應(yīng)的報(bào)文放到Repeater中修改參數(shù)值繼續(xù)進(jìn)行滲透測試或者發(fā)到Intruder中進(jìn)行Fuzzing即可:
后面就是針對(duì)常見API接口安全的滲透測試了,套路都是一樣的。
SoapUI+BurpSuite
當(dāng)使用沒有安全測試用例掃描功能的SoapUI時(shí),也可以用來生成對(duì)應(yīng)格式的報(bào)文給Burp進(jìn)行手工滲透測試。
這里以SoapUI Pro為例,前面的設(shè)置操作都是和ReadyAPI一樣,只是沒有了安全測試用例掃描功能而已。
設(shè)置好Burp代理,新建SOAP項(xiàng)目,填入WSDL地址完成解析后會(huì)顯示如下圖左邊所有的Web Service服務(wù)和方法,其中可以單個(gè)填入?yún)?shù)值發(fā)送對(duì)應(yīng)的請(qǐng)求報(bào)文并獲取結(jié)果回顯到界面中:
這里Burp監(jiān)聽到該報(bào)文,只需要修改參數(shù)值,而無須構(gòu)造XML格式:
后面就是針對(duì)常見API接口安全的滲透測試了,套路都是一樣的。
BurpSuite插件之Wslder
Wslder是BurpSuite,其在Extender的BApp Store中可以直接下載安裝。雖然比前面的方法簡便,但是有時(shí)候生成的請(qǐng)求會(huì)存在問題導(dǎo)致無法成功發(fā)包,此時(shí)就需要用到前面的方法了。
安裝成功后,在Requests中右鍵選中Parse WSDL就能直接用了:
解析WSDL完成之后,在Wsdler欄可以看到解析出來對(duì)應(yīng)的Web Service服務(wù)和方法以及對(duì)應(yīng)的請(qǐng)求參數(shù)樣例等,直接修改對(duì)應(yīng)的參數(shù)值即可進(jìn)行滲透測試:
五、?Web Service漏洞案例
SOAP型Web Service漏洞和Web漏洞并沒有區(qū)別,只是請(qǐng)求的payload構(gòu)造需要滿足一些格式要求而已,具體還是要看Web Service服務(wù)端代碼是怎么寫的。比如命令注入、SQL注入、XSS、XXE、XPath注入、DoS、邏輯漏洞、信息泄露…等等。
這里以DVWS靶場為例演示幾個(gè)SOAP類型Web Service請(qǐng)求的漏洞利用。
私信回復(fù)“資料”零取
1.200多本網(wǎng)絡(luò)安全系列電子書
2.網(wǎng)絡(luò)安全標(biāo)準(zhǔn)題庫資料
3.項(xiàng)目源碼
4.網(wǎng)絡(luò)安全基礎(chǔ)入門、Linux、web安全、攻防方面的教學(xué)視頻
5.網(wǎng)絡(luò)安全學(xué)習(xí)路線大綱結(jié)構(gòu)圖
XSS
換SOAP請(qǐng)求攻擊時(shí),注意點(diǎn)就是在SOAP中XSS payload的尖括號(hào)要進(jìn)行HTML編碼,不然會(huì)造成SOAP標(biāo)簽解析錯(cuò)誤從而報(bào)錯(cuò):
此外,一般Web Service服務(wù)站點(diǎn)也是支持上傳XML文件的,這里就可以使用xhtml來觸發(fā)XML XSS:
XXE
回顯型XXE,注意exp的XML內(nèi)容要寫在SOAP的前面才能正常解析利用:
任意用戶枚舉
就是常規(guī)的API邏輯漏洞而已,利用響應(yīng)結(jié)果二元組來推斷:
express-fileupload原型鏈污染攻擊
有意思的是,這里有個(gè)express-fileupload < 1.1.10版本的原型鏈污染漏洞,可導(dǎo)致DoS(某些情況下可導(dǎo)致任意代碼執(zhí)行):
DoS
Web Service服務(wù)的交互很多都是用的XML格式數(shù)據(jù)。請(qǐng)求中的XML數(shù)據(jù)會(huì)由服務(wù)端的XML解析器進(jìn)行解析和處理。
目前主要有兩類XML解析器:
- 基于SAX(Simple API for XML)的XML解析器:內(nèi)存中最多容納2個(gè)元素。在這種情況下,基于SAX的解析器不會(huì)存在DoS問題;
- 基于DOM(Document Object Model)的XML解析器:會(huì)一次性讀取客戶端存儲(chǔ)的所有XML數(shù)據(jù),因此會(huì)導(dǎo)致內(nèi)存中存在龐大的對(duì)象數(shù)據(jù)從而導(dǎo)致存在DoS問題。漏洞根源在于沒有檢查XML中節(jié)點(diǎn)的大小和數(shù)量;
針對(duì)元素名稱的DoS攻擊的示例:
<soapenv:Envelope?xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">? <soapenv:Header/> <soapenv:Body> <TEST> <BGABGABGABGABGABGABGABGABGABGABGABGABGABGABGABGA………BGABGABGABGABGABGABGABGABGABGA> </TEST> </soapenv:Body> </soapenv:Envelope>針對(duì)元素屬性的DoS攻擊的示例:
<soapenv:Envelope?xmlns:soapenv="? <soapenv:Header/> <soapenv:Body> <TEST> <BGA?attribute=”BGABGABGABGABGABGABGABGABGABGABGABGABGABGABGABGA………BGABGABGABGABGABGABGABGABGABGA”></BGA> </TEST> </soapenv:Body> </soapenv:Envelope>針對(duì)元素個(gè)數(shù)的DoS攻擊的示例(也可以通過重復(fù)某個(gè)特定元素達(dá)到同樣效果):
<soapenv:Envelope?xmlns:soapenv="? <soapenv:Header/> <soapenv:Body> <TEST> <BGA?attribute1=”BGABGABGABGABGABGABGABGABGABGABGABGABGABGABGABGA...BGABGABGABGABGABGABGABGABGABGA”?attribute2=”BGABGABGABGABGABGABGABGABGABGABGABGABGABGABGABGA...BGABGABGABGABGABGABGABGABGABGA”?attribute3=”BGABGABGABGABGABGABGABGABGABGABGABGABGABGABGABGA...BGABGABGABGABGABGABGABGABGABGA”></BGA> </TEST> </soapenv:Body> </soapenv:Envelope>當(dāng)然,存在XXE時(shí),就可以進(jìn)行XXE DoS攻擊:
<?xml?version="1.0"?encoding="ISO-8859-1"?> <!DOCTYPE?bga?[ <!ELEMENT?ANY?><!ENTITY?bga1?"bga1"> <!ENTITY?bga2?"&bga1;&bga1;&bga1;&bga1;&bga1;&bga1;"> <!ENTITY?bga3?"&bga2;&bga2;&bga2;&bga2;&bga2;&bga2;"> <!ENTITY?bga4?"&bga3;&bga3;&bga3;&bga3;&bga3;&bga3;"> <!ENTITY?bga5?"&bga4;&bga4;&bga4;&bga4;&bga4;&bga4;"> <!ENTITY?bga6?"&bga5;&bga5;&bga5;&bga5;&bga5;&bga5;"> ]> <bga>&bga6;</bga>總結(jié)
以上是生活随笔為你收集整理的自我认为挺全面的【Web Service渗透测试总结】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CTF中PHP相关题目考点总结(二)
- 下一篇: 【网络安全】一次应急实战经验思路分享