01SSRF概念
服務端請求偽造(Server-Side Request Forgery),指的是攻擊者在未能取得服務器所有權限時,利用服務器漏洞以服務器的身份發送一條構造好的請求給服務器所在內網。SSRF攻擊通常針對外部網絡無法直接訪問的內部系統。
02SSRF的原理
很多web應用都提供了從其他的服務器上獲取數據的功能。使用指定的URL,web應用便可以獲取圖片,下載文件,讀取文件內容等。SSRF的實質是利用存在缺陷的web應用作為代理攻擊遠程和本地的服務器。一般情況下, SSRF攻擊的目標是外網無法訪問的內部系統,黑客可以利用SSRF漏洞獲取內部系統的一些信息(正是因為它是由服務端發起的,所以它能夠請求到與它相連而與外網隔離的內部系統)。SSRF形成的原因大都是由于服務端提供了從其他服務器應用獲取數據的功能且沒有對目標地址做過濾與限制。
03SSRF的主要攻擊方式
攻擊者想要訪問主機B上的服務,但是由于存在防火墻或者主機B是屬于內網主機等原因導致攻擊者無法直接訪問主機B。而服務器A存在SSRF漏洞,這時攻擊者可以借助服務器A來發起SSRF攻擊,通過服務器A向主機B發起請求,從而獲取主機B的一些信息。
04SSRF的危害
1.內外網的端口和服務掃描
2.攻擊運行在內網或本地的應用程序
3.對內網web應用進行指紋識別,識別企業內部的資產信息
4.攻擊內網的web應用,主要是使用GET參數就可以實現的攻擊(比如Struts2漏洞利用,SQL注入等)
5.利用file協議讀取本地敏感數據文件等
05SSRF漏洞復現
1.探測內部主機的任意端口
①利用vulhub進行漏洞復現,SSRF漏洞存在于http://your-ip:7001/uddiexplorer/SearchPublicRegistries.jsp
②提交參數值為url:port,根據返回錯誤不同,可對內網狀態進行探測如端口開放狀態等。
在brupsuite下測試該漏洞。訪問一個可以訪問的IP:PORT,如http://127.0.0.1:7001。根據返回錯誤不同,可對內網狀態進行探測如端口開放狀態等。
③當我們訪問一個不存在的端口時,比如 http://127.0.0.1:7000,將會返回:could not connect over HTTP to server
④當我們訪問存在的端口時,比如 http://127.0.0.1:7001。可訪問的端口將會得到錯誤,一般是返回status code(如下圖),如果訪問的非http協議,則會返回:did not have a valid SOAP content-type
2.利用ssrf獲取內網敏感文件信息
①在服務器上有一個ssrf.php的頁面,該頁面的功能是獲取URL參數,然后將URL的內容顯示到網頁頁面上。
②我們訪問該鏈接:http://127.0.0.1/ssrf.php?url=http://127.0.0.1/test.php ,它會將test.php頁面顯示
③如果我們把url的參數換成 http://www.baidu.com ,頁面則會返回百度的頁面
④于是我們可以將URL參數換成內網的地址,則會泄露服務器內網的信息。將URL換成file://的形式,就可以讀取本地文件。
06防御方式
1、過濾返回的信息,如果web應用是去獲取某一種類型的文件。那么在把返回結果展示給用戶之前先驗證返回的信息是否符合標準。
2、統一錯誤信息,避免用戶可以根據錯誤信息來判斷遠程服務器的端口狀態。
3、限制請求的端口,比如80,443,8080,8090。
4、禁止不常用的協議,僅僅允許http和https請求。可以防止類似于file:///,gopher://,ftp://等引起的問題。
5、使用DNS緩存或者Host白名單的方式。