運営:株式会社e2e

世界のWordPress最新情報を
届けるメディア

2021.04.27セキュリティ

WordPressの不正ログイン対策7つと誤った対策方法について

この記事を書いた人

土井 純也

WordPressスペシャリスト・エンジニア/株式会社プレート 取締役

1985年北海道生まれ。200社以上のWordPressサイトの制作を担当し、「wp.support」では一部上場企業を含め、様々なサイトのWordPress保守・セキュリティをサポートしている。

この著者の他の記事を見る >>

管理者に気づかれずサイトに不正ログインし、重要な情報を盗み出したり、訪問者をフィッシングサイトやスパムサイトへの誘導を行うためのコードを設置する・・・。

まるで、警備が厳重な城に忍び込む戦国時代の忍者のようなハッカーたち。
彼らは一体どのようにして、サイトのセキュリティをすり抜けて目的を果たすのでしょうか?

今回は実際に使用されている一般的なWordPressサイトの不正ログインの方法と対策を解説します!
かなり詳しくご紹介しますが、悪用は厳禁です!
(正確には悪意があるハッカーの場合はクラッカーと呼びますが、この記事ではハッカーで統一します)

目次

不正ログインの目的

不正ログインを企むハッカー

不正ログインの目的の多くは、投稿記事やファイルの改ざん、悪意のあるコードの埋め込み(クロスサイトスクリプティング)です。
訪問者にスパム広告を配信したり、フィッシングサイトへリダイレクトさせたり、不正誘導するためのコードを埋め込みます。

不正ログインの被害

管理者IDでの不正ログインを許すと、ほぼ何でもできる状態になります。
被害は下記のようにかなり深刻な内容が予想されます。

  • テーマファイル(header.php等)の不正改ざん
  • 投稿記事の不正改ざん
  • セッションハイジャック
  • 元々の管理者IDが削除され、ログインできなくなる
  • サイトユーザーの個人情報の漏洩

不正ログインの方法・手順

それでは、ここからは実際に不正ログインの方法と手順について解説していきます。

1、ユーザー情報の取得

まずは、管理画面にログインするために必要なユーザー情報取得を目指します。
ユーザー情報を取得する方法はいくつかありますが、以下の方法が代表的です。

「WPScan」ツールを使用

WPScanという無料ツールをインストールし、ターミナルで以下のコマンドを実行します。

これで、そのWordPressのユーザー一覧を表示させることができます。

※注意:WPScanは、本来は脆弱性をチェックするためのツールです。
自分のサイトのセキュリティを保つために使用しましょう。

特殊なURLリクエストを送信する

サイトURLの後ろに「?/author=<数字>」つけてアクセスします。すると、その数字に対応するユーザーが存在していれば、サイトに「(ユーザー名)のすべての投稿」と表示されたり、URLに「/author/(ユーザー名)/」のようにURLに表示されてしまいます。
特に、デフォルトで変更をしていない場合、「?/author=1」は一番最初のユーザー=管理者のユーザー名が表示されてしまいます。

2、パスワードを特定する

ユーザー名が取得できれば、続いて対応するパスワードの特定です。
パスワードを特定するためには、いくつかの手法があります。

ブルートフォースアタック

いわゆる総当たり攻撃とも言われます。ツールを使用して、4桁の数字なら「0000」〜「9999」までひとつずつ試すというものです。理論的には時間さえあればどのようなパスワードでも突破することが可能です。パスワードが英語のみ、数字のみ等簡単であればあるほど、突破までの時間は短くなります。

辞書攻撃

よくパスワードとして使用される文字列やユーザー名などから、パスワードとして予測される文字列をリスト化し、それを順に試していくというものです。確度の高い情報があれば、ブルートフォースよりも短時間でログイン認証を突破することができます。「qwerasdf」や「password」等、使用されやすいパスワードはリストにまとめられているため、高確率で突破されます。

不正ログインへの対策

不正ログインに対するセキュリティ対策

不正ログインへの対策は、①ログイン画面にアクセスさせない、②認証を突破させない、③万が一入られた場合への備え、という3つの防衛策が考えられます。基本は①と②についての対策をしっかり行い、まず、管理画面に入らせないということが重要です。ただし、どんなにセキュリティ対策をしても100%侵入を防ぐことはできませんので、③についても対策をしておくことが重要です。

対策方法1:管理画面にアクセス制限をかける

「①ログイン画面にアクセスさせない」方法として、最も有効なのはIPアドレスによるアクセス制限をかける方法です。
アクセス制限は「.htaccess」ファイルにコードを追加することで簡単に実行することができます。(.htaccessは不可視ファイルと呼ばれる通常の設定では表示されないファイルですので、ファイルが見つからない場合は使用中のツールの設定を確認してください。)

  1. wp-login.phpと同階層にある「.htaccess」の先頭に以下のコードを追記
    ※他の記述に影響しない場所ならどこに記述しても良い
  2. 「123.123.123.123」の部分をアクセスを許可したいIPに変更
    ※複数のIPを許可したい場合は、「Allow from 123.123.123.123」の行を追加していく。
  3. 「/wp-admin/」配下に「.htaccess」ファイルを新規に作成
  4. 作成した「.htaccess」に以下のコードを記述

    ※adamin-ajax.phpは管理画面以外でも利用されるので、認証がかからないように記述されています。
  5. 「123.123.123.123」の部分をアクセスを許可したいIPに変更
    ※複数のIPを許可したい場合は、「Allow from 123.123.123.123」の行を追加していく。

