WORDPRESS 4.7.0/4.7.1に含まれる
権限昇格の脆弱性検証
資料作成 : 2017/2/7
外部公開 : 2017/7/2
yiwama
はじめに
• 今回説明する脆弱性はWordpress4.7.0/4.7.1のみに存在する脆弱
性です。
• 本資料は、作成者の勉強の一環として調査・検証したものになります。
間違った解釈をしている場合は、ご指摘いただければ幸いです。
2
概要
• Wordpressの4.7.0/4.7.1には、REST APIに重大なコンテンツイン
ジェクション(権限昇格)の脆弱性が存在します。
• この脆弱性により、認証されていないユーザがWordpressサイト内
の投稿やページ内容を自由に変更する事が出来ます。
• すでに本脆弱性を悪用する実証コード(PoC)が公開されています。
• JPCERT/CCの報告では、すでに国内の複数のサイトが改ざん被害を
受けています。また、本脆弱性を悪用した改ざん事例も確認されてい
ます。
対象と対策
• 対象となるWordpress
• この脆弱性はREST APIが有効になっている4.7.0と4.7.1が対象となりま
す。
• REST APIはデフォルトで有効になっているため、変更されていない場合
で上記のバージョンをインストールしている場合は、本脆弱性の対象とな
ります。
• 対策
• WordPress を最新のバージョン(4.7.2)に更新してください。
脆弱性の原因
• 今回の権限昇格の脆弱性は、Wordpress 4.7.0から追加され、標準
で有効のREST API機能が影響しております。
• REST Endpointsは、APIを介してアクセスを許可し、投稿の表示、編
集、削除、作成を行います。
• 本脆弱性は、認証を回避してAPIを操作できてしまう実装ミスに起因
するものです。
脆弱性の原因
• Wordpressの設計では、登録されたルートはIDのパラメータに数字
を入力するようになっています。
• 例) /wp-json/wp/v2/posts/1234 を送信したい場合は、IDに1234を設
定する。
• また、ルートの値よりも$_GETや$_POSTの値のほうが優先度が高い
管理方法になっています。これにより、攻撃者は以下のようなパラ
メータを送る事が考えられます。
• /wp-json/wp/v2/posts/1234?id=12345helloworld
脆弱性の原因
• Wordpressの設計では、ルートはIDのパラメータに数字を入力する
ようになっています。
• 例) ID 1234を送信したい場合は、
/wp-json/wp/v2/posts/1234 を送信する。
利用者 Wordpress
投稿ID 1234の情報ください
/wp-json/wp/v2/1234
どぞー。(Json形式)
{“id”:1234,”title”:”hello world!”,...}
ルートを見て処理
脆弱性の原因
• ただし、getやpostでリクエストで送った場合、ルート情報ではなくGETや
POSTで送られたID情報で処理を行います。
そのため$_GETや$_POSTの値の処理のほうが優先度が高くなっている実装
になっています。
利用者 Wordpress
投稿ID 1234の情報ください
/wp-json/wp/v2/1234?ID=456
どぞー。(Json形式)
{“id”:456,”title”:”I have a pen”,...}
ID値を見て処理
ルート情報は無視される
脆弱性の原因
• 送られてきた情報は、update_item_permissions_checkメソッドで、
送られた投稿IDが、実際に存在する投稿なのか、ユーザがこの投稿を編
集する権限を持っているか、どうかチェックします。
利用者
Wordpress
攻撃者
・指定された投稿ページは編集可能なのか?
→可能でない場合は、エラー!
・リクエストしたユーザは編集権限を持っているか?
→権限をもっていない場合は、エラー!
などをチェック!
update_item_permissions_check
投稿ID 123を
編集したい!
OK!
投稿ID 123を
編集したい!
NOOOOO!!!!!
認証済
未認証
脆弱性の原因
• しかしupdate_item_permissions_checkメソッドは、存在しないコンテ
ンツが送られた場合、trueが返されます!
• Trueのあとは、update_itemメソッドに処理が移ります。
Wordpress
攻撃者
update_item_permissions_check
投稿ID 123A
を編集したい!
投稿ID 123A !?
そんなのないよ!!でも処理は通すね。
次の処理の update_itemメソッドへ
脆弱性の原因
• 実際のupdate_item_permissions_checkメソッド
存在しない投稿IDの場合はTrueになってしまう
脆弱性の原因
• 本来であれば、update_itemメソッドに移っても存在しない投稿IDの
ため、編集できる投稿がないので処理を終了します。
Wordpress
攻撃者
Update_item
投稿ID 123A を編集シタイ!
投稿ID 123A・・・?
存在しないから、編集しようがないよ。
Postされた情報を基に、投稿内容を書き換える処
理を行う
ソンナ投稿IDノ投稿ページハ
アリマセーン!!!
脆弱性の原因
• しかし実際の処理ではUpdate_itemメソッドは、渡されたIDをint型で
キャスト(型変換)しています。
• PHPでは型変換の問題により123ABCなどをint型にキャストすると、
int型の123として判定されるため次のget_postに処理が移ってしま
い、投稿ID123が書き換わってしまいます。
Wordpress
攻撃者
Update_item
投稿ID 123A を編集シタイ!
Postされた情報を基に、投稿内容を書き換える処
理を行う
投稿IDはint型にキャスト
更新シマシタ!
(文字列)123A (整数)123
型変換
投稿ID 123を更新します!
脆弱性の原因
• 実際のupdate_itemメソッド
Int型に変換している
投稿ID 1abcは存在しないため、認証をスルー
脆弱性の原因
• まとめ
• 認証チェックは、存在しない投稿IDを送ることで回避。
• 登録処理では、PHPの型変換を悪用して存在しない投稿IDから存在
する投稿IDに誤認識させて改ざんを行う。
Wordpress
攻撃者 Update_item
POST /wp-json/wp/v2/1/?id=1abc
Int型にキャストし、1abcは投稿ID1として判定
投稿ID 1を更新
更新シマシタ!
update_item_permissions_check
ルートは設定されているが、POSTリクエストのため、
POSTで処理
実証検証
• 4.7.1のWordpressを設置し、標準で用意されているページを確認し
ます。
実証検証
実証検証
• このサイトに対して、以下のリクエストを送信します。
実証検証
• もう一度、標準ページを確認します。
実証検証
実証検証
• 本文が改ざんされている事が確認できました。
• この脆弱性を悪用すると本文だけでなく、タイトルなども変更すること
が可能です。
実証検証 実証コードによる検証
• 実証コードは、Web上で複数公開されております。
• プログラムに 悪用するサイトのURLを指定します。
実証検証 実証コードによる検証
• 対象サイトでREST APIが動作している場合、動作しているURLを表示
します。
• 次に改ざん可能な投稿がある場合、投稿ID(Post ID)とタイトル、URL
を表示します。
実証検証 実証コードによる検証
• プログラムに 悪用するサイトのURLと改ざんしたい投稿ID(Post ID)、
改ざん内容を引数に渡して実行します。
実証検証 実証コードによる検証
• 改ざんが成功すると Update complete!と表示され、プログラムは終
了します。
参考情報
• 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

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