MOPB-08-2007:PHP 4 phpinfo() XSS Vulnerability (Deja-vu)

(Last Updated On: )

“the Month of PHP Bugs”をできるだけ多くの方が読めるように、Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。

■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser

■PoCまたは攻撃コード
MOPB-08-2007.phpt
http://www.php-security.org/MOPB/code/MOPB-08-2007.phpt

■リファレンス
HPHP-18-2005
http://www.hardened-php.net/advisory_182005.77.html

■サマリ
Hardened-PHPプロジェクトにより2005年10月に公開され修正された脆弱性が、PHP4.3.3から再び導入されています。phpinfo関数がエスケープ無しにユーザが送信した$_GET, $_POST, $_COOKIE変数を表示するのでXSSに脆弱になります。

■影響するバージョン
PHP 4.4.3から4.4.6

■詳細情報
phpinfo関数はPHPの詳細な実行環境を表示します。これにはユーザが送信した変数も含まれます。

ユーザに表示される配列変数の内容は再帰的な手法で特別な処理をおこなってから出力されます。以前のPHPは出力前にエスケープを行っていませんでした。このため現在のPHPは書き込み関数は出力が適切にエスケープされるよう内部関数が利用されています。この修正はPHP5のソースツリーで作成され、後にPHP4にバックポートされました。

残念な事に、バックポートは半分だけ行われました。内部関数は書き込み関数のパラメータを受け付けますが、全く利用されていません。この変更は私たちが2005年10月に公開した脆弱性を再び導入してしまいました。

■PoC、攻撃コード、再現手順
添付の攻撃コードは以下のコマンド実行可能なPHPテストシステムのテストケースです。

$ make test

テストケースはPHPのソースコードのテストディレクトリ以下にコピーするだけで利用できます。

PASS Classes general test [tests/classes/class_example.phpt]
PASS Classes inheritance test [tests/classes/inheritance.phpt]
FAIL [SECURITY] phpinfo() simple XSS test [tests/exploits/MOPB-08-2007.phpt]
PASS Strlen() function test [tests/func/001.phpt]
PASS Static variables in functions [tests/func/002.phpt]

脆弱性を手動でテストするにはphpinfo()を表示するページに次のようなパラメータを追加して表示します。

http://localhost/phpinfo.php?a[]=<script>alert(/XSS/);</script>

■備考
この脆弱性はPHPのソースコードに脆弱性の実証コードテストケースが必要であることの良い例です。このようなシステムになっている場合、この脆弱性のようなバグは決して再び導入されるような事はありません。

私たちがPHPセキュリティレスポンスチームにこのようなテストが必要だと主張すると、攻撃コードのテストをPHPに追加したくない、隠ぺいするために他のテストケースに隠しておきたいと言われました。

最後に、絶対にphpinfo関数の出力をあなたのサーバで参照できるようにしないでください。

投稿者: yohgaki