utsuroi ssrf labs知識ベース 01 / 01
Server-Side Request Forgery · Knowledge Base
01

SSRF の基礎

When servers fetch URLs on behalf of users

サーバが「ユーザの代わりに URL を fetch する」機能は思ったより多い:画像取込、URL プレビュー、Webhook 配信、PDF 生成、サムネイル取得、外部 API 中継。これら全てが SSRF の入口になり得ます。

1. SSRF とは #what-is

サーバ側の URL fetcher を悪用して、攻撃者が選んだ URL を読みに行かせる。

典型例:うつろい EC の「商品画像 URL を貼ると自動取込」機能。

POST /api/products/{id}/import-image
{ "url": "https://supplier.example/cosmetics/cream.jpg" }

// サーバ側
$content = file_get_contents($_POST['url']);
file_put_contents('/var/www/uploads/' . $id . '.jpg', $content);

意図はサプライヤサイトからの画像取込。攻撃者が次のような URL を送ると:

2. なぜ危険か — 内部ネットワークへの侵入 #why-dangerous

外から到達できないサービスに、Web アプリ経由で到達される。

本番環境では「外向け Web サーバ」と「内部 DB / 内部管理画面 / Redis」がネットワーク的に分離されています。SSRF はこの境界を破ります。

3. クラウド・メタデータエンドポイント #cloud-metadata

169.254.169.254 から認証情報が漏洩する。

AWS、GCP、Azure いずれも「インスタンス自身の情報を返すメタデータ API」を提供しており、リンクローカルアドレス 169.254.169.254 でアクセスできます。SSRF でここに到達されると、IAM トークンが漏洩 → AWS アカウント全体が乗っ取られる重大事案に。

GET http://169.254.169.254/latest/meta-data/iam/security-credentials/EC2-WebServer-Role
=> { "AccessKeyId": "ASIA...", "SecretAccessKey": "...", "Token": "FwoGZXIvYXdz..." }

2019 年の Capital One 事案(1億件以上の顧客情報漏洩)も、SSRF からのメタデータ窃取が起点でした。AWS では IMDSv2 を強制(セッショントークン必須)することで、単純な GET ベースの SSRF を緩和できます。

4. よくあるフィルタ回避 #bypass

「内部 IP は禁止」のチェックが甘いと回避される。

5. 正しい防御 #defense

ホワイトリスト + 名前解決後の IP チェック + ネットワーク分離。
  1. 許可ドメインのホワイトリスト — 任意 URL を受け付けるのではなく、信頼できる外部ドメインだけ許す
  2. 名前解決後の IP チェック — DNS で得た IP が プライベート/loopback/リンクローカル なら拒否
  3. HTTP/HTTPS のみ許可 — file:、gopher:、dict: 等のスキームを禁止
  4. ネットワークレベルの分離 — Web アプリのアウトバウンド先を NAT/プロキシで限定
  5. クラウド側の対策 — IMDSv2、メタデータエンドポイントへのアクセスをホワイトリストで制限