SSRF(Server-Side Request Forgery)は、Webアプリケーションにおける代表的な脆弱性の一つです。
少し分かりにくい概念ですが、ポイントはシンプルです。
サーバーに対して、本来意図していないURLへリクエストを送らせる攻撃です。
この記事では、SSRFの基本から実際に何ができるのか、対策までを分かりやすく解説します。
SSRF(サーバーサイドリクエストフォージェリ)とは
SSRFとは、ユーザーが指定したURLに対してサーバーがリクエストを送る仕組みを悪用する攻撃です。
本来、この仕組みは次のような用途で使われます。
- 外部APIの取得
- 画像の読み込み
- Webhook送信
しかし、入力値の検証が不十分な場合、攻撃に利用されます。
SSRFの仕組み
例えば、次のような機能を考えます。
「URLを入力すると、そのページの内容を取得する」
内部では、サーバーが次のようなリクエストを送ります。
GET http://example.comここで問題になるのは、ユーザーが自由にURLを指定できる点です。
攻撃者は、この仕組みを利用して意図しない場所へアクセスさせます。
SSRFでできること
SSRFが成立すると、通常は外部からアクセスできない場所に到達できます。
内部ネットワークへのアクセス
http://192.168.0.1
http://localhost/admin内部の管理画面やAPIにアクセスできる可能性があります。
クラウドのメタデータ取得
http://169.254.169.254/latest/meta-data/クラウド環境では認証情報が取得されることがあります。
非公開APIの操作
内部APIに対してリクエストを送ることで、管理機能を操作できるケースもあります。
なぜ危険なのか
SSRFの問題は、サーバー自身がアクセスしてしまう点にあります。
これにより、次のような影響が発生します。
- ファイアウォールを回避する
- 内部ネットワークにアクセスできる
- 信頼された通信として扱われる
よくある対策とその限界
ドメイン制限(ホワイトリスト)
「特定のドメインのみ許可する」という対策はよく使われます。
しかし、次のような問題があります。
- リダイレクトで別サイトに移動できる
- DNSによってIPが変わる
- サブドメインの扱いが曖昧
オープンリダイレクトによるバイパス例
例えば、許可されたドメインにリダイレクト機能がある場合です。
http://example.com/redirect?url=http://192.168.0.1このURLを使うと、次のような流れになります。
- example.comとしてチェックを通過
- リダイレクトが発生
- 内部IPへアクセス
結果として、制限を回避できます。
SSRFが発生しやすい機能
URL入力機能
- 画像URL入力
- APIエンドポイント指定
- OGP取得
外部連携機能
- Webhook
- 外部サービス連携
- 自動投稿
WordPressでの例
WordPressでも以下のような機能が対象になります。
- 外部画像の取り込み
- RSS取得
- プラグインのAPI連携
SSRFの基本対策
内部IPのブロック
以下のようなアドレスへのアクセスを禁止します。
- 127.0.0.1
- localhost
- 192.168.x.x
- 169.254.x.x
リダイレクトの制御
- 自動リダイレクトを無効化する
- リダイレクト先も検証する
URLの厳格な検証
- ドメインだけでなくIPも確認する
- DNS解決後の結果もチェックする
まとめ
SSRFはシンプルな仕組みですが、影響範囲が広く危険度の高い脆弱性です。
特に重要なのは次の点です。
- ユーザー入力のURLは信用しない
- ドメイン制限だけでは不十分
- 最終的な到達先を検証する
