Wordpress 権限昇格の脆弱性について

3.6K Views

May 08, 23

スライド概要

本資料はslideshareに掲載していたスライドを移行したものです。
今年2月(2017年)頃に公開され、国内でも被害例を受けたWordpress 4.7.0/4.7.1の脆弱性の検証を行った資料です。

profile-image

都内で働くセキュリティエンジニア

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

WORDPRESS 4.7.0/4.7.1に含まれる 権限昇格の脆弱性検証 資料作成 : 2017/2/7 外部公開 : 2017/7/2 yiwama

2.

はじめに • 今回説明する脆弱性はWordpress4.7.0/4.7.1のみに存在する脆弱 性です。 • 本資料は、作成者の勉強の一環として調査・検証したものになります。 間違った解釈をしている場合は、ご指摘いただければ幸いです。 2

3.

概要 • Wordpressの4.7.0/4.7.1には、REST APIに重大なコンテンツイン ジェクション(権限昇格)の脆弱性が存在します。 • この脆弱性により、認証されていないユーザがWordpressサイト内 の投稿やページ内容を自由に変更する事が出来ます。 • すでに本脆弱性を悪用する実証コード(PoC)が公開されています。 • JPCERT/CCの報告では、すでに国内の複数のサイトが改ざん被害を 受けています。また、本脆弱性を悪用した改ざん事例も確認されてい ます。

4.

対象と対策 • 対象となるWordpress • この脆弱性はREST APIが有効になっている4.7.0と4.7.1が対象となりま す。 • REST APIはデフォルトで有効になっているため、変更されていない場合 で上記のバージョンをインストールしている場合は、本脆弱性の対象とな ります。 • 対策 • WordPress を最新のバージョン(4.7.2)に更新してください。

5.

脆弱性の原因 • 今回の権限昇格の脆弱性は、Wordpress 4.7.0から追加され、標準 で有効のREST API機能が影響しております。 • REST Endpointsは、APIを介してアクセスを許可し、投稿の表示、編 集、削除、作成を行います。 • 本脆弱性は、認証を回避してAPIを操作できてしまう実装ミスに起因 するものです。

6.

脆弱性の原因 • Wordpressの設計では、登録されたルートはIDのパラメータに数字 を入力するようになっています。 • 例) /wp-json/wp/v2/posts/1234 を送信したい場合は、IDに1234を設 定する。 • また、ルートの値よりも$_GETや$_POSTの値のほうが優先度が高い 管理方法になっています。これにより、攻撃者は以下のようなパラ メータを送る事が考えられます。 • /wp-json/wp/v2/posts/1234?id=12345helloworld

7.
[beta]
脆弱性の原因
• Wordpressの設計では、ルートはIDのパラメータに数字を入力する
ようになっています。
• 例) ID 1234を送信したい場合は、
/wp-json/wp/v2/posts/1234 を送信する。

ルートを見て処理

投稿ID 1234の情報ください
/wp-json/wp/v2/1234

利用者

どぞー。(Json形式)
{“id”:1234,”title”:”hello world!”,...}

Wordpress

8.

脆弱性の原因 • ただし、getやpostでリクエストで送った場合、ルート情報ではなくGETや POSTで送られたID情報で処理を行います。 そのため$_GETや$_POSTの値の処理のほうが優先度が高くなっている実装 になっています。 ID値を見て処理 ルート情報は無視される 投稿ID 1234の情報ください /wp-json/wp/v2/1234?ID=456 利用者 どぞー。(Json形式) {“id”:456,”title”:”I have a pen”,...} Wordpress

9.

脆弱性の原因 • 送られてきた情報は、update_item_permissions_checkメソッドで、 送られた投稿IDが、実際に存在する投稿なのか、ユーザがこの投稿を編 集する権限を持っているか、どうかチェックします。 投稿ID 123を 編集したい! update_item_permissions_check 認証済 利用者 OK! ・指定された投稿ページは編集可能なのか? →可能でない場合は、エラー! ・リクエストしたユーザは編集権限を持っているか? →権限をもっていない場合は、エラー! などをチェック! 投稿ID 123を 編集したい! NOOOOO!!!!! 未認証 攻撃者 Wordpress

