Standing on the Shoulder of Linus

Home / 2013 / 7月 / 12 / Exec-PHP を利用して編集者が DB パスワード情報を知る方法

Exec-PHP を利用して編集者が DB パスワード情報を知る方法

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>

script

管理者がこの投稿を含むページにアクセスすると、新規投稿画面にリダイレクトされ、投稿本文には、

<?php echo DB_PASSWORD;?>

と表示されます。(ブラウザのセキュリティ設定で防げるケースもあるようです。)

injected

この投稿を管理者が放置してしまうと、データベースのパスワード漏洩という結果になります。編集者であれば下書き状態の他者の投稿を閲覧できるため、データベースのパスワードを表示するコードが記述された下書きを閲覧することで、データベースのパスワードを入手できます。(この攻撃例はシンプルにしています。実際の攻撃では、文字色を白にする等の小細工をして発見されにくくするでしょう。)

管理者の隙を突く攻撃なので、絶対成功するわけではないですが、Exec-PHP を入れた状態は非常に危険だと言えるでしょう。

JavaScriptを無効にする方法

本当は怖い WordPress – WordPress の権限周りで wp-config.php で設定可能なセキュリティ向上策に記載されているように、wp-config.php で、

define('DISALLOW_UNFILTERED_HTML', true);

と記述すると、投稿本文にスクリプトを記述することが許可されなくなります。

関連

Posted in WordPress | Tagged Javascript, 管理画面
← Nagoya.php と FuelPHP ハンズオン nagoya.php vol.2 に参加しました。 →

アーカイブ

人気の投稿とページ

  • キンドル本を印刷する(PDFに変換する)方法
  • 名古屋駅から国際センターまでの道のり(徒歩)
  • AGPL ライセンス(GPLとは似ているが違いもある)
  • 6年使ったイーモバイル(Y!mobile)を解約手続。店頭でSIM返却
  • JP-Secure SiteGuard WP Pluginは不正ログイン防止に役立つか

プロフィール

水野史土:月70万PVホームページ制作会社のレスキューワーク株式会社で、PHPソフトウェアのサポートを行っている。concrete5コミュニティリーダー、Novius OSコアコード貢献者でもある。 詳しくは管理者詳細参照。
大好評WordPress書籍「WordPressユーザーのためのPHP入門 はじめから、ていねいに。」サポートページ

Copyright © 2015 Standing on the Shoulder of Linus.