WordPressの重大な脆弱性の検証

標準

2017年2月17日、Wordpressに重大なREST APIに関する脆弱が存在することが公表されました。

WordPress の脆弱性対策について – IPA

あまりにも重大すぎて、パッチが配布されるまで脆弱の存在の公表を遅らせるほどでした。この脆弱はREST APIの不具合を利用することで、ユーザー認証を必要とせずにWordpressに投稿されている記事を簡単に書き換えることが出来てしまいます。今回はこの脆弱をWindowsで実際にWordpressを仮想環境で構築して検証していきます。また、この脆弱を利用して他人のサイトを不正に書き換えることは国内法に抵触しますので、真似は自分の中だけで終わらせてください。

WindowsにDocker環境を整備する

簡単にWordpressの仮想環境を構築するために今回はDockerを使っていきます。(WordPressの仮想環境を作る方法は色々とありますので、ここらへんは個人の好みで。) また、この方法はWindows10 proでないと出来ない工程もありますので、ご注意ください。

まずはDockerのインストーラーを公式サイトからダウンロードします。適当にstable版などをご利用ください。

インストールが完了すると、Dockerが起動します。しっかりと起動するまでに少し時間がかかるので、気長にお待ち下さい。

しっかりと起動しましたら、DockerのServerが稼働していることをPowerShellで確認します。

> docker version
Client:
 Version:      17.06.0-ce
 API version:  1.30
 Go version:   go1.8.3
 Git commit:   02c1d87
 Built:        Fri Jun 23 21:30:30 2017
 OS/Arch:      windows/amd64

Server:
 Version:      17.06.0-ce
 API version:  1.30 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   02c1d87
 Built:        Fri Jun 23 21:51:55 2017
 OS/Arch:      linux/amd64
 Experimental: true

Serverの部分が確認されずエラーが発生している場合は、Dockerが起動しきっていないかHyper-Vを有効にする必要があります。 コントロールパネル→プログラムと機能→Windowsの機能の有効下または無効化 からHyper-Vを有効にしてからもう一度試してみてください。

次にDockerの構成情報をまとめていきます。適当なディレクトリを作成し、その中に docker-compose.yml を作成し、以下のようにします。

version: '2'
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:4.7.0
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: wordpress

volumes:
  db_data:

ファイルを作成し終えたらPowerShellのカレントディレクトリをdocker-compose.ymlが存在するディレクトリに変更して

> docker-compose pull
> docker-compose build
> docker-compose up -d

これでイメージをビルドして起動するまでがおしまいです。しっかりと起動しているか確認するために

> docker ps

でしっかりとwordpressがport:8000で起動しているかを見ます。

正常な起動を確認できましたら、ブラウザで http://127.0.0.1:8000/ にアクセスします。もし正常なレスポンスがなければまだWordpressが起動しきってないかもしれないので、1分くらい待ってみてください。
この辺りの作業はMastodonで何回もやったので慣れたもんですね。

WordPressの初期設定を一通り終えると以下のようにサイトが表示されます。

これでWordpressの仮想環境の構築はおしまいです。こんな簡単にWindowsで出来るとは。

早速攻撃してみる

今回はChromeアプリのAdvanced REST clientを使っていきます。指定したURLにリクエスト出来るのであれば利用するツールの種類は問いません。

一番最初の投稿の記事IDが1なので、以下のURLにtitleとcontentをPOSTしてみます。

http://127.0.0.1:8000/wp-json/wp/v2/posts/1?id=1

このように、普通のURLでは 401 – Unauthorized が返ってきて、記事を書き換えることなんて出来ません。しかし、

http://127.0.0.1:8000/wp-json/wp/v2/posts/1?id=1abc

上記のURLに対して同様にtitleとcontentをPOSTしてみます。すると、

なんと、処理が完了して 200 – OK が返ってきてしまいました。実際に投稿の方を見てみますと、

確かに、記事が書き換えられていることが確認できます。

原因は何か

この脆弱はPHPの厄介な仕様で起こってしまう脆弱です。詳しくは Content Injection Vulnerability in WordPress を見ていただければ全てが分かると思いますが、端折って説明しますと、

$request = array("id"=>"1abc");
$id = (int)$request['id'];
var_dump($id);

// int(1)

このようにして不正にIDがキャストされてしまい、しっかりとした判断ができなくなってしまうのです。困った!

まとめ

こうしてWordpressの脆弱を検証することが出来ました。自分の手で作業をしてみると、まさかこんなに簡単な手順でページが改ざん出来るとは… 私自身もWordpressやMastodonを運営していますので、こういったセキュリティホールなどに関する情報には常に敏感になってないといけないですね。

投稿者プロフィール

yoshipc

コンピューター関連を得意としています。PHPが専門です(尚、技量はお察し)。このブログとMastodonのインスタンスを運営・管理しています。よろしくお願いいたします。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です