0x00原理
一般的請求:客戶端發起請求,服務器響應。
另外一種請求:客戶端發起請求(向服務端提供一個URL),服務端向客戶端提供的URL發起請求,然后把獲得的響應內容返回給客戶端。如:
服務端提供了從其他服務器應用獲取數據的功能且沒有對目標地址做過濾與限制。比如從指定URL地址獲取網頁文本內容,加載指定地址的圖片,下載等等,就可能存在這種服務端請求偽造的缺陷。Google,Facebook,Adobe,baidu,tencent等知名公司都被發現過這種漏洞。
0x01危害
攻擊者利用ssrf可以實現的攻擊主要有5種:
1.可以對外網、服務器所在內網、本地進行端口掃描,獲取一些服務的banner信息;
2.攻擊運行在內網或本地的應用程序(比如溢出);
3.對內網web應用進行指紋識別,通過訪問默認文件實現;
4.攻擊內外網的web應用,主要是使用get參數就可以實現的攻擊(比如struts2,sqli等);
5.利用file協議讀取本地文件等。
常用的利用思路:
內網探測->應用識別->攻擊Payload->Payload Result
1.內網探測: 內網主機信息收集
2.應用識別: 主機應用識別(可以通過Barner和應用指紋進行識別)
3.攻擊Payload: 根據應用識別的應用,加載不同的攻擊Payload(最常用莫屬于Struts2)
4.Payload Result: 返回相應Payload的執行信息
為什么通過http協議訪問可以同其它協議的端口進行數據交互呢?
跨協議通信技術利用:http://www.freebuf.com/articles/web/19622.html
0x02漏洞挖掘
一切從客戶端提交的含有URL的參數都可能存在SSRF漏洞。
常見存在漏洞的場景如下:
1、分享功能:通過URL地址分享網頁內容。
2、在線轉碼服務:把網頁內容(URL)在線轉碼為適合手機瀏覽的樣式。
3、在線翻譯:通過URL地址翻譯對應文本內容。
4、遠程圖片加載、下載:通過URL加載圖片或者下載圖片。如:http://www.example.com/picture?url=http://image.example.com/1.jpg
5、圖片、文章收藏功能:類似于場景1,通過URL收藏到在線收藏夾
6、未公開的api實現以及其他調用URL的功能:此處類似的功能有360提供的網站評分,以及有些網站通過api獲取遠程地址xml文件來加載內容。
常見的存在漏洞的參數:
share、wap、url、link、、src、source、target、u、3g、display、sourceURl、imageURL、domain...
可以結合google語法及上述關鍵字進行搜索驗證。
常見的容易出問題的函數:
PHP : file_get_contents()、fsockopen()、curl_exec()
JAVA : Request類,URL類的openStream,HttpClient類,URLConnection和HttpURLConnection類
漏洞驗證
1、排除法
確認目標參數中的URL請求是從客戶端發起還是從服務端發起的。
如:http://www.douban.com/***/service?image=http://www.baidu.com/img/bd_logo1.png
排除法一:
你可以直接右鍵圖片,在新窗口打開圖片,如果是瀏覽器上URL地址欄是http://www.baidu.com/img/bd_logo1.png,說明不存在SSRF漏洞。
排除法二:
你可以使用burpsuite等抓包工具來判斷是否不是SSRF,首先SSRF是由服務端發起的請求,因此在加載圖片的時候,是由服務端發起的,所以在我們本地瀏覽器的請求中就不應該存在圖片的請求,在此例子中,如果刷新當前頁面,有如下請求,則可判斷不是SSRF。(前提設置burpsuite截斷圖片的請求,默認是放行的)
2、實例驗證
首先要進行信息收集,以獲得目標內網地址,收集途徑:
a.敏感信息泄露
b.漏洞平臺歷史信息中存在目標內網信息
c.通過二級域名等暴力猜解工具模糊猜測內網地址
收集到內網地址后,就可以進行實例驗證,是否可以請求內網地址、端口、資源等。
批量驗證某個ip地址段端口開放情況可以用burp的爆破功能或者自己寫py腳本。
0x03繞過方法
下文出現的192.168.0.1,10.0.0.1全部為服務器端的內網地址。
1、更改IP地址寫法
一些開發者會通過對傳過來的URL參數進行正則匹配的方式來過濾掉內網IP,如采用如下正則表達式:
^10(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){3}$
^172\.([1][6-9]|[2]\d|3[01])(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$
^192\.168(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$
對于這種過濾我們可以采用改編IP的寫法的方式進行繞過,例如192.168.0.1這個IP地址我們可以改寫成:
(1)、8進制格式:0300.0250.0.1
(2)、16進制格式:0xC0.0xA8.0.1
(3)、10進制整數格式:3232235521
(4)、16進制整數格式:0xC0A80001
還有一種特殊的省略模式,例如10.0.0.1這個IP可以寫成10.1
2、利用解析URL所出現的問題
在某些情況下,后端程序可能會對訪問的URL進行解析,對解析出來的host地址進行過濾。這時候可能會出現對URL參數解析不當,導致可以繞過過濾。
http://www.baidu.com@192.168.0.1/
當后端程序通過不正確的正則表達式(比如將http之后到com為止的字符內容,也就是www.baidu.com,認為是訪問請求的host地址時)對上述URL的內容進行解析的時候,很有可能會認為訪問URL的host為www.baidu.com,而實際上這個URL所請求的內容都是192.168.0.1上的內容。
3、利用302跳轉
如果后端服務器在接收到參數后,正確的解析了URL的host,并且進行了過濾,我們這個時候可以使用302跳轉的方式來進行繞過。
(1)、在網絡上存在一個很神奇的服務,http://xip.io當我們訪問這個網站的子域名的時候,例如192.168.0.1.xip.io,就會自動重定向到192.168.0.1。
(2)、由于上述方法中包含了192.168.0.1這種內網IP地址,可能會被正則表達式過濾掉,我們可以通過短地址的方式來繞過。經過測試發現新浪,百度的短地址服務并不支持IP模式,所以這里使用的是http://tinyurl.com所提供的短地址服務,如下圖所示:
同樣的,我們也可以自行寫一個跳轉的服務接口來實現類似的功能。
4、通過各種非HTTP協議:
如果服務器端程序對訪問URL所采用的協議進行驗證的話,可以通過非HTTP協議來進行利用。
(1)、GOPHER協議:通過GOPHER我們在一個URL參數中構造Post或者Get請求,從而達到攻擊內網應用的目的。例如我們可以使用GOPHER協議對與內網的Redis服務進行攻擊,可以使用如下的URL:
(2)、File協議:File協議主要用于訪問本地計算機中的文件,我們可以通過類似file:///文件路徑這種格式來訪問計算機本地文件。使用file協議可以避免服務端程序對于所訪問的IP進行的過濾。例如我們可以通過file:///d:/1.txt 來訪問D盤中1.txt的內容
(3)、DICT協議
5、DNS Rebinding
對于常見的IP限制,后端服務器可能通過下圖的流程進行IP過濾:
對于用戶請求的URL參數,首先服務器端會對其進行DNS解析,然后對于DNS服務器返回的IP地址進行判斷,如果在黑名單中,就pass掉。
但是在整個過程中,第一次去請求DNS服務進行域名解析到第二次服務端去請求URL之間存在一個時間查,利用這個時間差,我們可以進行DNS 重綁定攻擊。
要完成DNS重綁定攻擊,我們需要一個域名,并且將這個域名的解析指定到我們自己的DNS Server,在我們的可控的DNS Server上編寫解析服務,設置TTL時間為0。這樣就可以進行攻擊了,完整的攻擊流程為:
(1)、服務器端獲得URL參數,進行第一次DNS解析,獲得了一個非內網的IP
(2)、對于獲得的IP進行判斷,發現為非黑名單IP,則通過驗證
(3)、服務器端對于URL進行訪問,由于DNS服務器設置的TTL為0,所以再次進行DNS解析,這一次DNS服務器返回的是內網地址。
(4)、由于已經繞過驗證,所以服務器端返回訪問內網資源的結果。
0x04實戰案例
wooyun漏洞庫案例
weblogic的uddiexplorer,這個好像比較常見一些
其它待收集補充
0x05防御思路
通常有以下5個思路:
1,過濾返回信息,驗證遠程服務器對請求的響應是比較容易的方法。如果web應用是去獲取某一種類型的文件。那么在把返回結果展示給用戶之前先驗證返回的信息是否符合標準。
2, 統一錯誤信息,避免用戶可以根據錯誤信息來判斷遠端服務器的端口狀態。
3,限制請求的端口為http常用的端口,比如,80,443,8080,8090。
4,黑名單內網ip。避免應用被用來獲取獲取內網數據,攻擊內網。
5,禁用不需要的協議。僅僅允許http和https請求。可以防止類似于file:///,gopher://,ftp:// 等引起的問題。
6、禁止302跳轉
7、使用gethostbyname()判斷請求是否為內網ip。 要結合6來使用
其中3、4、5可以通過網絡防火墻或者主機防火墻來實現。
0x06參考
SSRF攻擊實例解析:http://www.freebuf.com/articles/web/20407.html
SSRF漏洞的挖掘經驗:http://bobao.360.cn/learning/detail/240.html
跨協議通信技術利用:http://www.freebuf.com/articles/web/19622.html
關于SSRF攻擊:http://evilcos.me/?p=221
SSRF的新紀元:在編程語言中利用URL解析器:http://bobao.360.cn/learning/detail/4183.html