文章目錄
- 前言
- 一、SSRF原理
- 二、SSRF漏洞利用
-
- 1、SSRF漏洞挖掘
- 2、SSRF危害
- 3、SSRF漏洞相關php協定
-
- 3.1 file_get_contents() :
- 3.2 fsockopen():
- 3.3 curl_exec():
- 4、SSRF漏洞可利用的協定
-
- 4.1 http/s
- 4.2 file協定
- 4.3 dict協定
- 4.4 ftp協定
- 4.5 gopher協定
- 三、SSRF繞過
- 四、SSRF防禦
前言
隻要稍加不防範,網站就有可能存在SSRF漏洞!
學習連結:SSRF漏洞講解
一、SSRF原理
- SSRF(Server-side Request Forgery):服務端請求僞造。SSRF的形成大多是由于服務端提供了從其他伺服器擷取資料的功能,但是沒有對目标位址進行過濾和限制。比如:從指定的url位址擷取網絡文本内容,加載指定位址的圖檔,或者下載下傳等。
- 攻擊的目标是從外網無法通路的内網系統,以服務端為跳闆,攻擊内網系統。
- 常利用的協定:http/s,dict,file,gopher,ftp等
- 相關 PHP函數: file_get_contents(),fsockopen(),curl_exec() 等
- 攻擊的内網應用:redius、mysql、smtp等
- ssrf利⽤存在缺陷的web應用作為代理,攻擊遠端和本地的伺服器。
二、SSRF漏洞利用
1、SSRF漏洞挖掘
從Web功能上尋找(那些需要向伺服器發起請求的地方):
圖檔檢視、下載下傳
檔案加載、下載下傳
轉碼服務:通過url位址,把原網頁的内容優化為适合手機螢幕浏覽
圖檔、文章收藏功能
線上翻譯
通過url位址分享網頁内容
未公開的API實作及調用URL的功能等
從URL關鍵字中尋找:Share、wap、url、link、src、source、target、u、3g、display、sourceURL、imageURL、domain等
漏洞探測工具:burpsite等
2、SSRF危害
1.對外網、伺服器所在内網、本地進行端口掃描,擷取一些服務的banner資訊。
2.攻擊運作在内網或者本地的應用程式。
3.對内網的web應用進行指紋識别(通過請求預設檔案得到特定的指紋),對資産資訊進行識别。
4.利用file協定讀取本地檔案。
5.攻擊内外網的web應用,主要是使用HTTP GET請求就可以實作的攻擊等。
3、SSRF漏洞相關php協定
3.1 file_get_contents() :
file_get_contents():把整個檔案讀入一個字元串中。
該函數是用于把檔案的内容讀入到一個字元串中的首選方法。如果伺服器作業系統支援,還會使用記憶體映射技術來增強性能。
文法:file_get_contents(path,include_path,context,start,max_length)
3.2 fsockopen():
開啟這個函數需要php.ini中的
allow_url_fopen = On
- fsockopen是用于打開網絡的 Socket 連結。
- 文法:fsockopen($host, $port, $errno, $errstr, $timeout)
- 在使用本函數之後會傳回檔案指針,供檔案函數使用,包括 fgets()、fgetss()、fputs()、fclose() 與 feof()。參數 errno 及 errstr 也是可省略的,主要當做錯誤處理使用。
3.3 curl_exec():
curl_exec : 執行一個cURL會話
4、SSRF漏洞可利用的協定
4.1 http/s
靶場:pikachu
加載圖檔
檢視虛拟機中的檔案
探測端口3306
配置權限(否則會出現
'xxx' is not allowed to connect to this MySQL server1
的提示)
以上,我們可以利用http協定對内網進行探測,探測整個内網的存活ip,和端口。
可利用burpsite或者腳本進行快速探測,由于回顯的不同,腳本就需要按照回顯的特征來寫,那種回顯是存在,哪種回顯是不存在這樣的ip或端口。
一般私網位址的ip位址都處于10.0.0.0、172.16.0.0、192.168.0.0這樣的網段。
4.2 file協定
file協定可用于讀取本地檔案
通路虛拟機本地檔案
4.3 dict協定
dict協定與http協定可用來探測内網的主機存活與端口開放情況
4.4 ftp協定
ftp(file transform protocol):檔案傳輸協定
這裡沒有輸入使用者和密碼,是以不顯示ftp連接配接的位址下的檔案
使用ftp協定檢視虛拟機裡的檔案
ftp服務的安裝可以參考這篇文章
ftp服務的搭建
這裡我設定的ftp的站點就是虛拟機的ip位址
4.5 gopher協定
- Gopher是Internet上一個非常有名的資訊查找系統,它将Internet上的檔案組織成某種索引,很友善地将使用者從Internet的一處帶到另一處。在WWW出現之前,Gopher是Internet上最主要的資訊檢索工具,Gopher站點也是最主要的站點,使用tcp70端口。但在WWW出現後,Gopher失去了昔日的輝煌。現在它基本過時,人們很少再使用它;
gopher協定支援發出GET、POST請求:可以先截獲get請求包和post請求包,在構成符合gopher協定的請求。gopher協定是ssrf利用中最強大的協定
gopher在各個程式設計語言中的限制:
–wite-curlwrappers:使用curl工具打開url資料流
協定格式
URL:gopher://<host>:<port>/<gopher-path>_後接TCP資料流
- 使用gopher協定時,回車換行輸入%0d%0a,空格輸入%20,問号輸入%3f,結束符%0d%0a
- SSRF漏洞在真實環境常常去攻擊redis、FastCGI等服務。
(我看網上都是在使用Linux作業系統作攻擊實驗的。是以以後有時間再研究清楚這個協定吧)
三、SSRF繞過
@繞過
從@後面開始解析。
利用的原理:解析URL時的規則問題。
點分割号繞過
封閉字元符号
url十六進制轉換
進制轉換繞過
有些ssrf防護措施,會對輸入的URL做正則比對,限制内網位址,比如192、127這些位址,但如果轉換成其他格式的ip位址,可能會繞過
利用30X重定向
可以使用重定向來讓伺服器通路目标位址,可用于重定向的HTTP狀态碼:300、301、302、303、305、307、308。
需要一個vps,把302轉換的代碼部署到vps上,然後去通路,就可跳轉到内網中
DNS解析
配置域名的DNS解析到指定的目标位址
DNS重綁定
在網頁浏覽過程中,使用者在位址欄中輸入包含域名的網址。浏覽器通過DNS伺服器将域名解析為IP位址,然後向對應的IP位址請求資源,最後展現給使用者。而對于域名所有者,他可以設定域名所對應的IP位址。當使用者第一次通路,解析域名擷取一個IP位址;然後,域名持有者修改對應的IP位址;使用者再次請求該域名,就會擷取一個新的IP位址。對于浏覽器來說,整個過程通路的都是同一域名,是以認為是安全的。這就造成了DNS Rebinding攻擊。簡而言之:當我們發起域名解析請求的時候,第一次通路會傳回一個ip位址A,但是當我們發起第二次域名解析請求的時候,卻會傳回一個不同于A的ip位址B。可以通過DNS重綁定攻擊繞過同源政策,進而攻擊内網的其他裝置。
DNS重綁定
協定繞過
http/s,file,ftp,dict,gopher等協定繞過
四、SSRF防禦
SSRF漏洞的防禦主要是保證使用者請求的合法性、伺服器行為的合規性兩個方面。
1、禁止高危協定。限制請求端口隻能為web端口,隻允許通路HTTP和HTTPS的請求;
2、過濾傳回的資訊,驗證遠端伺服器對請求的傳回結果是否合法;
3、禁止不常使用的端口
4、限制不能通路内網的IP,防止對内網進行攻擊;
5、禁止302跳轉,或者每跳轉一次都進行校驗目的位址是否為内網位址或合法位址。
6、對于DNS重綁定,使用DNS緩存或者Host白名單。
7、統一錯誤資訊,避免黑客通過錯誤資訊判斷端口對應的服務
關于SSRF還有很多需要學習的地方,這裡我隻是簡單地了解了一下它的基本原理。具體的以後再做探讨。