SSRF(Server-Side Request Forgery)は、サーバーに任意のURLへアクセスさせる攻撃です。
今回のWSAラボ「Basic SSRF against another back-end system」では、ただ内部にアクセスするだけではなく、内部ネットワーク(192.168.0.X)をスキャンするという少し実務寄りの内容になっています。
つまり、サーバーを使って社内ネットワークを探索するこれがテーマです。
SSRFとは何か
SSRFの本質はシンプルです。
自分ではアクセスできない場所に、サーバーを使ってアクセスする通常、外部ユーザーは次のような内部IPにはアクセスできません。
192.168.x.x
10.x.x.x
172.16.x.x
これらは内部ネットワーク専用です。
しかし、サーバーは内部ネットワークにアクセスできます。
外部ユーザー → 内部ネットワーク(アクセス不可)
Webサーバー → 内部ネットワーク(アクセス可能)
この差を利用するのがSSRFです。
ラボ「Basic SSRF against another back-end system」の概要
このラボにも在庫確認(Stock Check)機能があります。
処理の流れはこうです。
ユーザー → Webアプリ → 内部システム
そして、リクエストには次のようなパラメータがあります。
stockApi=http://stock.weliketoshop.net:8080/...この stockApi がポイントです。
サーバーがアクセスするURLを指定しています。
つまり、この値を書き換えられるとSSRFが成立します。
今回のゴール
このラボでは次の2つを行います。
- 内部ネットワーク(192.168.0.X)をスキャンする
- 管理画面を見つけて、carlosを削除する
攻撃の流れ─内部IPスキャンの手順
ステップ1:リクエストを取得
商品ページで「Check stock」をクリックし、Burp Suiteでリクエストを傍受します。
その後、Burp Intruderに送ります。
ステップ2:スキャン用URLに変更
stockApi を次のように変更します。
stockApi=http://192.168.0.1:8080/adminここで注目するのは、192.168.0.1 の「1」の部分です。
ステップ3:IPを総当たり(Intruder)
最後の数字を選択して「§」を付けます。
http://192.168.0.§1§:8080/admin設定は次の通りです。
- Payload type:Numbers
- From:1
- To:255
- Step:1
これで 192.168.0.1 ~ 192.168.0.255 を順番に試します。
ステップ4:レスポンスを確認
攻撃を開始すると、多数のリクエストが送られます。
ここで確認するのはステータスコードです。
一覧を並び替えると、200(成功)のレスポンスが1つ見つかります。
それが管理画面のあるIPです。
ステップ5:削除リクエストを送る
見つけたIPを使って、次のように変更します。
stockApi=http://192.168.0.X:8080/admin/delete?username=carlosこれを送信すると、サーバーが内部の削除処理を実行します。
これでラボ解決です。
▶ localhostにアクセスするSSRFの解説記事はこちら
なぜSSRFでスキャンができるのか
このラボが成立する理由は3つです。
① サーバーが内部ネットワークにアクセスできる
192.168.x.x は内部専用ですが、サーバーからはアクセス可能です。
② URLを自由に変更できる
stockApi の値をそのまま使っているため、任意のIPにアクセスできます。
③ スキャンに利用できる
外部からのポートスキャンは制限されることが多いですが、SSRFを使うとサーバーが代わりにスキャンしてくれます。
まとめると、SSRFは内部ネットワークスキャンにも使えるということです。
WordPressに置き換えるとどうなるか
この挙動はWordPressでも普通に起こりえます。
パターン①:URL指定のデータ取得
$url = $_POST['url'];
wp_remote_get($url);このようなコードがあると、
http://192.168.0.1:8080のような内部アクセスが可能になります。
パターン②:Webhook確認機能
wp_remote_get($webhook_url);接続テスト機能などでよくある実装です。
パターン③:外部データ取得
- RSS取得
- API通信
- 画像取得
URLを扱う処理はすべて対象になります。
WordPressでの現実的なリスク
- 自作プラグイン
- 外部連携機能
- 管理画面の設定
- 会員機能
特に、URLを自由に扱える機能は注意が必要です。
セキュリティ診断時のチェックポイント
SSRFを疑うポイントです。
- URL入力機能がある
- サーバー側でURLを取得している
wp_remote_get()を使用している- 内部IPを制限していない
- allowlist(許可制)がない
- リダイレクトを許可している
- 管理画面からURLを設定できる
URLを取得する処理を見つけることが重要です。
SSRF対策─WordPressで意識するポイント
対策はシンプルです。
① 安全な関数を使う
wp_safe_remote_get($url);② アクセス先を制限する
- localhostの禁止
- 内部IPの禁止
- 許可ドメインのみ許可
③ 設計で防ぐ
- URLを自由入力させない
- 不要な外部通信機能を作らない
まとめ|SSRFは内部ネットワーク探索にも使われる
このラボのポイントは次の通りです。
- サーバーは内部ネットワークにアクセスできる
- URLを操作できるとSSRFが成立する
- SSRFは内部ネットワークのスキャンにも使える
そして重要なのは、URLを取得する処理を見たらSSRFを疑うことです。
WordPressでも、URLを扱う機能は多いため、実務でも十分に起こりうる問題です。
