アップロード検査の回避
画像アップロード機能は,要求の Content-Type ヘッダが image/png であることと,ファイル名の拡張子が拒否リスト(.php,.jsp,.asp を大文字小文字を区別して比較)に該当しないことを確認し,Web 公開領域に保存して配信する。サーバは拡張子を大文字小文字を区別せずに判定し,.php などのファイルをスクリプトとして実行する設定である。この検査をすり抜けてサーバ上でコードを実行させる手口として,最も適切なものはどれか。
- ア拡張子を .php のままにして,ファイルの先頭に PNG のマジックバイトを付けてシグネチャ検査を通す。
- イ拡張子 .png の正規の画像ファイルのコメント領域に,実行させたいコードを埋め込んでアップロードする。
- ウContent-Type ヘッダを image/png と偽り,拡張子を .pHp のように大文字小文字を混ぜて,大文字小文字を区別する拒否リストをすり抜ける。
- エファイル名を非常に長い文字列にして,保存処理のバッファをあふれさせる。
正解と解説を見る
正解 ウ
この問題の基礎知識
- 要求の Content-Type ヘッダやファイル名は,クライアントが自由に設定できるので,それだけを根拠にファイルの種類を判断することはできない。
- 拡張子の拒否リストは,大文字小文字の違いや代替の拡張子などの表記の揺れで回避されやすいので,許可する拡張子だけを列挙する許可リストが推奨される。
- Web サーバは拡張子などに基づいてファイルの扱いを決めるので,スクリプトとして実行される拡張子のファイルを公開領域に置かれると,その URL にアクセスするだけでサーバ上でコードが実行される(Web シェルの設置)。
- ファイル形式のシグネチャ(マジックバイト)検査は,ファイル先頭のバイト列で形式を判定する方法であり,Content-Type ヘッダや拡張子の検査とは別の検査要素である。
ア拡張子を .php のままにして,ファイルの先頭に PNG のマジックバイトを付けてシグネチャ検査を通す。
この機能はシグネチャを見ておらず,.php は拒否リストに大文字小文字どおり一致して弾かれる。検査の要素を取り違えており,そもそも通らない。
イ拡張子 .png の正規の画像ファイルのコメント領域に,実行させたいコードを埋め込んでアップロードする。
.png として保存・配信されると画像として扱われ,埋め込んだコードはサーバで実行されない。配信時の処理のされ方を見落としている。
ウContent-Type ヘッダを image/png と偽り,拡張子を .pHp のように大文字小文字を混ぜて,大文字小文字を区別する拒否リストをすり抜ける。正解
Content-Type は要求側が自由に設定でき信頼できない。拒否リストを大文字小文字区別で比較すると .pHp を見逃し,サーバは大文字小文字を区別せず PHP として実行するのでコードが動く。
エファイル名を非常に長い文字列にして,保存処理のバッファをあふれさせる。
これはバッファオーバーフローを狙う別の攻撃であり,拡張子・Content-Type の検査をすり抜けて実行ファイルを置く手口ではない。問われている脅威が異なる。
検証用の出典出典照合済み
OWASP File Upload Cheat Sheet / CWE-434 Unrestricted Upload of File with Dangerous Type照合の根拠(4 件)
- ウ(正解): .pHp のように大文字小文字を混ぜると,大文字小文字を区別する拒否リストをすり抜けられる
Case manipulation, e.g. .pHp , .phP , to bypass case-sensitive blocklist filters
OWASP File Upload Cheat Sheet · Extension Validation(新しいタブで開きます) - ウ(正解): Content-Type は利用者が与える値で容易に偽れるので信頼できない
The Content-Type for uploaded files is provided by the user, and as such cannot be trusted, as it is trivial to spoof.
OWASP File Upload Cheat Sheet · Content-Type Validation(新しいタブで開きます) - ウ(正解): 大文字小文字を区別しないサーバでは拡張子も区別せずに評価すべきで,区別して比較すると回避される
When running on a web server that supports case-insensitive filenames, perform case-insensitive evaluations of the extensions that are provided.
CWE-434 · Potential Mitigations(新しいタブで開きます) - 参考: 拡張子検査の回避には二重拡張子もある(本問の正解は大文字小文字の操作)
Double extensions, e.g. .jpg.php , where it circumvents easily the regex \.jpg
OWASP File Upload Cheat Sheet · Extension Validation(新しいタブで開きます)
ア(誤り)は,この機能がシグネチャを検査しておらず,.php は大文字小文字どおりに拒否リストに一致して弾かれることから問題文の条件で排除される。イ(誤り)は,サーバがスクリプトとして実行するのは .php などの拡張子のファイルで,.png として保存・配信されたファイルは実行されないことから排除される。エ(誤り)は拡張子・Content-Type 検査の回避ではなく別種の攻撃である。