ファイルアップロード攻撃

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

ファイルアップロード攻撃とは

ファイルをアップロードさせた後、アップロードしたファイルを踏んでPHPコードやJavaScriptを実行させる攻撃。
この攻撃の脅威は、アップロードしたいファイルにスクリプトを仕込んで転送したファイルを『システムにとって適切なファイルである』と偽装することでファイルを保存させた後、ファイルにアクセスしてコードを実行して内部情報を抜き出したりすること。
サイト内(DocumentRoot下)へアップロードファイルを管理している時に起こる可能性がある。

ファイルアップロード時の付加情報を偽装し、不正なファイルをアップロードする攻撃

■攻撃先

ファイルアップロード処理全体

■被害

あらゆるPHPコードを実行可能
ローカルアタック対策が弱いサーバであれば、root権限まで奪取される可能性がある。

Case 1

<?php
// ファイルをアップロードして、公開フォルダのimages直下にそのままファイル名で置く
if(!empty($_FILES['userfile']['tmp_name']))
{
  move_upload_file($_FILES['userfile']['tmp_name'], dirname(__FILE__).'/images/'.$_FILES['userfile']['name]);
  header('Location:http://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']);
  exit;
}

header("Content-Type: test/html; charset=Shift_JIS");

echo '
<html>
  <body>
    <form action="" method="POST" enctype="multipart/form-data">
      <input type="file" name="userfile">
      <input type="submit" value="upload">
    </form>
  </body>
</html>
';
?>

対策方法

・ファイル保存場所の非公開

アップロードファイルの保存先を公開フォルダの外に出す。
非公開のフォルダが利用出来ない場合は、ファイル名を拡張子のないランダムなものに変更して保存する。
アップロードファイルへのアクセスについては、別途、転送スクリプトを実装する。

・拡張子ホワイトリスト法

$_FILES[]['name']から拡張子を得て、許可されたものである場合のみアップロードを許可するただし、$_FILES[]['name']は偽装が可能なので万全ではない。
画像ファイルであれば、getimagesize()関数で、拡張子とファイルの中身が一致しているかを確認することが出来る。
InternetExplorerでは、Content-Typeヘッダと中身が食い違っているコンテンツは、text/htmlとして読み込まれてしまう。

※ファイルアップロードに関しては「公開フォルダにおかない」ということ以外、完全な対策はない。

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

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

Comments are closed.