WordPressのセキュリティ

佐野

佐野 2015年7月3日

WordPressは最も有名かつ導入も簡単、しかも無料で使えるCMS。
それゆえに、様々な攻撃から守る手段を取る事も重要となります。

そこで今回、私自身の経験も踏まえ、
WordPress導入の際に、最も注意するべき事を掲載したいと思います。

本体・プラグインのアップデート

本体はもちろん、特にプラグインは要注意です。
プラグインのバグを突き、不正なファイルや不正な値を送り込んで、
サイトを改ざんするといった事件もあるようです。

プラグインは常に最新の状態にしておく事を推奨します。

ブルートフォース攻撃

WordPressのログインページに対して、
スクリプトにより自動生成されたパスワードで、総当たりログインを仕掛ける攻撃です。
技術的にはやや原始的でも、もし破られたら致命的です。
そして、「admin」というアカウントは、確実に狙われるものと思っておいてください。

パスワードの複雑化だけでは、到底足りません。
どんなに複雑にしても、再現なく攻撃できれば、いつかは破られますから。
しかし、奇跡的にも数回で破られるなんて事のないように、
長く複雑にするに越したことはないのは確かです。

対策例として、ログインページURLの変更、ログイン失敗回数によるIPブロック、
「admin」ユーザーの削除といった対策を取るとよいでしょう。
これらは標準の機能で行えない場合があるので、
これらが行えるセキュリティ用プラグインを導入するとよいでしょう。

パーミッションの設定

WordPressに限らず、パーミッション設定は重要となります。

パーミッションとは、フォルダ・ファイルに対して割り振られる権限で、
「所有者」「グループ」「その他」に対して、
「読み取り」「書き込み」「実行」の権限を与えることができます。

WordPressにおいて、よく知られるパーミッション設定は
フォルダは「775」で、PHPファイルは「664」だと思います。

サイトによっては、動作のために「777」にするようにも記載されている場合もありますが、
一時的であれ、
絶対に「その他」に対して「書き込み」権限を与えないでください。

3桁の番号の場合、最後の数字が「2」「3」「6」「7」になっている場合は要注意。
「rwx」表記の場合、3組目のところに「w」が入っている場合はご用心です。

サーバーがPHPを動かすのは、「所有者」か「グループ」のどちらかです。
「所有者」とはサーバーに登録されたユーザーの事であり、FTPユーザーでもあります。
「グループ」とはサーバーの中のPHPを動かすシステムのだと思っていただければいいかと思います。
ほとんどの場合、共有のレンタルサーバーは「グループ」で、
Pleskなどを使っているサーバーは「所有者」で動いています。

「その他」に書き込み権限があると・・・?

ファイル改ざんや不正ファイルのアップロードが行われる可能性があります。

そしてその不正ファイルは、「所有者」もしくは「グループ」に書き込み権限のある所、
フォルダの場合は不正ファイルを作成され、ファイルの場合は書き換えられてしまいます。

データベースの接続情報も取得される可能性も充分ありえます。
もし、会員登録制サイトの場合、個人情報流出も考えられます。

実際の動き

もしセキュリティを突破され、ログインや改ざんなどが行える状態になった場合、
多くの場合は、コンテンツの大改造のような、すぐに目に付くような行動は行わないようです。
管理者にはバレにくいように、そっとリンクを埋め込んだり、
スパムメール配信の踏み台にするといった姑息な行動が多いようです。
サイトをハッキングしたところで、FTPパスワードを取得する方法はないため、
もし管理者にバレたら台無しですからね。

スパムメール配信に利用されている場合は、要注意です。
サーバーからメール送信を行う場合、サーバーが持つドメインとメールの送信元のドメインが一致しないと、
メールソフト側で、信頼されないメールとして認識されます。
ですが、ウェブサイトが乗っ取られ、そこからスパムメールを配信するようになると、
正常なメールとして、スパムメール配信を行うことが可能となります。
そうなると、ドメイン所有者の信頼低下の可能性もありえます。

