WordPressのREST APIの脆弱性
2月当初から話題になっているWordPressの脆弱性の検証を調べてみました。
2月の2週目の頭くらいに改竄速報さんが荒ぶってまして、その原因がこのWordPressの脆弱性をついたWeb改ざんのようです。
改ざん被害について、Web改竄速報さんがまとめてくれています。
2017年2月に発生した「WordPress」の脆弱性に対する攻撃についてのレポート
とても簡単なリクエストで改ざんされるので、情報が公開されてから、日本のものを含め、大量のWebサイトが改ざんされました。
各所で注意喚起がなされています。
WordPress の脆弱性対策について:IPA 独立行政法人 情報処理推進機構
WordPressの脆弱性に関する注意喚起[みんなでしっかりサイバーセキュリティ]
運用している方はすぐに最新のもにアップデートしましょう。
技術的な内容については下記の記事(徳丸さんのブログ)が詳しいです。
リクエストのパラメータでエラーを起こすと、書き込み権限のチェックが正常に行われず、記事の更新が実行されてしまうようです。
この脆弱性があるのでWordPressの4.7と4.7.1です。REST APIがデフォルトで有効になっており、当該バージョンであれば、攻撃が成功する可能性が高いです。
・脆弱性検証
簡単にできるので、ちょっと検証してみました。バージョンはWordPressの4.7.1です。
インストールして、改ざんように記事を用意しました。
この記事に対して、攻撃を行います。
POSTリクエストのパラメータは「?id=1A」みたいに「記事のID(数字) + {文字}」のようになります(数字が入るはずの場所に文字を混入させてエラーを起こす。)
POSTのボディに改ざんするデータをJSON形式で渡します。(今回は記事の内容を「Hacked by me」に改ざんします)
改ざんされました。
ちなみに、ここでPHPやjavascriptのコードを書いても消されてしまいます。なので、バックドアの設置とか、サーバ自体への攻撃は難しいようです。その辺は結構しっかりしてるみたいですね。
ただ、コードを直に書けるプラグインなどが入っていれば攻撃は行われるようです。
上記の記事では PHPコードを記事内で実行するためのプラグインとしてInsert PHP や Exec-PHP などと紹介されています。
ということで、検証してみたのですが、せっかくなので、別のプラグインで試してみます(というか、Insert PHP がうまくいかなかった)。
「inline-javascript」というプラグインを入れて、javascriptを実行してみます。
内容は下記のような感じ。
[inline]
<script type="text/javascript">
alert('Hacked!!!');
</script>
[/inline]
で、改ざんします。
できました。
試した内容は以上ですが、コード実行関係のプラグインは他にも色々ありそうです。今回の脆弱性はプラグインではなく、WordPress本体のものです。Wordpressのアップデートを実施しましょう。できなければ、次善策としてREST APIの無効化ですかね。
これだけ大きく被害があり、話題になれば、対策しない人のほうが少ないんじゃないかなんて思いますが、環境によってはコード実行まで行われますので、そうした環境を狙った攻撃が行われていく可能性があります。
アップデートしましょう。それだけです。