うつろい EC の管理画面に「商品画像 URL を貼ると自動取込」という便利機能。サプライヤサイトから商品写真を取得して S3 に保存する。サーバはこの URL に対して file_get_contents() で内容を取得している。
うつろい EC は AWS EC2 上で稼働しており、IAM ロールが付与されている。AWS のメタデータエンドポイント http://169.254.169.254/ はインスタンスから無認証でアクセス可能で、IAM 認証情報を返す。
うつろい 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)を盗み出してください。
入力: (空) ↓ 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 を許す)
// - レスポンスサイズ・タイプ
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 の標的です。