Shikata Ga Nai

Private? There is no such things.

静的ファイルリクエストの処理(続編):ファイル種別によるサーバーの挙動と脆弱性へのつながり

Hello there, ('ω')ノ

✅ サーバーが静的ファイルを処理する流れ(復習)

静的ファイルに対するリクエストは、 基本的には以下の手順で処理されます:

  1. リクエストのパスを解析(URL → ファイルパス)
  2. ファイルの拡張子を特定
  3. 拡張子とMIMEタイプの対応表(マッピング)を参照
  4. 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, (^^ゞ