10.

脆弱性の原因 • しかしupdate_item_permissions_checkメソッドは、存在しないコンテ ンツが送られた場合、trueが返されます! • Trueのあとは、update_itemメソッドに処理が移ります。 投稿ID 123A !? そんなのないよ!!でも処理は通すね。 投稿ID 123A を編集したい! update_item_permissions_check 次の処理の update_itemメソッドへ 攻撃者 Wordpress

11.

脆弱性の原因 • 実際のupdate_item_permissions_checkメソッド 存在しない投稿IDの場合はTrueになってしまう

12.

脆弱性の原因 • 本来であれば、update_itemメソッドに移っても存在しない投稿IDの ため、編集できる投稿がないので処理を終了します。 投稿ID 123A・・・? 存在しないから、編集しようがないよ。 投稿ID 123A を編集シタイ! Update_item 攻撃者 ソンナ投稿IDノ投稿ページハ アリマセーン!!! Postされた情報を基に、投稿内容を書き換える処 理を行う Wordpress

13.

脆弱性の原因 • しかし実際の処理ではUpdate_itemメソッドは、渡されたIDをint型で キャスト(型変換)しています。 • PHPでは型変換の問題により123ABCなどをint型にキャストすると、 int型の123として判定されるため次のget_postに処理が移ってしま (整数)123 い、投稿ID123が書き換わってしまいます。 (文字列)123A 型変換 投稿ID 123を更新します! 投稿ID 123A を編集シタイ! 攻撃者 更新シマシタ! Update_item Wordpress Postされた情報を基に、投稿内容を書き換える処 理を行う 投稿IDはint型にキャスト

14.

脆弱性の原因 • 実際のupdate_itemメソッド Int型に変換している

15.

脆弱性の原因 • まとめ • 認証チェックは、存在しない投稿IDを送ることで回避。 • 登録処理では、PHPの型変換を悪用して存在しない投稿IDから存在 する投稿IDに誤認識させて改ざんを行う。 ルートは設定されているが、POSTリクエストのため、 POSTで処理 update_item_permissions_check POST /wp-json/wp/v2/1/?id=1abc 投稿ID 1abcは存在しないため、認証をスルー 攻撃者 更新シマシタ! Update_item Int型にキャストし、1abcは投稿ID1として判定 Wordpress 投稿ID 1を更新

16.

実証検証 • 4.7.1のWordpressを設置し、標準で用意されているページを確認し ます。

17.

実証検証

18.

実証検証 • このサイトに対して、以下のリクエストを送信します。

19.

実証検証 • もう一度、標準ページを確認します。

20.

実証検証

21.

実証検証 • 本文が改ざんされている事が確認できました。 • この脆弱性を悪用すると本文だけでなく、タイトルなども変更すること が可能です。

22.

実証検証 実証コードによる検証 • 実証コードは、Web上で複数公開されております。 • プログラムに 悪用するサイトのURLを指定します。

23.

実証検証 実証コードによる検証 • 対象サイトでREST APIが動作している場合、動作しているURLを表示 します。 • 次に改ざん可能な投稿がある場合、投稿ID(Post ID)とタイトル、URL を表示します。

24.

実証検証 実証コードによる検証 • プログラムに 悪用するサイトのURLと改ざんしたい投稿ID(Post ID)、 改ざん内容を引数に渡して実行します。

25.

実証検証 実証コードによる検証 • 改ざんが成功すると Update complete!と表示され、プログラムは終 了します。

26.

参考情報 • WordPress WordPress 4.7.2 Security Release • https://wordpress.org/news/2017/01/wordpress-4-7-2-security-release/ • Sucuri Content Injection Vulnerability in WordPress • https://blog.sucuri.net/2017/02/content-injection-vulnerability-wordpress-rest-api.html • 独立行政法人情報処理推進機構 (IPA) WordPress の脆弱性対策につ いて • https://www.ipa.go.jp/security/ciadr/vul/20170206-wordpress.html