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"); ?>
やっぱし、こんなにいろんなとこで取り上げられてるのはよくわからんかも。