Shikata Ga Nai

Private? There is no such things.

SSRF攻撃:サーバー自身への攻撃

Hello there, ('ω')ノ

SSRF(Server-Side Request Forgery)は、サーバー自身にリクエストを送信する形でも悪用されることがあります。この手法を 「ローカル SSRF」 と呼び、攻撃者が ループバックインターフェース(localhost, 127.0.0.1) を利用して、管理機能や内部APIにアクセスすることを可能にします。


1. ローカル SSRF の仕組み

通常、Webアプリケーションは 外部のAPIやバックエンドシステム にリクエストを送信する機能を持っています。しかし、攻撃者が リクエストURLを変更 できる場合、サーバー自身にリクエストを送信させることが可能になります。

攻撃の流れ

  1. 正規のリクエスト(通常のユーザー操作)
    • 例として、ショッピングアプリが在庫情報を取得するために、外部の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を利用すると制限を回避 できます。

  • 内部アクセスの信頼

    • 多くのアプリケーションは、localhost127.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, (^^ゞ