koulab

技術系のメモ

WP-Members Membership Pluginなどの会員制プラグインを利用した際のWP REST API経由によるファイルおよびコメント等情報漏洩の危険性

WP-Members Membership Plugin

WordPress標準のパスワード保護を適用するとコメントに関するエンドポイント/wp-json/wp/v2/comments?post={id}もブロックされます

{"code":"rest_cannot_read_post","message":"Sorry, you are not allowed to read the post for this comment.","data":{"status":401}}

しかしメディアに関するエンドポイントはパスワード保護をしていても取得できてしまいます /wp-json/wp/v2/media?parent=14

パスワード保護が無効でWP-Membersのみ適用している場合はブロックされずコメントの取得もできてしまいます。 WP-MembersとWordPress標準のパスワード保護は一部競合するため併用は原則できません また、メディアをアップロードしたファイルはデフォルトで個別のページが作成されます。

 メディアの個別ページをブロックしても、結局のところファイルへのダイレクトアクセスは回避できません

"source_url": "http://wp-vuln.example.net/wp-content/uploads/2018/09/12e466d7bf38a95c4b1994199c896e23.txt",
[root@wpvuln ~]# curl -v http://wp-vuln.example.net/wp-content/uploads/2018/09/12e466d7bf38a95c4b1994199c896e23.txt
* About to connect() to wp-vuln.example.net port 80 (#0)
*   Trying 127.0.0.1...
* Connected to wp-vuln.example.net (127.0.0.1) port 80 (#0)
> GET /wp-content/uploads/2018/09/12e466d7bf38a95c4b1994199c896e23.txt HTTP/1.1
> User-Agent: curl/7.29.0
> Host: wp-vuln.example.net
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx
< Date: Mon, 24 Sep 2018 14:04:58 GMT
< Content-Type: text/plain; charset=UTF-8
< Content-Length: 34
< Last-Modified: Mon, 24 Sep 2018 13:24:32 GMT
< Connection: keep-alive
< ETag: "5ba8e590-22"
< Accept-Ranges: bytes
<
社外秘
あああああああ
* Connection #0 to host wp-vuln.example.net left intact
[root@wpvuln ~]#

  他の類似プラグインで確認した結果は以下となります

Simple Membership

メディア個別ページのブロック可能 WP-REST APIのブロック不可 ダイレクトアクセスはブロックされない

Ultimate Member

メディア個別ページブロック可能 WP-REST APIブロック可能 メディアの詳細ページでHide for queriesにチェックを入れる ただし投稿とコメントはHide for queriesにチェック入れてもブロック不可 ダイレクトアクセスはブロックされない

回避策

WordPressを利用した会員制のサイトは作成しないでください。WordPressプラグインのみでメディアファイルへのダイレクトアクセスを制限することは不可能です また、すでに稼働中の場合はXML-RPCおよびWP REST APIを無効にし、サイト全体にDigest認証などを施してください 無効にすると一部のプラグインなどが正常に動作しなくなる可能性があります。