WordPressで考えるSSRF│内部ネットワークをスキャンする攻撃|Basic SSRF against another back-end system解説

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つを行います。

  1. 内部ネットワーク(192.168.0.X)をスキャンする
  2. 管理画面を見つけて、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を扱う機能は多いため、実務でも十分に起こりうる問題です。


このブログの運営環境

  • WordPress
  • GeneratePress
  • エックスサーバー

エックスサーバー公式サイト