Exec-PHP を利用して編集者が DB パスワード情報を知る方法の解説です。Exec-PHP をインストールして有効にした場合、編集者がJavaScriptを仕込み、注意深くない管理者に実行させることができます。
まず、WordPress の仕様の説明です。WordPress の管理者権限、編集者権限を持つユーザーは、投稿内に JavaScript を書くことが出来ます。また管理者権限、編集者権限を持つユーザーは、他者の投稿を編集したり、他者を投稿者にして投稿を公開することができます。
Exec-PHP の仕様の説明です。Exec-PHP は、投稿本文中に PHP コードが書かれた場合、PHP コードを実行します。Exec-PHP の標準設定では、投稿のオーナーが管理者の場合のみ、PHP コードを実行します。また、「編集者権限を持つユーザーは、他者の投稿を編集したり、他者を投稿者にして投稿を公開する」機能は、Exec-PHP が抑制しています。(ローカルの WP3.5.2 で試した場合です。WP のバージョン等によって異なるかもしれません。)
このため、Exec-PHP をインストールしたとしても、管理者で無いユーザーが PHP コードを実行することは容易ではありません。
JavaScriptを使った間接的な方法
編集者権限を持っている場合、投稿内に JavaScript を書くことが出来ます。これを利用すると、間接的に PHP コードを実行できてしまいます。
私が思いついた方法を 1 つ紹介します。まず、下記のようなコードを投稿に挿入し、公開します。
<script>location.href="http://ブログURL/wp-admin/post-new.php?content=%3C?php%20echo%20DB_PASSWORD;?%3E";</script>
管理者がこの投稿を含むページにアクセスすると、新規投稿画面にリダイレクトされ、投稿本文には、
<?php echo DB_PASSWORD;?>
と表示されます。(ブラウザのセキュリティ設定で防げるケースもあるようです。)
この投稿を管理者が放置してしまうと、データベースのパスワード漏洩という結果になります。編集者であれば下書き状態の他者の投稿を閲覧できるため、データベースのパスワードを表示するコードが記述された下書きを閲覧することで、データベースのパスワードを入手できます。(この攻撃例はシンプルにしています。実際の攻撃では、文字色を白にする等の小細工をして発見されにくくするでしょう。)
管理者の隙を突く攻撃なので、絶対成功するわけではないですが、Exec-PHP を入れた状態は非常に危険だと言えるでしょう。
JavaScriptを無効にする方法
本当は怖い WordPress – WordPress の権限周りで wp-config.php で設定可能なセキュリティ向上策に記載されているように、wp-config.php で、
define('DISALLOW_UNFILTERED_HTML', true);
と記述すると、投稿本文にスクリプトを記述することが許可されなくなります。