Shikata Ga Nai

Private? There is no such things.

OSコマンドインジェクションの基本:引数に注入できるかを見抜く

Hello there, (^^ゞ

🎯 想定される処理の流れ

stockreport.pl 381 29

このコマンドは、商品ID(productID)と店舗ID(storeID)を受け取り、在庫情報を返すスクリプトです。


🌐 Web側のURL

https://insecure-website.com/stockStatus?productID=381&storeID=29

このリクエストを処理するサーバ側のロジックは、次のように実装されていると想定されます:

system("stockreport.pl " + productID + " " + storeID)

つまり、ユーザー入力が直接OSコマンドの引数に渡っている可能性があるということです。


🧨 攻撃の糸口:storeIDに注入してみる

storeIDに次のような入力を渡した場合:

29; whoami

生成されるコマンド:

stockreport.pl 381 29; whoami

stockreport.pl の後に whoami が実行される!


🚨 攻撃の影響

  • OS上で任意のコマンドが実行可能
  • アプリケーションのユーザー権限でファイル読み取り・改ざん・削除
  • ネットワーク内部の探索や攻撃のピボット

✅ 防御策

  • OSコマンド呼び出しの代わりにネイティブAPIを使う
  • 入力値を数値としてバリデーション(ホワイトリスト)
  • コマンドを実行する場合は引数を配列で渡し、シェル解釈を避ける

Best regards, (^^ゞ