ご覧のページは 3 / 6 です。先頭ページはこちら。
Step3. WordPressのログインユーザー名を取ろうとする。
1.034 - - 159.242.234.106 - - [17/Apr/2021:06:23:07 +0900] "GET //?author=1 HTTP/1.1" 404 157610 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4240.193 Safari/537.36" "-"
1.848 - - 159.242.234.106 - - [17/Apr/2021:06:23:09 +0900] "GET //?author=2 HTTP/1.1" 404 157610 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4240.193 Safari/537.36" "-"
1.715 - - 159.242.234.106 - - [17/Apr/2021:06:23:10 +0900] "GET //?author=3 HTTP/1.1" 404 157610 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4240.193 Safari/537.36" "-"
これはけっこう危ない話です。不正ログインをするにはログインユーザー名とパスワードが必要ですが、WordPressではデフォルトのままだとユーザー名をかんたんに取れます。
WordPressにはユーザーのアーカイブページという標準機能があり、なぜかそのページのURLはログインユーザー名を使います。
https://sample.com/author/(ログインユーザー名)
ウソーん! と思う仕様ですがしょうがない、そうなっています。ユーザー名を知られてしまうとあとはパスワードだけなのでセキュリティがぐんと下がります。
数値(ユーザーID)からログインユーザー名がかんたんに見れる
これを狙ってるのが上のログ。"https://sample.com/?author=(user id)" は、ユーザー・アーカイブページのもうひとつのURLで、"/author/(usesr name)" にリダイレクトされます。
数値でリクエストしたらログインユーザー名がかんたんに知られる仕組み。
自分の場合は3までしかリクエストは来てないですが、人によっては20ぐらいまで行くこともあるらしい。Not Found (404) を返しているから3で済んでいるのかな?
このユーザー名が表示されてしまうセキュリティリスクはWordPressではよく知られているので、対応の仕方はちょっとググればいくらでも出てきます。
ユーザーのアーカイブページを使わない。
ユーザーのアーカイブページは、作成者が投稿したものだけをリスト表示するアーカイブページで、ユーザーごとに用意されます。
しかし、ユーザーがページの作者として独立しているサイトは使うかもしれませんが、使わない人も多いでしょう。
そこで行うのがユーザー・アーカイブページの無効化です。
ユーザー・アーカイブページは、ニュースサイトや出版社、ジャーナリズムのサイトなどでよく使われます。
こういう作者の独立性が高いものでは使いますが、それ以外の使いみちはあまりない。
ユーザーのアーカイブページは author.php のテンプレートを使います(なければ archive.php)が、そのテンプレートをロードする前に、Not Foundページ(404.php)のテンプレートへ矛先を変えます。
ユーザー・アーカイブページは404ページ(Not Found)に変更
add_action( 'template_redirect', function() {
if( is_author() ){
global $wp_query;
$wp_query->set_404();
status_header( 404 );
}
});
このコードをテーマやプラグインのルートphpファイル(functions.phpや (plugin name).php ))から読み込まれるように挿入してください。
よくテーマのfunctions.phpにコードを挿入する説明が見られますが、よくありません。テーマは本来機能を入れるものではないので。
本来やるべきではありませんが、テーマに入れる場面ではfunctions.phpにいろいろな処理を入れると、数百行、へたすると千単位にもわたる縦長のソースコードになってしまいます。
その記述はプログラマの書くものではありません。機能、役割ごとにファイルを分割するのがプログラミングの基本中の基本。
functions.phpは、requireを使って各機能のphpファイルをロードする親ファイルに徹してください。
これだけだと、"https://sample.com//?author=〇〇" は、"https://sample.com/author/〇〇" を404で返してURLからログインユーザー名が見えてしまうので意味がありません。
そこで、セキュリティ関係のプラグインを使います。
インストール・有効化だけでもOK。WordfenceじゃなくてもセキュリティのプラグインならWordPressでよく知られたセキュリティリスクを軽減してくれます。
必ずひとつはインストールしときましょう。これで、"https://sample.com//?author=〇〇" のURLのまま404を返してくれます。
author.phpでwp_redirect()を使って404ページにリダイレクトする方法もありますが、この方法もURLにログインユーザー名が表示されます。
(ユーザー・アーカイブページのURLのまま404ページ表示。)
そして、テンプレートでURLを変更する方法はない。
(あるのかもしれないが、そのやり方はしない。テンプレートとURLは内部で紐付けられているから。)
- P1 不正アクセスを試されたログ
- P2 Step2. ブログ編集ツールの設定情報へのアクセス
- P3 Step3. WordPressのログインユーザー名を取ろうとする。
- P4 Step4. REST APIからユーザー情報を取ろうとする。
- P5 Step5. oEmbedから情報を取ろうとする。
- P6 Step6. xmlrpcからブルートフォースアタック。