WordPressのWebサイトを運営していると、脆弱性の問題やセキュリティ対策について耳にすることがあります。
しかしその具体的なことが語られることが少なく、何となくセキュリティプラグインを導入しているだけの方がほとんどかと思います。
今回はWordPressの脆弱性とはなんなのか、そしてどのようなケースで、どのようなセキュリティ対策をすべきなのか、基礎的な部分について考えていきます。
WordPressの脆弱性とは
WordPressの脆弱性とは、セキュリティリスクのあるプログラムの欠陥を指す言葉です。
その脆弱性を突かれて攻撃されると、例えば無理やりログインされたり、Webサイトの表示を操作されたり、本来外部からは閲覧できない情報が見られてしまったりする可能性があります。
WordPress本体に見つかることもあれば、サードパーティ性のプラグインに見つかることもあります。
WordPressの脆弱性情報をキャッチアップする方法
WordPressの脆弱性情報は、以下のページで見つけられます。
本体の脆弱性情報については、WordPress.org公式の情報がもっとも信頼できるかと思います。しかしすでに対策された情報のみですから、最新情報ではありません。
WordPress本体やプラグインのセキュリティリスクの最新情報については、WPScanが提供している脆弱性データベースが便利です。
本体の脆弱性情報、プラグインの脆弱性情報などを分けて検索できるため、定期的に確認しておくと良いでしょう。
WordPressに見つかる主な脆弱性の種類
脆弱性情報を見ていると、だいたいのリスクは4種類ほどに集約されます。各脆弱性がどのような特性・リスクを持つものなのか理解しておきましょう。
クロスサイトスクリプティング(XSS)
クロスサイトスクリプティング(XSS)は、不正なスクリプトをWebサイトに埋め込むような攻撃方法です。
コメント欄や掲示板、ログインフォーム、検索フォーム、お問い合わせフォームなど、ユーザーから何らかの入力を受け付けるUIが存在する場合に注意しなければなりません。
例えば掲示板に<script>alert(‘テスト’);</script>というテキストを入力したときに、それがスクリプトとして認識されてしまうと、確認画面などで「テスト」というアラートが表示される可能性があります。そんな個人のイタズラ程度なら良いですが、仮に全ユーザー向けの画面が書き換えられてしまうと、大変な問題に発展する可能性があります。
入力フォームではかならずスクリプトのサニタイズ(無害化)がおこなわれるべきですが、それが漏れている場合などに、XSSの脆弱性として指摘されます。
SQLインジェクション
SQLインジェクションは、SQLクエリを送ることでデータベースを操作しようとする攻撃方法です。XSSと同様、入力フォームから攻撃がおこなわれます。
例えば会員情報などを持つ大規模なWordPressサイトだった場合、検索フォームからユーザー情報を検索・表示するようなクエリを送られて表示されてしまうと、情報漏洩につながります。
WordPress上でデータベース操作をおこなう場合はプリペアドステートメント(入力データとSQLクエリを分離する実装)の使用が推奨されており、これがSQLインジェクション対策になります。
デシリアライゼーション
デシリアライゼーションは、フォームに悪意のあるコードを入力することで意図しない挙動を引き起こそうとする攻撃方法です。
PHPのunserialize()関数で処理している場合に、ユーザー入力をそのままunserialize()すると、悪意のあるコード(シリアライズデータ)を送信していた際に意図しない挙動を引き起こす可能性があります。
そもそもunserialize()を使わずJSONなどで処理する実装が推奨されています。
アップロード制限
例えば掲示板機能やコメントなどのアップロード制限がうまく機能していなかった場合に、重大な問題が起きる可能性があります。
大きなサイズのファイルをアップロードされるくらいであれば可愛いものですが、Web上で実行可能なPHPファイルをアップロードされて実行されてしまったりすると、サーバー自体の乗っ取りに合うリスクすらあります。
例えば問い合わせフォームなどでファイルのアップロードを許可している場合など、もっとも身近なリスクと言えるかもしれません。
WordPressのセキュリティ対策
WordPressの脆弱性に対する基本的なセキュリティ対策についてもまとめておきます。
WPScanでチェックする
そのWebサイト単位のセキュリティ対策を実施する際、一つひとつ見ていくのは大変です。基本的にはWPScanに頼ると良いでしょう。
WPScanは、非営利で運営されているセキュリティスキャナーです。WordPressの脆弱性を検出する目的で開発されていて、以下のような機能を基本無料で利用できます。
- WordPress本体の脆弱性検出
- 使用中のテーマやプラグインの脆弱性検出
- ユーザー名の列挙
- 弱いパスワードの検出
つまり悪意のあるクラッカーに攻撃されたような状況を擬似的に作り出してテストできるようなツールです。絶対に自分のサイト以外に使わないことが定められています。
コマンドラインで実行しなければならないため、開発に疎い方にとっては敷居が高くなりますが、定期的に使用してチェックしておくことをおすすめします。
使い方については下記の記事を参考にしてください。
入力フォームを最小限にする
そもそもの話として、入力を受け付けるフォームは最低限にすべきです。
たとえば投稿へコメントを受け付ける必要がないのであれば、コメント欄は削除して解放しないようにします。また問い合わせフォームでも余計な機能はつけず、ユーザーがファイルをアップロードできる機能は慎重に設定しましょう。
フォームにはreCAPTCHAを導入する
reCAPTCHAはGoogle社から提供されているセキュリティツールです。
主に入力フォームに設置するもので、これがあることで悪意のあるコードやプログラム的な攻撃を自動で弾いてくれます。これがあるだけで、問い合わせフォームについてはかなりセキュリティリスクが下がります。
完全に無料で使用できますし、有名な問い合わせフォームプラグインにはreCAPTCHAを使える仕組みが組み込まれていますので、忘れず使用しておきましょう。
ログイン画面のURLを変更する
万が一URLを忘れてしまうと面倒なことになりますが、ログイン画面のURLを変更して、さらにいえば定期的に変えておけば、ログイン画面のセキュリティリスクはかなり軽減されます。
プラグインを使用するならWPS Hide Loginなどが有名です。
不用意に顧客情報を持たないようにする
WordPressサイトを会員制にする場合などは仕方ありませんが、機能的な意味がないのにサーバー上に顧客情報を持つのはやめましょう。
万が一攻撃にあってWordPressのデータベース上の情報が漏洩したときのことなどを考えると、できるだけ外部サービスなども上手につかってリスク分散することをおすすめします。
設置サーバーを細かく分ける
もしもアップロード制限をついた攻撃を受けてサーバー上で悪意のあるPHPファイルを実行されてしまえば、そのサーバーに設置されているWordPressサイトのすべてが危険に晒されます。
複数サイトを運営する場合、コアなWebサイトだけはサーバーを独立させるなど、コストとも相談しながらできる限り分けることをおすすめします。
WordPressの脆弱性は定期的にチェック
WordPressのWebサイトは、そこまでトラフィックが多くなくても、定期的に攻撃がきます。体感としては月間アクセスが1万件を超えるくらい検索エンジン上に表示されると、ログイン画面や問い合わせフォームを起点に何かしらの攻撃がくる印象です。
定期的にセキュリティリスクをチェックして、もしも攻撃を受けても問題ない状態にしておきましょう。