ヌルバイト攻撃

※動作テストは自己責任で必ず自分の環境で確認すること。

ヌルバイト攻撃とは

関数によるNULLバイト(“\x00″や”\0″)の認識の違いを利用し意図的にご動作を起こす攻撃。
PHPの関数には次の2種類があり
NULLバイトを正しく処理できる関数・・・バイナリセーフの関数
NULLバイトを文字列の終端として認識してしまう・・・バイナリセーフではない関数
問題が起こる可能性のあるケースとしては次の2パターンがある。
バイナリセーフの関数で入力チェックを行い、バイナリセーフでない関数を使用した処理を行った場合
バイナリセーフでない関数で入力チェックを行い、バイナリセーフの関数を使用した処理を行っていた場合
例えば”abc\0def”という文字列は、バイナリセーフの関数ではそのまま”abc\0def”と認識されるがバイナリセーフでない関数では”abc”として認識されてしまう。
この認識の違いを悪用されると、入力データが正しくないにも関わらずチェックが通過してしまう等の事態が引き起こされてしまう。

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

■攻撃先

ファイルシステム系関数:fopen()、file()、copy()、unlink()等
POSIX正規表現関数:ereg()、ereg_replace()等

■被害

想定外のファイルの中身を覗かれたり、削除・書き換えが行われる。
SQLInjection、HTTPレスポンス分割、外部コマンド実行攻撃などの引数事前チェックが無効化される。

Case 1

<?php
// 拡張子チェックが無効化される
if(substr($_GET['file'], -3) == 'dat')
{
  readfile(basename($_GET['file']));
}
?>

対策方法

<?php
$file = str_replace('\0', '', $_GET['file']);

if(substr($file, -3) == 'dat')
{
  readfile(basename($file));
}
?>
Webアプリケーション先頭でGET、POST、COOKIEなど全リクエストに対して、ヌルバイトを除去する。
セキュリティーチェック(拡張子チェックなど)直前にヌルバイトの除去を行う。

Case 2

<?php
//ereg()関数がバイナリセーフでないために、コントロールコード検知のチェックが無効化される。
if(!ereg('[[:cntrl:]]', $_GET['url']))
{
  header('Location: '.$_GET['url']);
}
?>

対策方法

<?php
$url = str_replace('\0', '', $_GET['url']);

if(!ereg('[[:cntrl:]]', $url))
{
  header('Location: 'url');
}
?>

PHPサイバーテロの技法―攻撃と防御の実際

新品価格
¥1,890から
(2013/10/3 19:55時点)

Comments are closed.