PHPのスクリプト読み込み用の関数である require/
- ※1
require/
include文は本当は関数ではなく, 言語の基本機能として実装されているif文などと同じ “文” (ステートメント) です。
つい最近のファイル読み込みバグ
執筆時点
- WebPotal CMS
(4/ 23) - NotFTP
(4/ 22) - TotalCalender
(4/ 22) - SMA-DB
(4/ 17) - Job2C
(4/ 16) - FreeWebshop
(4/ 16) - GuestCal
(4/ 15) - Jamroom
(4/ 15)
ファイル読み込みバグはサーバの乗っ取りも可能とする致命的なバグですが,
require/include文とファイル読み込みバグの問題
PHPはスクリプト
ファイル読み込みバグがある場合,
require/include文
require/
PHP以外の言語では,
さらに問題なのは,
テキストとプログラムを同じ文で読み込む危険性
経験豊富なプログラマでも,
PHP初心者がよく作ってしまう致命的なセキュリティホールには次のようなコードがあります。
if (!empty($_GET['plugin'])) {
require_once(PLUGIN_DIR.DIRECTORY_SEPARATOR.$_GET['plugin'].'.php');
}
経験豊富なプログラマであっても,
このコードは非常に危険です。なぜなら,
つまりこのようなコードを書くと,
テキストの読み込み
PHPは<?php ?>等で囲まれた部分以外はecho文で出力したのと同じ動作をします。
先ほど紹介したコードで$_GET['plugin']に
プログラムの読み込みだけ可能であれば,
コードの読み込み
requrie/
例えば,
例:PHPスクリプトを含むgifファイル
GIF89a
<?php system('rm -rf /'); ?>
このファイルはgetimagesize関数ではgif画像として認識されてしまいますが,
system('rm -rf /');
を実行してしまいます。UNIX系のシステムではアクセス権限がある全てのファイルを消してしまいます。
テキストだけでなく,
リモートスクリプト
さらに問題を複雑にしているのがリモートスクリプトです。PHPはrequire/
この仕様の危険性はようやく認識され,