ぷ~ろぐぷ~ろぐ身辺雑記、アニメ・マンガ、Jリーグ(特に新潟)のこととか。概要スクリプト言語にはソースの一部に別ファイルを読み込む機能がある。読み込まれるファイルを外部から指定できる場合、アプリケーションが意図しないファイルを指定することにより脆弱性が発生する場合がある。これをファイルインクルード脆弱性と呼ぶ。PHPの場合、設定によっては外部サーバのURLをファイル名として指定できる場合がある。これをリモートファイルインクルード(RFI)と呼ぶ。場合、以下のURLにアクセスするのが正常系の呼び出しである。http://<ホスト名>/include_test.php?header=header1攻撃の場合、例えば以下のようなURLにアクセスする。URLの末尾の"%00"はヌルバイト攻撃によりPHPスクリプトで付け足している拡張子(.php)を無効するためである。このように、ファイルインクルード攻撃によりWEBサーバ内の非公開ファイルの漏洩が起こる。この例はディレクトリ・トラバーサル脆弱性と同じである。危険な期のであるためPHP5.2.0以降ではデフォルトでは無効になっている。RFIが有効であれば、次のような攻撃が可能である。以下のURLでアクセスする。よって、読み込まれるファイルのURLは以下になる。実行されて攻撃成功となる。●スクリプトの実行2:セッション保存ファイルの悪用RFIが無効にされている場合でも、次の2つの条件のいずれかを満たしていればWEBサーバ上に任意の内容を書き込める場合にはファイルインクルード攻撃によりスクリプトを実行させられる可能性がある。ファイルのアップロードが可能である。セッション変数の保存先としてファイルを使用している。いずれの場合もファイル名が推測できることが条件である。具体例として後者のセッション変数の保存先がファイルとなっている場合を説明する。例として問い合わせサイトと取り上げる。この攻撃対象のサイトには、外部入力をそのままセッション変数に格納している箇所があるとする。入力フォームは以下のようなものである。説明のために、本来はない攻撃用のコードを含んでいる(4行目)。type="submit"></form>質問を受け付けるスクリプトは以下になる。POSTデータをセッション変数に格納しているだけだが、攻撃の説明のためにセッション変数の格納先を表示している。session_id();?><body>質問を受け付けました。?>%00">ファイルインクルード攻撃</a></body>上記スクリプトでは説明のためにセッションファイル名を表示しているが、現実のアプリケーションではこのような表示はない。よってファイル名が推測できるかどうかが問題となる。セッション情報のファイル名は、セッション情報の保存パスとセッションIDを元に構成される。保存パスは設定変更できるがデストリビューションによってデフォルトが決まっていて、それを変更せずに使用している場合が多いと予想される。セッションIDはクッキー値からわかる。したがって、攻撃者はセッション情報の保存ファイル名を推測できる。前記のフォームから問い合わせを送信すると、セッションファイルには以下のような形式の値が保存される。?>";これはPHPのソースコードとして有効である。脆弱性の原因インクルードされるファイル名を外部から指定できる。インクルードされるべきファイル名かどうかの妥当性チェックをしていない。対策この脆弱性の対策の考え方は、ディレクトリ・トラバーサル脆弱性の対策と同様である。外部からファイル名を指定する使用を避ける。ファイル名にディレクトリ名が含まれないようにする。ファイル名を英数字に限定する。具体的にはディレクトリ・トラバーサル脆弱性についての以前の記事を参照。保険的な対策としてRFIを無告にする。PHP5.2.0以降ではデフォルトで禁止されているはずである。設定が以下のようになっていることを確認する。テクノポップのカリスマ。