[PHP-users 12736] null byte attack

Yasuo Ohgaki php-users@php.gr.jp
Wed, 22 Jan 2003 15:31:07 +0900


大垣です。

BugTraqでw-agoraのセキュリティーホールがレポートされていた
なかで、null byte attackについて書いてありました。

メールの中にはfopenがNull Byte Attack可能と書いてあった
のですが、実際に良く見かけるコードで危険な例をすぐに思いついた
のでメールします。

以下は私が書いた脆弱性の例です。preg_matchを使って拡張子
をチェックし、開くファイルを指定するスクリプトが危険である事
が確認できます。

<?php
// ファイル名: null_byte.php
// 攻撃例: http://example.com/null_byte.php?filename=null_byte.php%00myext
// 上記の攻撃例では意図していないスクリプトソースが表示される

echo '<pre>';

// 専用の拡張子のファイルのみ開く(つもり)
if (preg_match('/myext$/', $_GET['filename'])) {
  // eregはバイナリセーフではないので、\0で文字列の終り
  // とみなします。eregを使っている場合はnull byte attackは
  // 不可
  readfile($_GET['filename']);
}
else {
  echo "bad file\n";
}
?>

私は普段eregを使っているのでこのような攻撃に対して問題になる
スクリプトはありませんが、preg*を使っている方は要注意です。

# マニュアルにはpregを勧める記載がありますが、
# ファイル名のチェックにはeregの方が良いと思います。
# eregもバイナリセーフになった時には困りますが、
# その場合はstrspnなどが利用できると思います。

ユーザー入力からファイルを表示したり開いたりするスクリプト
を書かれている方もいらっしゃると思いますが、チェックを十分
しないとセキュリティーホールの原因にります。

# パッチは簡単に作れるので、PHP内部で対策した方が良さそう
# ですね。php_stream_open_wrapperだけ対策してもかな
# り効果がありそうですから...

--
Yasuo Ohgaki