utsuroi ssrf labsLab 01 / 5 — Practitioner
01

SSRF — 商品画像取込からクラウド・メタデータを盗む

Basic SSRF leading to cloud metadata exposure

うつろい EC の管理画面に「商品画像 URL を貼ると自動取込」という便利機能。サプライヤサイトから商品写真を取得して S3 に保存する。サーバはこの URL に対して file_get_contents() で内容を取得している。

うつろい EC は AWS EC2 上で稼働しており、IAM ロールが付与されている。AWS のメタデータエンドポイント http://169.254.169.254/ はインスタンスから無認証でアクセス可能で、IAM 認証情報を返す。

SSRF を使って AWS メタデータエンドポイントから IAM 認証情報(Access Key / Secret / Token)を盗み出してください。

[インターネット] ──> EC2 上の Web アプリ(うつろい EC) │ ├──> supplier.example (許可されたサプライヤ) │ ├──> 169.254.169.254 (AWS メタデータ — IAM 認証情報を返す) ├──> 10.0.1.50:6379 (内部 Redis、認証なし) └──> 10.0.1.100/admin (内部 Jenkins)
クイック試行:
サーバの fetch トレース
入力: (空)
↓ file_get_contents()
↓ レスポンス取得
(まだ取込実行していません)
脆弱なサーバ実装
// PHP - 商品画像取込
$url = $_POST['url'];
$content = file_get_contents($url);  // 任意 URL
file_put_contents('/var/www/uploads/' . $product_id . '.jpg', $content);
return ['status' => 'ok'];

// 何も検証していない:
// - スキーム(file:, gopher: 等を許す)
// - ホスト(内部 IP を許す)
// - レスポンスサイズ・タイプ
ヒント 1 — メタデータエンドポイントのパス

AWS のメタデータは http://169.254.169.254/latest/meta-data/ から階層構造で取得できる。IAM 認証情報は iam/security-credentials/{ロール名}

正解(ネタバレ)

URL: http://169.254.169.254/latest/meta-data/iam/security-credentials/EC2-WebServer-Role

このパスにアクセスすると、IAM ロールの一時的な認証情報(AccessKey / SecretKey / Token)が JSON で返ってきます。攻撃者はこれを取得して、自分のマシンから AWS API を叩けるようになります。

2024 年現在、AWS は IMDSv2(セッショントークン必須)を導入し、新規インスタンスではこの古典攻撃が緩和されています。ただしレガシーインスタンス、AWS 以外のクラウド、内部ネットワークの他のサービス(Redis 等)は依然として SSRF の標的です。