SSRF (Server-Side Request Forgery 服務端請求偽造)
文章目錄
- 0x01 是什么?
- 0x02 怎么判斷是否存在SSRF漏洞?
- 0x03 防御
- 0x04 繞過手段
0x01 是什么?
是什么?
??答:攻擊者構造請求,由服務端(向內網 / 目的url)發起各種請求的過程。
目的是什么?
?? 答:內網信息收集。滲透攻擊
為什么存在?
原理:
大多是由于服務端提供了從自身/其他服務器應用獲取數據的功能且沒有對目標地址做過濾與限制。
可以做什么工作?
??
1.進行端口掃描,資源訪問
2.指紋信息識別,訪問相應的默認文件
3.利用漏洞或者和payload進一步運行其他程序
4.get類型漏洞利用,傳參數實現攻擊
5.post型漏洞利用,用gopher協議進行參數構造
6.拒絕服務攻擊(訪問大文件占用資源)
7.利用file協議,訪問/下載
8進行跳板
0x02 怎么判斷是否存在SSRF漏洞?
代碼審查:對服務端的源代碼進行審查,檢查是否存在未經驗證或過濾的請求函數。手動審查代碼,查看是否所有URL輸入都經過了驗證。
抓包分析:通過抓包工具(如Wireshark、tcpdump等)分析發送的請求是否是由服務器端發送的。如果發現請求是由服務器端發起的,則可能存在SSRF漏洞。
頁面源碼檢查:在頁面源碼中查找訪問的資源地址。如果資源地址類型為www.baidu.com/xxx.php ?image=等形式,則可能存在SSRF漏洞。
使用自動化工具:使用SSRF漏洞檢測工具(如SSRFire)來自動掃描和發現潛在的SSRF漏洞。這些工具可以幫助研究人員快速識別目標域名和服務器信息中的潛在漏洞。
DNS帶外測試:在無回顯的情況下,可以使用DNS帶外測試工具(如DNSlog)來測試是否存在SSRF漏洞。
排除法:通過瀏覽器的開發者工具(F12)查看源代碼,看是否是在本地進行了請求。如果資源地址類型為http://www.xxx.com/a.php ?image=等形式,則可能存在SSRF漏洞。
利用特定協議:通過利用file、gopher、dict等協議讀取本地文件或執行命令,來探測是否存在SSRF漏洞。
如:
url=dict://192.168.1.1:80
url=file:///c:/1.txt
file= file:///c:/1.txt
0x03 防御
URL的限制和過濾:基于黑名單和白名單
限制協議為HTTP/HTTPS
禁止30X跳轉
設置URL白名單或者限制內網IP(使用gethostbyname()判斷是否為內網IP
服務端開啟OpenSSL無法交互利用
服務端需要認證交互
把用于取外網資源的API部署在不屬于自己的機房
過濾返回信息,驗證遠程服務器對請求的響應是比較容易的方法。如果web應用是去獲取某一種類型的文件。那么在把返回結果展示給用戶之前先驗證返回的信息是否符合標準。
限制請求的端口為http常用的端口,比如 80、443、8080、8090
統一錯誤信息,避免用戶可以根據錯誤信息來判斷遠端服務器的端口狀態。
0x04 繞過手段
任何一種繞過,關鍵的問題都是“開發和測試的認知范圍”問題,具體到SSRF則是對于IP和URL地址的編碼和解析問題:
攻擊本地:直接攻擊本地系統,利用本地資源進行攻擊。
利用[::]:使用IPv6地址中的雙冒號“[::]”來繞過某些過濾機制。
利用@:通過在URL中添加“@”符號來繞過某些過濾器。 http://localhost/pikachu-master/vul/ssrf/ssrf_fgc.php
利用短地址:使用短地址服務來繞過URL長度限制。
利用特殊域名:使用特殊的域名或協議來繞過過濾器。
利用DNS解析:通過DNS解析來繞過某些過濾機制。
利用上傳:通過上傳文件來繞過某些過濾器。
利用Enclosed:通過將請求封裝在特定格式中來繞過過濾器。
DNS欺騙:通過DNS欺騙來繞過某些過濾器。
使用進制編碼:通過十六進制、八進制等編碼方式來繞過過濾器。
添加端口:通過在URL中添加端口號來繞過某些過濾器。