WordPressの機能を悪用した攻撃について
近ごろ(2016年4月~)、WordPressにて「xmlrpc.php」と「wp-cron.php」という機能を狙ったブルートフォースアタック(パスワード総当たり攻撃)が 世界的に多く観測されており、その結果、サーバー負荷によりサイトにアクセスできないようになってしまう現象が確認されております。
○xmlrpc.php
Pingback機能(自分の投稿に対してリンクが貼られたことを通知する機能)や、
Wordpressの管理画面以外(スマホのアプリや、メールなど)から記事を投稿する際に、
使用される機能になります。
○wp-cron.php
予約投稿やテーマのアップデートなどを行う際に、使用される機能となります。
お客様のWordPressで上記の機能を利用されていない場合は、以下のいずれかの方法で対策を行うことができます。
- ・対象ファイルのパーミッションを000に変更する
- ・「.htaccess」ファイルの設定変更を行い、アクセス禁止にする
「.htaccess」ファイルの記述例は以下になりますので、ご参照ください。
.htaccess
<Files "xmlrpc.php">※ファイルの上部に追記してください。
order deny,allow
deny from all
</Files>
WordPressのセキュリティ対策の重要性
WordPress は、日本でも海外でも非常に人気のあるコンテンツ管理システム(CMS)です。利用者が非常に多く、 それを悪用しようとする者も非常に多いです。WordPress をセキュリティ対策を何もとらずに利用していると、 様々な危険に晒されたままの状態になり、 非常に危険です。 クラッキングツールにより、同じサーバー内にあるファイルの 「パーミッションの変更」や「改ざんコードの埋め込み」「ファイルの設置」などかが行われてしまいます。
Webサイトが改ざんされてしまうと

クラッキングツールの利用により、「スパムメールの送信」や「情報漏えい」、「悪意のあるページの自動遷移」「外部サーバーへの不正攻撃」がされるおそれがあります。
「予防対策」をご確認よろしくお願いいたします。
予防対策
複雑なパスワードに変更してください
下記に該当される方はご変更お願いいたします。
推測されやすいパスワード
- ユーザー名とパスワードが同じ文字列
- パスワードが短い、数字のみや英字のみ
- 推測されやすい単語を使用している場合(pasword等)
- 初期状態のユーザー名(admin等)
WordPressのログインユーザーを「admin」以外にしてください
インストール時にデフォルトではadminユーザーでユーザーが作成される為、 攻撃の対象となりやすくなります。「admin」以外のユーザーでインストールを して下さい。一度「admin」で作成した場合は変更が面倒ですので、新規インストールの段階で 「admin」以外のユーザーを作成するように意識することが重要です。

出来る限り最新版のWordPressやプラグイン、テーマを利用してください。
プログラムに脆弱性がある場合、様々な対策が無駄となってしまいます。 また、提供元から長い間更新されていないプラグインやテーマは脆弱性の危険性が 高まっている恐れがあります。使用しないプラグインやテーマは無効にするだけでは不十分ですので 「削除」を行って下さい。

SSLが使用できる場合は管理画面アクセスをSSL通信にしてください。
SSLが使用できる場合は「wp-config.php」に以下を追記してSSLを強制させます。
wp-config.php
define('FORCE_SSL_ADMIN', true);
WordPressの管理画面へのIP制限を行って下さい。
ログイン元のIPが一定である場合、WordPressのログインプログラムに対してIP制限を行って下さい。
下記内容を/wp-admin/に設置します。(xxxはIP)
.htaccess
order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx
また、wp-login.phpのあるディレクトリの中に下記内容で.htaccessを設置します。
.htaccess
<Files "wp-login.php">
order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx
</Files>
WordPressの管理画面へBASIC認証をかけて下さい。
IP制限が難しい場合はBASIC認証をかけてください。(IP制限との併用可)
.htaccess
<Files "wp-login.php">
AuthName "Input ID & Password"
AuthType Basic
AuthUserFile /path/to/.htpasswd
Require valid-user
</Files>
wp-config.phpの置き場所を変えてください。
上記までの対策を行っていてもテーマ等に脆弱性があった場合はDBのパスがとられてしまいます。
wp-config.phpの場所を変更することで多少ですが対策が可能です。
デフォルトではwp-config.phpは1階層上でも動作するようになっているので
/public_html/以下にwordpressを展開している場合はwp-config.phpをpublic_htmlと同階層に移動すると
公開ディレクトリから避けられます。
/public_html/wordpress/以下など、2階層以上深くにwordpressを設置している場合は
wp-configをpublic_htmlと同階層に移動すると動かなくなりますので以下のような手順を行ってください。
- 1.wp-config.phpをpublic_htmlと同階層におく
- 2./public_html/wordpressにwp-config.phpを新規に作る
-
wp-login.php
<?php
include(ABSPATH .
"../../wp-config.php"); - 3.パーミッションは400にします。
WordPressの管理画面への制限(wp-config.php)
さらに対策ができるようであれば、
wp-config.phpにて以下のようにIPアドレス制限をします。
.htaccess
if ( isset($_POST['log']) && $_SERVER["REMOTE_ADDR"] != 'xxx.xxx.xxx.xxx' ) {
header("HTTP/1.1 403 Forbidden");
die('auth error');
}
IP制限が難しい場合はBASIC認証をかけます。
.htaccess
function basic_auth($auth_list,$realm="Restricted Area"){
if (isset($_SERVER['PHP_AUTH_USER']) and isset($auth_list[$_SERVER['PHP_AUTH_USER']])){
if ($auth_list[$_SERVER['PHP_AUTH_USER']] == $_SERVER['PHP_AUTH_PW']){
return $_SERVER['PHP_AUTH_USER'];
}
}
header('WWW-Authenticate: Basic realm="'.$realm.'"');
header('HTTP/1.0 401 Unauthorized');
header('Content-type: text/html; charset='.mb_internal_encoding());
die('error');
}
basic_auth(array("haraguchi" => "hogehoge"));
さらに、wp-config.phpが書き換えられたりしないよう、パーミッションを400に変更します。
この設定ですとFTPでアップロードすることも不可能になりますので、
FTPアップロードの際はパーミッションを一時的に600に変更して書き込むようにして下さい。
WordPressのバックアップを定期的に取ってください
バックアップツールを使って定期的にバックアップを取ることで、
万が一改ざんにあった場合でも元の状態に戻すことが可能になります。
パーミッションは正しく変更してください。
ACサーバーの推奨パーミッションは以下となります。
HTML・画像ファイル | 604 |
---|---|
HTML・画像の参照のみ | 604 |
CGIの実行ファイル | 704 |
CGI/PHPからのデータ参照 | 400 |
.htaccessファイル | 604 |
ディレクトリ | 705 |