WordPressの不正ログインについて次の記事にまとめました。

[WordPress]管理ツールの不正ログイン対策を考える
新さっぽろ IT キャリア研究室

しかしながら、最近まで見落としがあって、、、というお話です。

なぜか増える不正ログイン数

WordPressのセキュリティ対策に有効、便利なプラグインにAll In One WP Securityがあります。
(以降 WP Security)

このプラグイン含めセキュリティの対策はしっかり行なっていたつもりでしたが、なぜか WP Security の「ログイン失敗」ログが増え続けており、困っていました。

その画面がこちらです。

All In One WP Security ログイン失敗ログ
All In One WP Security ログイン失敗ログ

WP Securityでは「ログイン施行ログ」を記録してくれますので、ここをチェックすることで攻撃に気づくことができます。

WordPressの管理ツールにログインし[ WP Security > User Login ]に遷移すると表示されるFailed Login RecordsAccount Activity Logsのタブをチェックしてみて下さいね。


きっとどこかにバックドアのようなものがあるはず 」と思いながらも対策を打つことができず放置しておりました。
とは言っても、ログをチェックする限り「 よくあるアカウントやパスワード 」でのログイン施行であり無差別なアタックであると判断できたこともあります。

やっと見つけた、もう一つの入り口

この大量のログイン失敗ログがどこから生成されるのか、手がかりが全くないままソースを探ることにしました。

手順はこういった形でした。

  • WP Securityのログイン失敗ログのデータを管理しているテーブルは何か
  • 対象のテーブにインサートしている処理はどこか
  • インサートされるトリガーがどのように呼び出されているか
  • そのトリガーが引かれるタイミングはいつか

プロジェクト内の一括検索を駆使しつつコードを追っていく中で WP Security のソース中に、以下を発見しました。

1<?php
2add_filter('authenticate', array($this, 'post_authenticate'), 100, 3);
3

なるほど、認証処理をフックに、ログインログをINSERTしているようです。

ここまで分かれば、あとはauthenticateのトリガーが引かれるタイミングを探って行けばOK。
こうしてようやくxmlrpc.phpにたどり着きました。


ちなみにフックとは「ある機能が呼び出された時にひっかけて呼び出す処理」を定義するもので、WordPressではフックに何か追加する時にadd_filter()を使います。

この仕組みによって柔軟に機能を追加することができる、という自由度の高さを実現しているわけなのですが、ちょっと 自由すぎ です。

そして対策へ、、、

原因となるファイルさえわかってしまえば対処することは簡単です。

調べてみると、[ xmlrpc.php ]はピンバックに利用するものですが、 攻撃の踏み台に利用される ことで話題に上っているものなのですね。
私はピンバックを利用しませんため、このファイルに一切アクセスできないようにしました。

サーバにログインして.htaccessに以下の記述を加えます。

1<Files xmlrpc.php>
2Satisfy Any
3Order deny,allow
4Deny from all
5</Files>

環境によっては.htaccessが使えないこともあると思います。

IRITECさんの次の記事をご覧になると解決できると思います。

IRITEC - サーバーが高負荷の原因はWordPressのxmlrpc.phpを狙った攻撃だった
https://iritec.jp/web_service/10258/

IRITECさんありがとうございます。

ピンバックアドレスも塞ぐ

HTMLソースを見ることはあまりありませんが、チェックして見るとしっかりピンバックのアドレスが掲載されておりました。

1<!DOCTYPE html>
2<html lang="ja">
3<head>
4<meta charset="UTF-8">
5  <meta name="viewport" content="width=1280, maximum-scale=1, user-scalable=yes">
6<link rel="alternate" type="application/rss+xml" title="atuweb 開発ブログ RSS Feed" href="http://atuweb.net/feed/" />
7<link rel="pingback" href="http://atuweb.net/xmlrpc.php" />

先の修正でアクセス禁止にはしていますが、 攻撃の手がかりとなりうる情報を隠蔽すること はWebセキュリティの基本ですね。

こちらも隠蔽しておきましょう。


当ブログはSimplicityを利用しており、今回カットしたいpingbackの出力は子テーマではなく親テーマに記載されております。

一応親テーマの[ header.php ]をコピーし、子テーマにコピーして編集します。

1$ cp simplicity2/header.php simplicity2-child/header.php

以下の行を削除します。

1<link rel="pingback" href="<?php bloginfo('pingback_url'); ?>" />
2

再度ソースを表示させてみて、無事対象の行がなくなっていることが確認できました。

おわりに

同じような状態でお困りの方がいらっしゃればと思い記事にまとめました。

しかしながら、事前に情報をキャッチしていれば、すぐに対処することができた内容です。 悔しい。

そうは言っても、WordPressはしっかり中身まで見られていなかったため、少しでも中身を見れたことは良い勉強になりました。

メジャーなものを使う事にはメリットもデメリットもありますね。

Web担当者のためのセキュリティの教科書

株式会社アズジェント/中山貴禎
出版社:エムディエヌコーポレーション  発売日:2017-03-02

Amazonで詳細を見る

この記事の著者 Webrow (うぇぶろう)
Web アプリ開発、 Web 顧問 エンジニア、WordPress サポートいたします。