Nullバイト攻撃対策

PHPは、ファイルシステムに関わる処理においてC言語の関数を用いています。そのため、Nullバイト処理で挙動がおかしくなることがあります。

攻撃される場所

リクエストを$_POSTや$_GETなどで受け取ることで発生します。例えば不適切に処理された外部入力を受け付けるフォームなどが該当します。Nullバイト攻撃は、「\0」「\x00」「%00」といった文字列の終わりを意味する制御文字をリクエストに含めることでセキュリティーチェックをすり抜ける手法です。これは、終了を意味する制御文字以降にも実際には文字列が存在するのに、存在しないものとして取り扱われてしまうことが原因です。そのため、終了制御文字以降に悪意あるコードが注入されていたら攻撃が成立してしまうことがあります。

対処法

処理の最初で、$_GET、$_POST、$_REQUEST、$_COOKIEからNullバイトを取り除くか、preg_matchなどで利用できる文字列をホワイトリスト化します。また、できる限りバイナリセーフな関数を使ってチェックします。ただ、PHP5.3.5以降では、引数の値にファイルパスを指定できる関数と言語構造にNullバイト文字が含まれれば処理が失敗するようになっています。その場合、「・・・expects parameter 1 to be a valid path, string given in・・・」といったエラーが表示されます。

// 文字列からNullバイト文字を削除
$_POST['attack'] = str_replace("\0", "", $_POST['attack']);
// Nullバイト文字が存在すれば処理を停止
if(strpos($_POST['attack'], "\0") !== false)
{exit;}