ヌルバイト攻撃@PHP技術

ヌルバイト攻撃についてです。
ヌルバイト攻撃とは、関数によってNULLの扱いが違うことを利用するもしくはNULLを使用することで、チェック機構を潜り抜ける攻撃です

  • ヌルバイト攻撃側

いつもの掲示板で攻撃してみます。
今回、掲示板の方にはGETでdata_fileが送られてくるとそのファイル名をチェック(datという文字が終端か)して表示する仕組みを入れてあります。
コードは以下のとおりです

if(isset($_GET['data_file'])){
	if(substr($_GET['data_file'],-3) == 'dat'){
		readfile(basename($_GET['data_file']));
	}
}

これを起点に攻撃側はURLを使って攻撃します。

http://localhost/2-1.php?data_file=2-1.php%00dat

すると。。。掲示板に掲示板のスクリプトが表示され、エラいことに・・・これはひどい


このようにファイルチェック機構をすり抜けて表示されてしまいます。

  • ヌルバイト防御側

これに対しての防御策はwebアプリの先頭でヌルバイトを削除する、または利用する直前でヌルバイトを削除する方法があります。
2つの方法にはバイナリデータをリクエスト変数で受け渡しか可能かどうかの違いがありますが、どちらもヌルバイト削除処理をを必ず含んでいます。
以下はヌルバイト削除処理コードです

str_replace("\0","",$url);

これでヌルバイト攻撃に対応できます。

追記:他にもHTTPレスポンス攻撃とのコンビネーションができるコードがありますが、意味がわかってないので割愛