Hello there, ('ω')ノ
SSRF(Server-Side Request Forgery)は、サーバー自身にリクエストを送信する形でも悪用されることがあります。この手法を 「ローカル SSRF」 と呼び、攻撃者が ループバックインターフェース(localhost, 127.0.0.1) を利用して、管理機能や内部APIにアクセスすることを可能にします。
1. ローカル SSRF の仕組み
通常、Webアプリケーションは 外部のAPIやバックエンドシステム にリクエストを送信する機能を持っています。しかし、攻撃者が リクエストURLを変更 できる場合、サーバー自身にリクエストを送信させることが可能になります。
攻撃の流れ
- 正規のリクエスト(通常のユーザー操作)
- 例として、ショッピングアプリが在庫情報を取得するために、外部のAPIサーバーにリクエストを送る場合を考えます。
- クライアントが以下のリクエストを送信します。
POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 118
stockApi=http://stock.weliketoshop.net:8080/product/stock/check%3FproductId%3D6%26storeId%3D1
このリクエストにより、サーバーは stock.weliketoshop.net に在庫情報を問い合わせ、ユーザーに結果を返します。
SSRFを利用した攻撃リクエスト
- 攻撃者がリクエストを改ざんし、ローカルホスト上の管理パネル(
/admin
)にアクセスさせます。 - 例えば、以下のリクエストを送信することで、サーバー自身の管理ページへアクセス可能になります。
- 攻撃者がリクエストを改ざんし、ローカルホスト上の管理パネル(
POST /product/stock HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 118
stockApi=http://localhost/admin
- これにより、サーバーが localhost の
/admin
にアクセス し、その内容を攻撃者に返してしまう可能性があります。
2. なぜこの攻撃が成功するのか?
通常、管理ページ(/admin
)は 認証済みの管理者のみ がアクセスできる設計になっています。しかし、以下の理由で SSRFを利用すると制限を回避 できます。
内部アクセスの信頼
- 多くのアプリケーションは、
localhost
や127.0.0.1
からのリクエストを 「信頼できる」 と判断し、特別な認証なしでアクセスを許可することがあります。
- 多くのアプリケーションは、
IPベースのアクセス制限の回避
- 一般的に、管理機能は外部ネットワークから直接アクセスできないようになっていますが、 サーバー自身からのアクセス は許可されているケースが多い。
- SSRFを利用すると、サーバー自身を踏み台にして、 本来アクセスできない管理機能にアクセス できるようになります。
3. SSRFの影響
ローカル SSRF を悪用されると、以下のような深刻な被害が発生します。
① 管理機能への不正アクセス
攻撃者が /admin
などの管理パネルにアクセスできると、 システムの設定変更やアカウントの乗っ取り が可能になります。
- 管理者アカウントの作成・変更
- 機密情報の漏洩(ユーザー情報、決済データなど)
- システムの停止・破壊(設定変更、データ削除など)
② 内部APIの利用
一部のAPI(例:http://localhost/internal-api
)は、外部からのアクセスを制限していますが、SSRF経由でアクセスされると機密情報が流出する可能性があります。
- 認証情報(JWTトークン、セッションID)
- 内部システムの設定情報(APIキー、データベース情報)
③ 任意コード実行(RCE)
管理機能やAPIによっては、サーバー上で OSコマンドを実行 できるものもあります。
- 例えば、http://localhost/execute?cmd=whoami
などを実行できる場合、攻撃者は リモートコード実行(RCE) を引き起こす可能性があります。
- システム乗っ取り、データの改ざん、マルウェア感染 などの被害につながる恐れがあります。
4. SSRF対策
ローカル SSRF を防ぐためには、以下の対策が有効です。
① ユーザー指定URLの制限
- 外部へのリクエストのみ許可し、ローカルネットワーク(localhost, 127.0.0.1, 192.168.x.x など)へのアクセスを禁止する
- 許可されたドメインリスト(ホワイトリスト)を使用する
例:ホワイトリストの適用
ALLOWED_DOMAINS = ["stock.weliketoshop.net"] def is_valid_url(url): return any(domain in url for domain in ALLOWED_DOMAINS)
② HTTPリクエストの制限
- ローカルIPアドレスへのリクエストを拒否
- URLスキームの制限(例:file:// や gopher:// を禁止)
③ ファイアウォールの設定
- サーバー自身のHTTPリクエストを制限(
localhost
へのアクセス禁止) - クラウド環境(AWS, GCPなど)のメタデータサービス(169.254.169.254)へのアクセスをブロック
④ 内部管理ページの強化
- 管理ページへのアクセスはVPN経由のみ許可
- IP制限と多要素認証(MFA)の導入
- CSRFトークンを使用し、外部からのリクエストを防ぐ
5. まとめ
ローカル SSRF は、 サーバー自身の管理機能や内部APIにアクセスし、不正な操作を行う攻撃手法 です。特に、 信頼されたネットワーク内でのアクセスを前提としたシステムに影響を与える ため、深刻なセキュリティリスクをもたらします。
適切な リクエスト制御、ファイアウォール設定、アクセス管理の強化 を行うことで、この脆弱性を防ぐことが重要です。
Best regards, (^^ゞ