14の攻撃タイプと防御法

(5)ヌルバイト攻撃

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

攻撃目標 ファイルシステム系関数:fopen()、file()、copy()、unlink()等
POSIX正規表現関数:ereg()、ereg_replace()等
被害 想定外のファイルの中身を覗かれたり、削除・書き換えが行われる。
SQL Injection、HTTPレスポンス分割、外部コマンド実行攻撃などの引数事前チェックが無効化される。

危険なコード(1) //拡張子チェックが無効化される if (substr($_GET['data_file'], -3) == 'dat' ) { readfile(basename($_GET['data_file']) ); } ↓(ヌルバイト除去) $data_file = str_replace("\0", "", $_GET['data_file']); if (substr($data_file, -3) == 'dat' ) { readfile(basename($data_file) ); } 危険なコード(2) //ereg()関数がバイナリセーフでないために、コントロールコード検知のチェックが無効化される if (!ereg('[[:cntrl:]]', $_GET['redirect_url']) ){ header('Location: '. $_GET['redirect_url']); } ↓(ヌルバイト除去) $redirect_url = str_replace("\0", "", $_GET['redirect_url']); if (!ereg('[[:cntrl:]]', $redirect_url) ){ header('Location: '. $redirect_url); } 対策

対策(1)
Webアプリケーション先頭でのヌルバイト削除法
Webアプリケーション先頭で、GET、POST、COOKIEの全リクエストに対して、ヌルバイトの除去を行う。 function sanitizer($arr) { if (is_array($arr) ){ return array_map('sanitiser', $arr); } return str_replace("\0", "", $arr); //ヌルバイトの除去 } $_GET = sanitizer($_GET); $_POST = sanitizer($_POSTGET); $_COOKIE = sanitizer($_COOKIE);
対策(2)
直前サニタイズ法
セキュリティチェック(拡張子チェックなど)直前にヌルバイトの除去を行う。


(2005/12 作成)