これだけで、管理画面にIPによるアクセス制限をかけることができました。

注意点として、携帯型のwifiやモバイルからアクセスする場合、IPが変動するため、この方法は使えません。他の方法での対策を行ってください。

対策方法2:ユーザー情報を保護する

上記の不正ログインの攻撃手順で解説したように、攻撃者が最初に狙うのはユーザー名です。そこで、ユーザー情報を隠すことが、「②認証を突破させない」最初の対策になります。

ユーザーにニックネームを設定する

デフォルトではログインに使用するユーザー名がそのまま投稿ページ等に表示されてしまいます。管理画面のユーザー情報の編集画面では、ユーザーごとにサイト上で表示するニックネームを設定可能です。ニックネームを設定することで、ユーザー名の変わりにニックネームが表示されるようになります。

『Edit Author Slug』でAuthor slugを変更する

サイトURLに「?/author=<数字>」をつけてアクセスすると、対応するユーザーのユーザー名がURLバーに表示されてしまいます。この問題を解決するためにおすすめなのが『Edit Author Slug』というプラグイン。これをインストールして有効化すれば、ユーザー情報編集画面で、Author slugをユーザー名から好きな文字列に変更することができます。

対策方法3:パスワードは予測できない複雑なものを設定する

「②認証を突破させない」方法として、最も基本的でありながら見逃されがちなのがこの項目。ここが甘いとブルートフォースアタックや辞書攻撃で簡単に突破されてしまいます。改めて、下記の3原則を確認しておきましょう。

  • パスワードは使い回さない
  • 英語、数字、記号等を組み合わせた複雑なものにする
  • 名前、サイト名、誕生日等、予測されやすい文字列は避ける

対策方法4:SiteGuardプラグインを使用する

「②認証を突破させない」方法として、「SiteGuard WP Plugin」を使用する対策方法があります。
SiteGuardプラグインを使用すれば、ログイン画面にセキュリティ対策を施すことが可能です。プログラムによる自動攻撃に対しては特に効果的です。

  • ログインページURLの変更
  • ログイン時の画像認証の追加
  • 複数回アクセスに失敗したユーザーをブロックする
  • ログインの通知

対策方法5:バックアップを定期的に取っておく

「③万が一入られた場合への備え」として、不正改ざんでサイトに不具合が出た場合、すぐに正常な状態に戻せるよう、定期的にバックアップをとっておくことをオススメします。WordPressでは、『UpdraftPlus WordPress Backup Plugin』などのバックアップに関するプラグインが多数出ていますので、スケジュールを組んで自動でバックアップする設定をしておくと良いでしょう。

対策方法6:管理画面からテーマファイルを編集できないようにする

攻撃者の多くは「header.php」や「footer.php」といったテーマファイルに悪意のあるコードを仕掛けることを目的としています。そこで、「③万が一入られた場合への備え」として、万一、管理画面に侵入された場合でもテーマファイルを改ざんできないようにしておくことをオススメします。

下記コードをwp-config.phpに追記するだけで、簡単にテーマ編集の項目を削除することができます。

SQLインジェクションによる不正なユーザー作成

SQLインジェクション

WordPress本体やプラグインの特定のバージョンにはSQLインジェクションへの脆弱性が存在します。SQLインジェクションは、入力フォームなどを利用してデータベースに直接不正な命令を実行させる攻撃です。これを悪用することで、直接、管理者ユーザーを新規作成することもできてしまいます。

近年では、2017年10月31日のWordPress4.8.3のリリース時に、4.8.2のバージョンにSQLインジェクションに対する脆弱性があることが発表されました。

SQLインジェクションへの対策

SQLインジェクションの脆弱性は、結果としてはセキュリティ被害が発生しますが、本質的にはWordPress本体やプラグインに問題です。ですから、ユーザー側で事前に察知して防ぐということが難しいのが実情。ただ、WordPressを使う以上は避けて通れませんので、被害を受ける確率を少しでも避ける方法は知っておきましょう。

対策方法7:SQL命令文で使用される特殊文字へのバリデーション・エスケープ

さらに専門度が高くなりますが、一番確実な方法です。
SQLインジェクションで使用されるSQL命令文では、「’」「;」といった特殊文字が使用されます。そこで、これらの特殊文字が使用された場合にエラーが出るようにしたり(バリデーション)、送信された場合は別の文字に自動変換させる(エスケープ)といった方法が有効です。

これらの方法は、また別記事で詳しく取り上げます。

誤った不正ログイン対策

間違った対策方法

