PHPリモートファイルインクルードがわからないお(なんとなくわかったお)

何気に試したこと無かったので、PHP 5.2.3で試した。

下記脆弱コードへの攻撃

<?php
require($_GET{'value'} . "/test.php");
?>
register_globals*1 allow_url_include*2 リモートインクルード ディレクトリトラバーサル
On On 成功 成功
On Off 失敗 成功
Off On 成功 成功
Off Off 失敗 成功

ん?どゆこと?「register_globals」が関係あるって書いてあるとこ結構あるんだけど、やり方を間違ったかしら?「register_globals」での発動条件の変化を知ってる人はおせーて欲しいにゃ。ああ、変数上書きとの話と混ざってるのか。「allow_url_include」に何か影響するのかと思ってた。PHPの設定はよく理解してませんです・・・。けど、そこは本質なのかなぁ。

また、関係ないが、「magic_quotes_gpc」を「On」にすると*3「Warning: require(c:\\boot.ini\0/test.php) [function.require]: failed to open stream: No such file or directory」と言われ、ディレクトリトラバーサルできなかった。リモートファイルインクルードに関しては、「%00」で後半を消している例が多いが、「%3F」でいいので、関係ない。

以下の脆弱コードに対しては、

<?php
require("./test/" . $_GET{'value'});
?>

当然こうなった。

register_globals allow_url_include リモートインクルード ディレクトリトラバーサル
On On 失敗 成功
On Off 失敗 成功
Off On 失敗 成功
Off Off 失敗 成功

これって、普通にリモートファイルインクルードなくても、ディレクトリトラバーサルでどっちみち致命的ジャン、って話にはならないのかなぁ。対策として「allow_url_include」をOffに、という間違ったとこにたどり着いたらダメっぽい気がする。


教えてもらった。下みたいに書いてあることが問題なんすね。けど、変数初期化しないの?

<?php
require($root_dir . "/test.php");
?>


やっぱし、こんなにいろんなとこで取り上げられてるのはよくわからんかも。

*1:PHP 5.2.3ではデフォルトOffだった

*2:デフォルトOffだった

*3:c:\Windows配下にphp.iniを置かなかったときは「On」、デフォルトの設定ファイルを置いたときは「Off」になってた。