脆弱性診断から見たWordPressのセキュリティ対策

2020-09-30

WordPressは多くのブログやWEBサイトで利用されていますが、それは同時にハッカーの標的にされやすいということでもあります。スパムメールを送りつけられるようなことから、アクセスした人を悪意のあるサイトへ誘導するための踏み台になってしまったり、脆弱性を突いてデータベースの情報を抜かれたり、様々な問題が発生する可能性が少なく有りません。

例えば個人情報がそれほど含まれない(アカウントのメールアドレスは別として)ブログとしての運用であったとしても、同じデータベースを使った個人情報を管理するプログラムが有ると、WordPressの脆弱性を突いてWordPress以外のテーブルも抜かれるかもしれません。もちろんデータベースを別にするのが当然のことなのですが。

STUDIO KEYが制作したWEBシステムへの脆弱性診断の他に、WordPressがあればそれも診断対象となった案件が幾つか有りましたので、指摘された件を幾つか紹介したいと思います。

バージョン情報を非表示にする

WordPressには脆弱性の存在するバージョンが有り、アップデートしないまま利用していると危険です。可能ならばメージャーアップデートの自動更新は有効にすべきですが、PHPバージョンが古すぎてアップデート出来ないケースも有ります。これを非表示にすることで対策します。

WordPressバージョンの非表示

meta name="generator" content="WordPress 5.4.2"

デフォルトのままでは上のコードがヘッダーに挿入されますので、以下をfunction.phpに追記して非表示にします。

/*
 * WordPressのバージョン情報を非表示
 */
remove_action('wp_head','wp_generator');

javascriptやcssの末尾のバージョン情報を非表示


上図のように末尾にバージョンが付いてしまいますので、以下をfunction.phpに追記して非表示にします。

/*
 * js,cssバージョン情報を非表示
 */
function remove_cssjs_ver( $src ) {
    if ( strpos( $src, 'ver=' ) )
        $src = remove_query_arg( 'ver', $src );
    return $src;
}
add_filter( 'style_loader_src', 'remove_cssjs_ver', 9999 );
add_filter( 'script_loader_src', 'remove_cssjs_ver', 9999 );

アーカイブ情報を提供しない

function not_archive( $query ) {
	if ( ! is_admin() && is_author() ) {
		$query->set_404();
		status_header( 404 );
		nocache_headers();
	}
}
add_filter( 'parse_query', 'not_archive' );

WordPressで運用されているサイトのURL末尾に?author=1を付けてアクセスすると投稿者アーカイブが表示されます。

仮にadminでアカウントを作った場合は上記のようにユーザー名が判明していまいます。

ログインページを分かり難くする

WordPressのログインページは公開情報です。デフォルトのままですと/wp-login.phpへアクセスすることで、誰でもログインを試すことが出来てしまいます。ログインページのURLは他者から見えないよう、分かり難くします。

SiteGuard WP Plugin
https://ja.wordpress.org/plugins/siteguard/

他にもログインページを変更するプラグインは有りますが、SiteGuardはその他に画像認証ログインロックなど多数の機能を備えています。仮にブルートフォース攻撃でログインページが漏れてしまっても、画像認証があれば機械的なリスト攻撃等に対して有効です。

公開不要と推測されるファイルの検出

例えば前述したSiteGuard WP Pluginがインストールされいるディレクトにある/wp-content/plugins/siteguard/readme.txtがそれにあたります。readmeファイルには重要な情報が書かれている可能性が有るので、外部から参照出来なくします。但し、.htaccess等でWEBブラウザ経由等からのアクセスを禁止してしまうと、自動・手動アップデートに影響が出る可能性が有るため、プラグインのreadme.txtを削除するプログラムを書いて定期的に実行するようにしました。

 


WordPress製の判断は簡単に出来ますので、何となく/wp-login.phpを付けてアクセスしてみるのですが、実に多くのサイトが対策をしていません。適当にログインを試行してもロックも掛からず、何度でも送信が可能なサイトもありました。もしログインされてしまう悪意あるサイトへ誘導するコードを仕込まれたりなど、サイトを訪れる人にも迷惑を掛けてしまう可能性が有ります。

確かにログインURLを忘れてしまったり、ログインするたびに画像認証するのは面倒ですが、WordPressで運用する以上、最低限ログインページの変更は行うべきです。