「Nullバイト攻撃(Null byte attack)」
PHP
リクエストにNullバイト"\0", (URLエンコードなら"%00")を含めることで、アプリケーションが誤動作する場合があります。C言語をやっている人なら、分かると思いますが"\0"は文字列の終わりを意味するためです。
関数によっては、"\0"以降を無視しますし、関数によっては"\0"以降も扱います。"\0"以降も認識する関数をバイナリセーフな関数といいます。
バイナリセーフでない関数でチェックをしている場合"\0"以降に攻撃コードが仕掛けられたりしてしまうと、見逃してしまいます。逆にバイナリセーフな関数でチェックして、バイナリセーフでない関数(readfileとか)に渡すことでも問題が起こったりします。
プログラマーとしては、ひとつひとつの関数がバイナリセーフか否かを全て把握する(調べる)のは大変ですし、関数の相互関係まで意識し出したら嫌になります。
こういった問題はフレームワークでデフォルトで対応してもよさそうです。フレームワークとしては、リクエスト中でバイナリデータでないところに関しては"\0"を無条件で削除してしまっても問題ないと思われます(削除せずに、アプリの方でエラーとして処理するというのも手ですが…漏れがあると嫌ですね)。
アップロードされたファイルなどは、リクエスト変数に入ってこないので$_GETだの$_POSTだのは、すべて処理する方向でいいと思います。
この手の問題はWeb Application Firewall(WAF)で対応しちゃうのもありです。Apache系では、モジュールとしてmod_securityなんかが使えると思います。私は使った事ないですが。

0