2012-05-08

PHP CGIの脆弱性解説

By Taro Yamazaki  |  12:30 No comments

既に各所で取り上げられていますが、CGI版PHPにかなり大きな脆弱性が見つかっています。

あくまでもCGI版PHPを実行している場合にのみ発生するもので、モジュール版のPHPではこの脆弱性はありません。
この脆弱性の問題点は、クエリパラメータがCGIのコマンドライン引数として渡されることにあります。それで、PHPのコマンドラインオプションをクエリパラメータに含めると、そのコマンドがそのまま実行されてしまいます。

これにより、以下のような攻撃が既に検出され始めています。

ソースコードが見えてしまう

たとえば、サーバーにphpinfo.phpというファイルが存在するとしましょう。脆弱性が存在する場合、このサーバーに「phpinfo.php?-s」というリクエストを投げると、PHPファイルのソースがそのまま表示されてしまいます。

PHPのコマンドラインオプション「-s」は、ソースコードをHTMLとしてフォーマットするというオプションです。その結果、対象となっているPHPファイルのソースコードをHTMLとしてフォーマットして表示してしまいます。

phpinfo.phpにも...

クエリパラメータ「?-s」をつければソースが丸見えに...

ソースコードの漏洩自体も問題ですが、特に暗号化処理などが含まれている場合には大きな問題となるでしょう。

サーバー上の任意のコマンドが実行できる

これはさらに重大な脆弱性ですが、クエリパラメータに2つのパラメータを指定し、リクエストにPHPのshell_execコマンドを投げると、その実行結果がそのまま受け取れてしまいます。

クエリパラメータに指定するパラメータは次の2つ。

allow_url_include=1includeなどの処理でURLに対応したfopenラッパーを使用可能にします。これは次のパラメータ(auto_prepend_file)を有効にするために必要なパラメータです。
auto_prepend_file=php://input対象のPHPファイルの前に自動的に付加され、処理されるファイルの名前を指定できます。ここでは「php://input」としているため、リクエストで渡されてきたコードがそのまま処理されることになります。

この2つの設定をクエリパラメータで渡したら、あとは実行したいコマンドをshell_execとしてリクエストのボディに渡すだけです。

Fiddlerでリクエストを作成して送ってみると...

結果はこんな悲惨なことに。

コマンドの出力結果がそのまま取得できてしまいます

この脆弱性を利用した攻撃が既にキャプチャされて始めていますが、その中にはインクルードするPHPコードをリクエストの中ではなく、外部のサーバーから読み込むものも見つかっているようです。

残念ながら、これらの脆弱性に対するPHPの対応は現時点ではまだ完了しておらず、近日中にアップデートをリリースするとのアナウンスが行われています。

なお、既にキャプチャされた攻撃のパターンからすると、PHP公式サイトで提供されているmod_rewriteを使った回避策でも攻撃を受ける可能性があるという指摘があります。ご注意ください。

現在ではモジュール版のPHPが使用されているケースが多いと思いますが、一部のホスティングサーバーなどではCGI版のみしか利用できないところもあるようです。お使いの環境で一度ご確認されることをおすすめします。

Author: Taro Yamazaki

0 コメント:

© 2015 yamata::memo | Distributed By My Blogger Themes | Created By BloggerTheme9
TOP