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を運営していますので、こういったセキュリティホールなどに関する情報には常に敏感になってないといけないですね。

WordPressを軽量化する

標準

はじめに

ウェブページのロード時間が訪問者のその後の行動に大きく影響を与えることは広く知られていますし、日々のネットサーフィンを思い返してみてもそれは自明です。こちらのマーケティングなどの解析をテーマにしているブログでは

  • 47%の利用者が2秒以内のロード時間を望んでいる
  • 40%の利用者が3秒以上のロード時間では閲覧を諦める

と記述されている程です。

当サイトの実情

P3 (Plugin Performance Profiler)というロードに必要な時間などを計測する専用のプラグインで計測してみたところ、以下のような結果が出ました。


計測結果によるとロード完了までに3.42秒かかっています。これでは遅すぎます。せめて2秒台に収めたいですね。ということで対策を講じていきます。

具体的な対策

今回はWP Super Cacheというプラグインを利用していきます。画像の方の対策はあまりロード時間には一般的には影響を及ぼさなさそうなのでしません。

基本的には設定画面にあるものを推奨に持っていくだけで大丈夫です。これだけでも凄く効果があります。

効果はいかほど?

これらの設定を施した後に再びロード時間を計測してみます。

効果は絶大ですね!なんとロード時間は1.50秒まで短縮されました。これでロード時間の長さによる直帰率は大分下げられたはず・・・閲覧数が増えると良いな。

最後に

慣れていれば5分位で軽量化出来るので世の中はとても便利ですね。ロード時間の長さで悩んでいるサイト管理者の方はぜひ試してみてください。

WordPressをスパムから守る

標準

最近当サイトにもスパムが多く襲うようになりました。

スパム

上の画像は実際に当サイトに送られたスパムコメントの一例です。多い日にはこのようなメッセージが1日に4~5件届きます。

今回はこのようなただの迷惑なスパムコメントを徹底的に除去するために施した処置についてまとめていきます。

プラグイン導入

早速スパム対策に特化したプラグインを入れていきます。その名も「Akismet」です。評価は5点中4.8点と非常に高く、スパム対策系のプラグインでは老舗と言った感じです。

では早速インストールしてみます。設定画面を開くとこのような感じの画面になります。

akismet初回起動画面

このプラグインはakismetのアカウントを取得した上で、APIキーを取得する必要があります。

https://akismet.com/wordpress/

こちらのページからakismetのアカウントを作成します。wordpress.comのアカウントがあれば即刻ログインできます。アカウント作成、ログインなどが成功すると、プランの設定画面が出てきます。理由がなければ「Get Basic」を選択し、無料で始めるのがいいと思います。

無料のプランで始めても次の画面で再び違うプランに行くように誘導されるので注意します、具体的には支払画面が出てくるんですね。ここでは支払金額のレンジを0にすることで、無料で次に進めます。

支払画面でレンジを0に

最初は戸惑いますよね。0ドルにするとcontinueだけの画面になるので、そのままコンテニューします。

アクティベート画面

するとこのような画面が出てきます。内容に相違なければ、Activate this siteをクリックします。すると、自分のサイトにリダイレクトされて作業は終了です。もしリダイレクトされなければ、以下の画像のようにAPIキーを自分でコピーしてWordpess側で手動入力し、アクティベート終了です。

APIキー

目のアイコンをクリックすると、アスタリスクが解除されます。

以上でスパム対策の作業は完了になります。

効果は?

導入して1日経ったところでAkismetのダッシュボードを見ると以下のようになっていました。

akismetのダッシュボード

ちゃんとブロックされているのがわかります。ちなみにに設定での「厳密度」は「スパムを常にスパムフォルダーに振り分けレビューする。」に設定しています。これで十分すぎるくらいですね。

プラグインの導入でスパムに触れないwordpressライフを送りましょう。