2008/02/20

PHP: ヌルバイト攻撃

かなり強力なアタックになりえる気がして、いろいろ対処を検討中。。。 ヌルバイト攻撃(NULL Byte Attack)とはわざわざ終端文字列をサイトに送りつ けて誤動作を狙う攻撃で、内容については下記のサイトが詳しい。 で、これをPHPで対処するには下記のコードを使えとある。もちろん他のどのサ イトをみてもそうしろと書いてある。
// 終端文字列を空に $v = str_replace( "\0", '', $v );
ただし、このコード、自分が試したPHP4系ではまったくもってスルーされてしま い、例えば値が空の場合を期待するようなコード、
If($v == '' ){ echo 'hello'; }
なんてのは格好の餌食。なぜなら\0が入ってるのでマッチしないから。。。 正しく動くコードは下記の通り。
// 終端文字列を空に $v = str_replace( '\0', '', $v );
なんてことはなく、"(ダブルクォーテーション)を'(シングルクォーテーション)に変える だけなのだけど、PHP5系だと逆の動作になるところがまたややこしい。。。 ちなみに、微妙だけどちゃんと空にしているかは下記のコマンドで検証できる。
wget --post-data="v=%00" http://foo.com/bar.php
※ 08/04/28追記 php-5.2.6では'\0'や"\\0"じゃないとマッチしないことを確認。。。

3 コメント:

て手テ said...

ユーザが入力できる値は信用するなってことですかねぇ。自分が作る時は極力ホワイトリストを作って文字を選別してます。
まぁ、ほとんど作ることはないですが。

anatoo said...

どうもはじめまして。
ヌルバイトを得たい場合はpack関数を使うのが確実じゃないでしょうか。
$v = str_replace(pack('c', 0), '', $v);
これなら多分PHP4,5でも同じ動作をしてくれるんじゃないかなーと思ってます。

Junji Shiokawa said...

> anatooさん

なるほどー!
すごく自然なやり方な気がします。目から鱗です。