Edited at

NULLバイト攻撃への対策(ヌルバイトアタック)

More than 3 years have passed since last update.


ヌルバイトを一切許可しない

デメリットとしては、バイナリデータを直に受渡できなくなる。

でも直に受け渡す事ってあんまりないから主にこれを使ってる。


冒頭に記述

function sanitizer($arr) {

if (is_array($arr) ){
return array_map('sanitizer', $arr);
}
return str_replace("\0", "", $arr);
}
$_GET = sanitizer($_GET);
$_POST = sanitizer($_POST);
$_COOKIE = sanitizer($_COOKIE);


ホワイトリストではじく

preg_matchで使用可能な文字列のみ許可する。

IDとかの問い合わせはこれも併用。


ホワイトリスト

if (preg_match("/^[a-zA-Z0-9]+$/", $id)) {

$id = $id;
}else{
$error = 'IDは半角英数で登録してください。';
}


ヌルバイト攻撃


  • ヌルバイト攻撃とは、何らかのリクエストされた文字列に%00(ヌルバイト)を含めることで、Webアプリケーション側のセキュリティーチェックをくぐり抜ける攻撃です。

  • PHP自体はC言語で書かれているらしく(知らなかった)、PHPとCのヌルバイトに対する扱いが違う関数の「ねじれ」を利用した攻撃。

  • そもそもNULLを「ヌル」と読むより本当は「ナル」と発音するらしい。でも発音すると結構ややこしい事になるらしく(〜ナルが〜になるetc…)ヌルと言うらしい。

  • 「…らしい」ですけどね。

  • リクエストにNULL バイトが含まれていた場合、文字列の終了とみなしてしまう関数がある。バイナリデータが含まれるとちゃんと意図した処理をしてくれない。ereg()とか。

  • 例えば%00は文字列の終りを意味するコードになります。eregはコレを入力文字列の終了部分と判断するので、それより後の文字列はノータッチ(無審査)です。なのでヌル文字より後に攻撃用の文字列が書かれていてもeregではそれを検出できない。

  • この攻撃はディレクトリ遡りと併用されるのでしっかり対策しないとダメ。

  • ホワイトリストでも大丈夫だと思うけど抜けがあると怖いので除去法(上のコード)がおすすめ。ネットで探すとアレが結構出てくるし、本にも載ってます。

  • PHP5.3.4以降ではこの攻撃が成立しにくくなってるらしい。結局バージョンアップをちゃんとするのが吉。

  • 色々勉強したけどイマイチ完璧には理解できてない。もっと勉強しないと…。