7

アップロード フォームで Null Byte Injection 攻撃を再現しようとしています。私はこのコードを持っています:

<?php
if(substr($_FILES['file']['name'], -3) != "php") { 
  if(move_uploaded_file($_FILES['file']['tmp_name'], $_FILES['file']['name']))
    echo '<b>File uploaded</b>';
  else
    echo '<b>Can not upload</b>';
}
else
  echo '<b>This is not a valid file/b>';
?>

次のような名前のファイルをアップロードしようとしています: file.php%00jpgしたがって、substr() をバイパスし、file.php としてアップロードされます。

問題は、アップロードされたファイルの名前がサーバー上では file.php ではなく、file.php %00jpg ( URL バーに/file.php%2500jpgと入力してアクセスできます) であることです。
move_uploaded_file() は null バイトを気にしないようですが、これはどのように機能しますか? 私のコードで拡張子が .php のファイルをアップロードすることはできますか?

ありがとう :)。

4

1 に答える 1

7

HTML フォームはファイル名を %2500 に urlencode し、PHP はそれを %00 (パーセント記号、ゼロ、ゼロ) に再度デコードします。テストのどこにも null バイトはありません。HTML フォームを使用する代わりに、実際の null バイトを使用してファイルに名前を付ける (不可能) か、手動で HTTP 要求をいじる必要があります。それでも、現在の PHP バージョンはこの攻撃に対して脆弱ではありません。PHP は内部的に変数をいわゆる ZVal コンテナーにボックス化し、文字列の途中で null バイトを許可しますが、何の影響もありません。

于 2013-02-09T22:05:48.280 に答える