どのような形で不正ファイルを動かすかと言えば、いくつかの方法が考えられます。

アップロードした不正ファイルに対してPOSTメソッドでアクセスする

私がアクセスログ解析を行った中でも、これが最も多いと思われます。

POSTメソッドでメールの宛先・件名・本文を載せ、対象のファイルにピンポイントでアクセスします。
WordPressは通常の方法でアクセスすると、画像や連携したファイルなど、
いくつかのファイルにも同じIPで、同時にアクセスの痕跡が残りますが、
単体のIPアドレスをアクセスログから発見、かつPOSTメソッドである場合、
不正ファイルへアクセスしている可能性が高いです。

WordPressの動作に紛れ込ませて動作させる

これはあまり聞いた事はありませんが、可能性としては考えられます。

プラグインなどで、特定のファイル全てを動作させるといった機能がある場合、
その条件に合わせたファイルを作成して、動作させるという方法です。

またはWordPressのシステムファイルに追記をして、
不正プログラムを紛れ込ませるといった感じです。

ファイルの形式

不正ファイルの形は様々で、バレにくいようにするために、あの手この手と必死です。

ファイル名も「file.php」「ajax.php」「help.php」「press.php」
「ession.php」「test60.php」「info.php」「list.php」「cache.php」「sql.php」などなど、
極力それっぽい名前を付けている場合が多いです。

意外なことに、「Microsoft Security Essentials」などのセキュリティソフトでも引っかかるようです。
PHPファイルなので、通常のPCならダウンロードして即実行はないはずなので、
実際にウェブサイトの中身を全てダウンロードすれば、何かしらのファイルは引っかかるはずです。

また、あたかもWordPressのファイルのように見せかけたファイルも存在します。
私が発見した例として、「wp-credit.php」というファイルを見つけました。
このようなファイルはWordPressには存在せず、
ファイル名で検索すれば、マルウェアらしき情報も見つかりました。
ちなみに、これも先ほどの「Microsoft Security Essentials」に引っかかりました。

画像ファイルに偽装する

もしPC上でサムネイル表示がされなかったり、
PHPで「include_once()」などで呼び出されていた場合は要注意です。
その場合は画像ビューワではなく、テキストエディタで開いてみましょう。

一例として、実際に私も見つけた「social.png」というファイルもあります。

暗号化されたファイル

オープンソースのCMSなら、まずファイルを暗号化するのはあり得ないでしょう。
暗号化されたファイルは不安に思われるほか、オープンソースであれば意味はありません。
「ionCube」等で暗号化されたCMSもありますが、それらは大抵有料であるはずです。

主に、変数名をランダムにしたり、文字列を文字単位で置き換えた後、「eval」関数で実行しているものもあります。
「eval」は文字列をPHPコードとして動作する関数で、PHP公式でも推奨していない関数でもあります。
「eval」関数が使われている時点で警戒しておくとよいでしょう。

暗号化と言っても単なる難読化であり、「eval」関数を使っている場合、
「eval」の代わりに「echo」で出力することで、コードとして読める場合があります。

暗号化されていても、「Microsoft Security Essentials」にも引っかかるようです。
なので、暗号化の形式は不定というわけではなさそうです。

まとめ

長くなりましたが、以上が私の体験からのレポートです。
弊社はウェブサイト開発やセキュリティ関連は本業ではありませんが、
今までのお客様への対応や、実験領域での検証を元に、記事を書きました。

つまり、ウェブサイト開発者が気を付ける主な点は、
フォルダ・ファイルのパーミッションです。

厳密には、どのような方法で「777」の領域に、ファイルをアップロードしているかは不明ですが、
パーミッションの設定を怠ると、もし改ざんがあった場合、
パーミッション設定を行った人にも責任が回ってくる事にもなります。

少なくとも、「その他」に対して「書き込み」権限さえ入れなければよいかと思います。