伺服器端請求偽造 (SSRF)
| , 2 minutes reading.
1. 定義
伺服器端請求偽造 (Server-Side Request Forgery, SSRF) 是一種漏洞,允許攻擊者誘使伺服器端應用程式向攻擊者指定的任意網域發起 HTTP 請求。
在典型的 SSRF 攻擊中,攻擊者可能使伺服器連接到組織基礎設施內的內部服務,或強制伺服器連接到任意外部系統,從而洩漏敏感資料。
2. 技術原理
現代應用程式經常從用戶提供的 URL 獲取資源(例如「從 URL 匯入」、「獲取預覽」、「Webhook 回呼」)。
如果伺服器不驗證目標位址,攻擊者可以:
- 存取內部服務: 請求
http://localhost:6379(Redis)、http://192.168.1.1/admin(內部管理後台)或雲端元資料端點。 - 連接埠掃描: 將伺服器作為代理掃描內部網路。
- 繞過存取控制: 內部服務通常信任來自「localhost」的請求並跳過身份驗證。
雲端元資料利用: 雲端服務提供商(AWS、GCP、Azure)在知名 URL 上公開執行個體元資料:
- AWS:
http://169.254.169.254/latest/meta-data/ - GCP:
http://metadata.google.internal/
這些端點返回 IAM 憑證、API 金鑰和設定資料。
3. 攻擊流程
sequenceDiagram
participant Attacker as 攻擊者
participant WebApp as Web 應用程式
participant Meta as 雲端元資料服務
participant Internal as 內部資料庫
Attacker->>WebApp: POST /fetch-url<br/>url=http://169.254.169.254/latest/meta-data/iam/
Note over WebApp: 伺服器未經驗證<br/>直接獲取該 URL
WebApp->>Meta: GET /latest/meta-data/iam/security-credentials/
Meta-->>WebApp: IAM 角色憑證 JSON
WebApp-->>Attacker: 回應中包含 AWS 憑證
Note over Attacker: 攻擊者現已獲得<br/>雲端基礎設施存取權限4. 真實案例:Capital One (2019)
目標: Capital One 的 AWS 基礎設施。 漏洞類別: SSRF 導致雲端元資料存取 (CVE-2019-4872)。
漏洞背景: Capital One 使用的 Web 應用程式防火牆 (WAF) 存在 SSRF 漏洞。該 WAF 配置了一個權限過大的 IAM 角色。
攻擊過程:
- 攻擊者發現了 WAF 中的 SSRF 漏洞。
- 他們向
http://169.254.169.254/latest/meta-data/iam/security-credentials/發送請求。 - 獲取了分配給 WAF IAM 角色的臨時 AWS 憑證。
- 使用這些憑證存取了包含客戶資料的 S3 儲存貯體。
影響: 超過 1 億條客戶記錄被洩漏,包括姓名、地址、信用評分和社會安全號碼。這導致了 8000 萬美元的罰款,並成為雲端安全領域的標誌性案例。
5. 深度防禦策略
A. 輸入驗證與白名單
絕不允許用戶控制的 URL 存取任意目標。
- 白名單機制: 僅允許向已知的可信網域發起請求。
- 預設拒絕: 阻止私有 IP 範圍(10.x.x.x、172.16-31.x.x、192.168.x.x、127.x.x.x、169.254.x.x)。
- 協定限制: 僅允許
https://— 阻止file://、gopher://、dict://。
B. DNS 解析驗證
攻擊者可以使用 DNS 重新繫結或解析為內部 IP 的網域名稱來繞過 IP 黑名單。
- 機制: 先解析主機名稱,然後在發起請求前驗證 IP 位址。
- 二次檢查: 在 DNS 解析後再次驗證 IP(防止 TOCTOU 攻擊)。
C. 網路隔離
隔離需要獲取外部 URL 的伺服器。
- 防火牆規則: 獲取用戶提供 URL 的伺服器不應有權存取內部服務或元資料端點。
- 專用代理: 透過具有嚴格白名單的加固代理路由所有出站請求。
D. 停用雲端元資料(或使用 IMDSv2)
- AWS IMDSv2: 需要透過 PUT 請求獲取工作階段權杖,使 SSRF 利用變得更加困難。
- 阻止元資料: 如果不需要,使用防火牆規則阻止對 169.254.169.254 的存取。
# AWS:在 EC2 執行個體上強制使用 IMDSv2
aws ec2 modify-instance-metadata-options \
--instance-id i-1234567890abcdef0 \
--http-tokens required