午前I問題
Webアプリケーションのファイルアップロード機能に関する記述として、適切なものはどれか。
ア)ファイルアップロード機能は、クライアント側のJavaScriptで拡張子を検証していれば、サーバ側での検証は不要である。
イ)ファイルアップロード機能では、アップロードされたファイルの拡張子・Content-Type(MIMEタイプ)・実際のファイル内容(マジックバイト等)はいずれも攻撃者によって偽装され得るため、単一の検証方法だけに頼らず複数の観点から検証する必要がある。
ウ)アップロードされたファイルを画像専用のCDNに保存すれば、いかなる場合もサーバサイドスクリプトとして実行されることはなくなる。
エ)ファイルアップロード機能に脆弱性が存在しても、攻撃者がファイルを閲覧できる経路がなければ一切の被害は発生しない。
午前I の解答・解説を見る
正解: イ
解説:
- ア)不正解。クライアント側の検証はブラウザの開発者ツールやプロキシツールで容易に迂回できるため、サーバ側での検証が必須である。
- イ)正解。拡張子は偽装・二重化(例:
shell.php.jpg)が可能であり、Content-Typeヘッダはクライアントが自由に設定できるため信頼できない。ファイル内容も先頭バイト(マジックバイト)を偽装したポリグロットファイルが存在するため、拡張子・MIMEタイプ・内容検証・保存先設定など複数の防御層を組み合わせる必要がある。 - ウ)不正解。CDNや保存先の設定によってはスクリプトとして実行されてしまう構成もあり得るため、「CDNに保存すれば絶対安全」とは言えない(実行権限の設定・Content-Typeの強制指定等の対策が別途必要)。
- エ)不正解。閲覧経路がなくても、アップロードされた悪意あるファイルが後続のバッチ処理やライブラリ(画像処理ライブラリの脆弱性等)で解析される際に悪用される可能性がある。
午前II問題
ファイルアップロード機能を悪用した攻撃手法に関する記述のうち、最も適切なものはどれか。
ア)二重拡張子攻撃とは、shell.php.jpg のようなファイル名を用いて、拡張子チェックの実装不備(例:拡張子リストの末尾のみ確認する、または特定サーバ設定でApacheが .php を含むファイル名を実行可能と誤解釈する)を突き、画像ファイルと誤認させつつサーバサイドスクリプトとして実行させる攻撃である。
イ)Webシェルとは、攻撃者がアップロードした画像ファイルの中にウイルス対策ソフトのシグネチャを埋め込み、検出を回避する手法の名称である。
ウ)ファイルアップロード機能の脆弱性は、常にアップロード先のディスク容量枯渇によるDoS攻撃としてのみ現れ、リモートコード実行には至らない。
エ)Content-Typeヘッダの検証さえ厳格に行えば、拡張子の検証やファイル内容の検証を省略しても安全である。
午前II の解答・解説を見る
正解: ア
解説:
- ア)正解。二重拡張子攻撃は、拡張子検証ロジックの不備(最後の拡張子だけを見る/最初の拡張子だけを見る等)や、サーバ設定(Apacheの
AddHandler設定で.php.jpgのようなファイルも.phpとして実行されてしまう等)を悪用し、検証を迂回してスクリプトを実行させる古典的だが依然有効な攻撃手法である。 - イ)不正解。Webシェルとは、アップロードに成功した悪意あるスクリプトファイル自体を指し、これにアクセスすることで攻撃者がリモートからOSコマンド実行等を行うための「裏口」となるものである。ウイルス対策ソフトのシグネチャ埋め込みとは異なる概念。
- ウ)不正解。Webシェルが実行可能な状態でアップロードされると、リモートコード実行(RCE)に直結する重大な脅威となる。ディスク容量枯渇によるDoSは可能性の一つに過ぎない。
- エ)不正解。Content-Typeヘッダはクライアントが自由に設定可能であり、単独の検証手段としては不十分。拡張子検証・ファイル内容(マジックバイト)検証・保存先の実行権限制御など多層的な対策が必要である。
午後問題
K社の求人応募サイトでは、応募者が履歴書(PDF・画像形式)をアップロードできる機能を提供している。セキュリティ診断で以下が判明した。
診断結果
- サーバ側の検証は、アップロードされたファイル名の拡張子が
.jpg.png.pdfのいずれかで終わっているかをチェックしているのみであった。 - アップロードされたファイルは、Webサーバの公開ディレクトリ配下の
/uploads/にオリジナルのファイル名のまま保存され、そのディレクトリはPHPスクリプトの実行が許可された設定になっていた。 - 診断者が
resume.php.jpgという名前のファイル(中身はPHPのWebシェルコード)をアップロードしたところ、サーバの設定(AddHandlerによりファイル名に.phpを含む場合はPHPとして処理される設定)により、/uploads/resume.php.jpgに直接アクセスするとアップロードしたWebシェルコードが実行され、任意のOSコマンドが実行可能な状態であることが確認された。
設問1
この事象が成立した根本原因を、(1) 検証ロジックの不備、(2) サーバ設定・保存先の不備の2つの観点からそれぞれ40字以内で述べよ。
設問1の解答・解説を見る
正解例:
- (1) 検証ロジックの不備:拡張子の末尾一致のみを確認しており、ファイル内容やMIMEタイプを検証していない(38字)。
- (2) サーバ設定・保存先の不備:アップロード先ディレクトリでスクリプト実行が許可されており、
.phpを含むファイル名も実行対象となる設定だった(46字)。
解説: 本事例は「入力検証(アプリケーション層)」と「実行環境設定(インフラ層)」という2つの防御層がいずれも機能していなかった典型例である。拡張子の末尾一致という緩い検証は二重拡張子攻撃を防げず、加えてアップロード先ディレクトリでスクリプト実行が許可されていたため、たとえ検証を通過してしまったファイルであっても実行には至らない設計(多層防御)が欠けていた点が問題である。
解説・採点基準(計15点):
| 採点項目 | キーワード | 配点 |
|---|---|---|
| (1) 拡張子の末尾一致のみ/内容未検証への言及 | 拡張子のみ、内容検証なし | 7点 |
| (2) アップロード先でスクリプト実行が許可されている旨への言及 | 実行許可、AddHandler、実行権限 | 8点 |
設問2
K社が講じるべき対策を、入力検証・保存方式・実行環境設定の3つの観点からそれぞれ1つずつ述べよ。
設問2の解答・解説を見る
正解例:
- 入力検証:拡張子だけでなく、ファイル内容の先頭バイト列(マジックバイト)を検査して実際のファイル形式を判定し、画像であればさらに画像処理ライブラリで再エンコード(無害化)することで悪意あるコードの混入を排除する。
- 保存方式:アップロードされたファイル名をそのまま使わず、サーバ側でランダムな一意のファイル名(UUID等)に変更して保存し、拡張子も検証済みの許可リストの値に固定し直す。
- 実行環境設定:アップロードディレクトリをWebサーバの公開領域(Webルート)外に配置する、またはやむを得ず公開領域内に置く場合はそのディレクトリでのスクリプト実行を明示的に無効化する設定(例:
.htaccessでのハンドラ無効化や、実行権限のないストレージ・別ドメインでの配信)を行う。
解説: ファイルアップロード対策のベストプラクティスは「検証・命名・実行制御」の3層防御に集約される。特に「アップロードされたファイルは実行可能な場所に置かない」という原則が最も効果的であり、加えて画像の再エンコードによる無害化やファイル名のランダム化を組み合わせることで、検証をすり抜けたファイルがあってもRCEに直結しないようにする多層防御が重要である。
解説・採点基準(計15点):
| 採点項目 | キーワード | 配点 |
|---|---|---|
| 入力検証にマジックバイト検査/再エンコードへの言及 | マジックバイト、再エンコード、無害化 | 5点 |
| 保存方式にファイル名のランダム化/固定拡張子への言及 | ランダムなファイル名、拡張子固定 | 5点 |
| 実行環境設定にWebルート外配置/スクリプト実行無効化への言及 | Webルート外、実行権限無効化 | 5点 |
重要キーワード
| 用語 | 説明 |
|---|---|
| Webシェル | アップロードに成功した悪意あるスクリプトファイル。攻撃者がリモートでコマンド実行するための裏口となる |
| 二重拡張子攻撃 | shell.php.jpg のようなファイル名で拡張子検証やサーバ設定の不備を突き、スクリプトとして実行させる攻撃 |
| マジックバイト | ファイル形式を識別するための先頭バイト列。拡張子偽装を見破るための検証に利用される |
| ファイル無害化(再エンコード) | 画像等を一度デコードし再エンコードすることで、埋め込まれた悪意あるコードを除去する対策 |
| Webルート外保存 | アップロードファイルをWebサーバの公開領域外に保存し、直接的なスクリプト実行を防ぐ対策 |
| OSコマンドインジェクション | Webシェル経由で実行されるコマンドの危険性の理解に関連する周辺知識 |
まとめ
- 午前I視点: 拡張子・MIMEタイプ・ファイル内容はいずれも偽装可能であり、単一の検証手段に依存すべきでないという原則を理解する
- 午前II視点: 二重拡張子攻撃の成立条件(検証ロジックの不備とサーバ設定の組み合わせ)とWebシェルの役割を正確に区別する
- 午後視点: 検証ロジック(内容検査)とサーバ設定(実行制御)の両面から根本原因を分析し、マジックバイト検証・ファイル名ランダム化・Webルート外保存という3層の対策を具体的に説明できるようにする