Shikata Ga Nai

Private? There is no such things.

ユーザーアップロードディレクトリでのファイル実行防止(続編):設定ミスを突く攻撃者の手口

Hello there, ('ω')ノ

✅ 実行防止はWebシェル設置を阻止する強力な対策

サーバー設定でアップロードディレクトリを**「実行不可」にしておけば**

  • 攻撃者が .php, .jsp などをアップロードしても
  • スクリプトは実行されず、ただのテキストとして返る

🎯 例:

HTTP/1.1 200 OK
Content-Type: text/plain

<?php echo system($_GET['command']); ?>

→ Webシェルとしての意味はなく、ただのコード文字列になります。


🎭 しかし攻撃者は次を狙う

アップロードディレクトリ以外にファイルを書き込めるか?」 ここに脆弱性が潜んでいます。


🧠 よくある構成ミス・脆弱性例

1️⃣ ディレクトリごとに実行ポリシーが違う

ディレクトリ 設定
/uploads/ 実行不可 → 安全
/images/ 実行不可 → 安全
/tmp/ 実行不可 → 安全
/admin/ 実行可能 → 危険
/api/uploads/ 誤って実行可能設定 → 超危険

攻撃者が /api/uploads/ に書き込めた場合 → Webシェル設置成功


2️⃣ 別システム・サーバー間の設定不一致

📡 reverse proxy (リバースプロキシ)

  • フロントエンドサーバー:uploads/ 実行不可 → 安全
  • バックエンドサーバー:uploads/ 実行可能 → 超危険

攻撃者のリクエストが負荷分散(ロードバランサ)やプロキシを通ることで 意図しないサーバーに流れて成功するケースもあります。


🎯 具体的な攻撃シナリオ

  1. 通常の /uploads/shell.php → 実行不可 → NG
  2. 別ディレクトリ /images//tmp/ にパス変更で書き込み試行
  3. 偶然 /api/uploads/ などが実行可能 → Webシェル成功

✅ 診断・ペネトレーションテストのコツ

テクニック 説明
✅ 全ディレクトリにアップロード試行 /uploads/, /api/uploads/, /files/, /images/ など
✅ URLパスのパターンを推測 uploads, files, temp, assets, content
✅ サブドメインにも試行 cdn.example.com, files.example.com
✅ 負荷分散・クラスタ環境を意識 同じリクエストでも「サーバーによって応答が違う」現象をチェック
Content-Type: image/jpeg 偽装 + Webシェル を試行

💡 攻撃者が見るチェックポイント

  • 同一ドメイン内の「異なるディレクトリの設定差
  • reverse proxy, CDN, WAF などによる挙動差
  • ステージング・テスト環境(staging.example.com など)が本番より緩い設定の可能性

✅ まとめ

  • アップロード先を限定 + 実行不可ディレクトリにするが原則
  • しかし「別の場所にアップロードできたら負け」です
  • サーバーやディレクトリ間の設定差は攻撃者の格好の標的になります

「一箇所が守れていても全体が守れていなければ意味がない」 → ファイルアップロード診断では 必ず全経路・全パス・全ホストを網羅 することが大事です!

Best regards, (^^ゞ