こちらでは、他のWeb上で不正ログイン対策として紹介されているものの、あまり効果が認められない方法について解説します。

管理画面へのBASIC認証をかける場合はSSL対応を

BASIC認証の設定については、IPによるアクセス制限が難しい場合の代替手段としても紹介されますが、ID・パスワードといったログイン情報が傍受されてしまうので危険だと紹介される場合もあり、混乱を招く対策方法のひとつです。

実際、BASIC認証からID・パスワードが漏洩することは起こりえます。これは通信内容を傍受されるリスクがあることに起因します。
通信内容を保護するためのSSL化を行うことによって、ある程度防ぐことができます。
ですから、SSL化されていないサイトではリスクがある。SSL化されている場合は効果があると言えます。

ただし、SSL化されているサイトの場合も、以下のようなBASIC認証の特徴について、よく理解した上で利用する必要があります。

一度ログインすると、アクセスするたびにログイン情報が送信される

管理画面にBAISIC認証を設定し、一度ID・パスワードを入力してログインを行うと、2回目以降のログイン情報の入力は不要になります。

ログイン状態が保存されているように見えますが、実はこれは見かけ上のもの。
ブラウザ上に入力したID・パスワードが保存されており、アクセスする度にその情報が自動的に送信されるのでログイン状態が継続しているように見えるのです。

「便利でいいじゃないか」と思われるかもしれませんが、ログイン情報がアクセスのたびに送信されるということは、それだけ攻撃者にログイン情報を傍受する機会を与えているといういことになります。
BASIC認証にはログアウトという機能は基本的にありませんので、作業を行ったあとにブラウザを終了することを徹底する必要があります。

データベースの接頭辞の変更はハッキング対策にならない

こちらはSQLインジェクションへの対策として紹介される方法です。

SQL命令文の無効化を狙った対策方法

WordPressのデータベースでは、データの種類を分類する際(table)に「wp_」という接頭辞が設定されています。ハッカーもそのことをよく知っていますので、SQLインジェクションで偽の命令文を打つ際には「wp_〇〇」のtableを操作する、という命令文を書きます。この時、接頭辞が「wp_」以外であれば、命令文は無効になるという理屈です。
「All In One WP Security & Firewall」などのセキュリティ対策プラグインには、この接頭辞を変更する機能もあります。

一時期、注目を集めた方法ですが、残念ながらこの方法は全く効果がありません。

接頭辞はデータベースへ問い合わせることが可能

問題は、独自のテーブル名に変更するのではなく、接頭辞のみを変更しているに過ぎないことにあります。
「wp_postmeta」というテーブルがあったとして、「〇〇_postmeta」に変更しているということですね。

なぜ、意味がないのかというと、攻撃者は次のようなクエリを実行するからです。

クエリの出力結果は次のようになります。

出力結果

接頭辞が「wp_」と表示されていることがわかるかと思います。
上記のクエリはデータベースに「このテーブルの接頭辞は何?」と問い合わせるクエリで、出力結果はデータベースからの回答というわけですね。

ハッカーはこの簡単な一手間を加えるだけで、どんな接頭辞でも簡単に暴くことが可能です。これはハッカーにとって常識レベルの話ですので、全く有効なセキュリティ対策にはなりえません。

データベースを編集するリスク

効果がほとんどなかったとしてもやらないよりはマシでは?と思われるかもしれませんが、エンジニアではない人がデータベースの値を触るのは、それだけでリスクになります。

サイトの表示が崩れてしまったり、サイト全体のデータが破損してしまうなど、不具合が起きる可能性があります。効果がないだけでなく、サイトに致命的なエラーを生じさせるリスクにもなりえます。

基本対策はWordPress・プラグインを最新の状態に保つこと

不正ログインに限らず、WordPress・プラグインを最新バージョンに保つということはセキュリティ対策の基本です。特にセキュリティに関するアップデートが行われた際は、早急にバージョンアップを行いましょう。

古いバージョンを使い続けるということは、脆弱性を放置していることと同義です。
ハッカーを泥棒に例えれば、金庫の暗証番号を知らせているようなものです。面倒だからと放置することなく、こまめなバージョンアップを心がけましょう。

不正ログインを防いで安全なWordPress運営を!

明るい未来

ここまで、不正ログインに対する対策をご紹介してきました。
一度不正ログインを許してしまうと、原因調査、現状の脆弱性への対策、改ざんされたデータの復旧など、事前の対策など比べ物にならないほどの手間と時間が必要になります。場合によっては、個人情報や企業の機密が漏洩して取り返しのつかない事態になることも十分に考えられます。

「自分のサイトは大丈夫」などと、軽く考えず、しっかりと不正ログインへの対策を行いましょう。

また、自社内でセキュリティ対策のリソースが取れない、ネット上の情報の真偽の判斷がつかない、自分でやるのは不安だという場合は、WordPressの専門家に保守サービスを依頼するのもひとつの方法です。その際は、保守サービスごとの対策内容の違いや対応や保証の範囲についてしっかりと確認しておきましょう。

注目記事バナー