Hello there, ('ω')ノ
✅ サーバーが静的ファイルを処理する流れ(復習)
静的ファイルに対するリクエストは、 基本的には以下の手順で処理されます:
- リクエストのパスを解析(URL → ファイルパス)
- ファイルの拡張子を特定
- 拡張子とMIMEタイプの対応表(マッピング)を参照
- MIMEタイプに応じた処理 を実行(実行する・しない・エラー返す など)
🧠 拡張子とMIMEタイプによる分類とサーバーの挙動
1. 🖼️ 非実行ファイル(画像・HTML・CSSなど)
.jpg
,.png
,.css
,.html
など- サーバーはファイルの内容をそのまま HTTPレスポンスのボディに流すだけ
✅ 処理:ファイルを読み取り → Content-Typeを設定 → レスポンスとして返却
2. 🧨 実行可能ファイル(PHP, JSP, ASPなど)
- 拡張子
.php
,.jsp
,.asp
などが対象 サーバーがその拡張子を「実行対象」として設定している場合:
- リクエストパラメータやヘッダー情報を環境変数に変換
- 対象のスクリプトファイルを実行(例:PHPエンジンで処理)
- 出力結果を HTTPレスポンスとして返却
✅ 処理:実行 → 結果をレスポンスとして送信
3. 🧱 実行対象だが、実行設定されていない場合
📚 例:
.php
ファイルがアップロードされたが、/uploads/
ディレクトリは PHPの実行が許可されていない
🧨 結果:
- サーバーによっては エラー(403 / 500) を返す
- 一部の誤設定では、スクリプトの中身をそのまま表示してしまう
⚠️ このケースのリスク
- サーバーが
.php
ファイルの中身を「プレーンテキスト」として返す → 攻撃者に ソースコードが漏洩 する(情報漏洩)
🔍 ヘッダー情報でヒントを得る:Content-Type
の活用
🧠 Content-Type
とは?
サーバーが「このファイルは何の種類か?」を示すためのレスポンスヘッダー。
📚 例:
Content-Type: image/png Content-Type: text/html Content-Type: application/x-httpd-php
- アプリケーションが明示的に設定していない場合、 サーバーは拡張子に基づいて自動的に MIMEタイプを推定して設定します。
🕵️♂️ 攻撃者視点:ここをチェックする!
チェック項目 | 内容 |
---|---|
Content-Typeの値 | MIMEタイプが正しいか、意図せず「text/plain」になっていないか? |
.phpや.jspファイルが実行されてしまうか? | スクリプトのアップロード&アクセスができるか? |
コードそのものが表示されてしまわないか? | 実行されず、ソースが漏洩していないか? |
保存ディレクトリの設定 | /uploads/ や /files/ に対して実行権限があるか? |
🎯 まとめ:サーバーが静的ファイルをどう扱うかを理解することが、脆弱性の発見につながる!
✅ サーバーは拡張子を見て、ファイルの処理方法を決定している
✅ .php
などが 実行されるのか、されないのか が安全性の分かれ目
✅ 実行されないはずのファイルが コードのまま見えてしまうこと も大きなリスク
✅ Content-Type
ヘッダーの挙動を観察することで、サーバーの設定を推測可能
「どう見えるか」ではなく「どう処理されるか」が肝心! この基本を理解していれば、ファイルアップロードの脆弱性を見抜く力が確実に高まります。
Best regards, (^^ゞ