: WordPress 4.7.1 より前のバージョンにおいて、wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php にある REST API の実装では投稿者リストを制限していないため、リモート攻撃者が wp-json/wp/v2/users リクエストを通じて重要な情報を取得できる脆弱性。
( 参考 : https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5487 )
何を言っているのか分からないので、背景知識について調べた上で実践を通して理解していこう。
背景知識が不要だと思ったら [3] から見ればよい。
: 簡単に言えば「何をどのようにするか」を定義した API を REST API と呼ぶことができる。
: もう少し詳しく説明すると、HTTP URI で定義されたリソースを HTTP メソッドとペイロードを使ってどのようにするかというのが REST API である。
: REST = REpresentational State Transter の略称
2.1 HTTP URI で定義されたリソース
: リソースとは処理される対象を意味する
ex) JSON、XML 文書、jpg などの画像ファイル、mp4 などのビデオファイルなどなど..
: URI とは Uniform Resource Identifier の略で、統合リソース識別子である。私たちがよく見る URL も URI の一部であり、何らかのリソースを識別するものを指す。
ex) http://rootable.tistory.com/user/test を通じて test というユーザーに関する情報を取得できるならば、これもまた URI である。
2.2 HTTP Method
: このメソッドは、リソースがどのような形式であっても関係なく同じように動作する。
: REST API で使用されるメソッドには POST、GET、PUT、PATCH、DELETE などがある。注意すべき点は、私たちが考える機能とは異なるということだ。例えば POST の場合、私たちはサーバーにデータや文書をリクエストするときに使うメソッドだと思うが、REST API の場合は作成(create)機能を行う。
HTTP Method
CRUD 演算
POST
create
GET
read
PUT
update / replace
PATCH
update / modify
DELETE
delete
ex) http://rootable.tistory.com の users に doni というユーザーを追加するという REST API
POST http://rootable.tistroy.com/users/doni
ex) ユーザー作成時に職業、年齢、性別などのさまざまな特性が必要な場合、XML や JSON などのさまざまな表現言語を Body 部分に明示して登録
POST http://rootable.tistory.com/users Content-Type: application/json
{
"username" : "doni"
"age" : "27"
}
: REST API はリソースをどうするかというあらかじめ定義された API だと述べた。それでは WordPress で定義された REST API には何があるだろうか?
以下の表を参考にしよう。
Resource Base Route Posts /wp/v2/posts Post Revisions /wp/v2/revisions Categories /wp/v2/categories Tags /wp/v2/tags Pages /wp/v2/pages Comments /wp/v2/comments Taxonomies /wp/v2/taxonomies Media /wp/v2/media Users /wp/v2/users Post Types /wp/v2/types Post Statuses /wp/v2/statuses Settings /wp/v2/settings さまざまな REST API が定義されていることが分かる。ここに、今回取り上げる CVE に出てくる /wp/v2/users があることが分かる。
4.1. 投稿者の情報の取得
以下は EXPLOIT DB で見つけたコードである。( https://www.exploit-db.com/exploits/41497/ )
コードを見れば分かるように、単に処理結果をきれいに整理して画面に表示するだけである。わざわざこのエクスプロイトコードを使わなくても直接アクセスすれば情報を得られるので、きれいに見せるために FU 脆弱性にまで踏み込む必要はないと思う。
#!usr/bin/php
これを WordPress をインストールした場所に PHP コードとして保存して実行すると、以下のように結果が表示される。
直接アクセスする場合は以下のように表示される。(よく見えない場合はクリック)
これを通じて得られる情報は、記事を書いたユーザーの ID、name などの情報を取得できる。
参考) 登録されているすべてのユーザーが見えると思っていたが、テストした結果、投稿者のアカウントだけが見えるということだ。CVE の説明を見ると author という単語があるが、これがまさに投稿者という意味のようだ。
4.2 ファイルアップロードパスの取得
WordPress の REST API の中に /wp/v2/posts がある。これにアクセスすると、以下のように投稿した記事に関する情報が見えるが、その中で示したようにファイルアップロードパスを取得できる。FU 脆弱性が発見されれば大きな助けになると思われる。
4.7 バージョンでも setting を表示したり記事を修正したりすることは不可能なようだ、
設定を見ようとした場合、rest_forbidden が表示され、アクセスが拒否される。
最初の記事を修正しようとした場合、記事を読むことができないというメッセージが表示される。
user を見ることよりもこれの方が重大なことだろうが、少し残念だ.. 検索結果によると、これに該当する脆弱性はないようだ。ただし、4.7.1 より前のバージョンに対して、他のユーザーの記事を修正できる脆弱性が存在するようだ。これについては次の投稿で取り上げていこう。
参考)
REST API 説明 : http://blog.naver.com/PostView.nhn?blogId=complusblog&logNo=220986337770
ダウングレード (やっていて進行できず再インストールしたので、新しくインストールすることをお勧めする)