この章では、脆弱な Web アプリケーションを題材として、OS コマンドインジェクションがどのように発生するのかを確認する。単に脆弱性名を理解するだけでなく、「どのような実装が問題を生むのか」「攻撃が成立した際にサーバ側でどのような挙動が起こるのか」を実際の操作を通して把握することを目的とする。
1.1 OSコマンドインジェクションってなに?
OSコマンドインジェクションとは、外部からの入力を介して不正に OS のコマンドを実行させるサイバー攻撃のことである。
本来、Web アプリケーションが受け取った入力はアプリ内部の処理にのみ利用されるべきである。しかし、脆弱な実装では入力がそのまま OS コマンドに連結される場合があり、攻撃者は区切り文字(; など)や追加コマンドを入力欄に混ぜることで、意図しないコマンドを実行させることが可能となる。
この脆弱性はアプリケーション層ではなく OS(システムレベル)に影響が及ぶ点が特徴であり、ファイル操作、ネットワーク設定の取得、プロセス管理など、システム全体への侵害につながる恐れがある。攻撃が成功した場合の影響範囲は極めて大きく、重大な脆弱性の一つとされる。
OSコマンドインジェクションとSQLインジェクションの違い
OSコマンドインジェクションと混同されがちな攻撃手法に SQLインジェクション がある。
SQLインジェクションとは、Webアプリケーションの脆弱性を悪用して不正な SQL 文をデータベースに注入し、データの閲覧・改ざん・削除を行う攻撃である。
両者の大きな違いは、攻撃対象の層と影響範囲にある。このように、SQLインジェクションが データベース操作に限定された攻撃 であるのに対し、OSコマンドインジェクションは システム全体を操作できてしまう極めて危険な脆弱性 である。
1.2 実験環境について
今回は、脆弱性対象として OWASP-BWA を使用する。これは OWASP(Open Source World Wide Application Security Project)によって開発された、脆弱性を意図的に含んだ学習用 Web アプリケーションである。
攻撃側の環境としては Kali Linux を利用し、OWASP-BWA 内にある DVWA の「Command Execution」機能 を対象に演習を行った。Kali Linux と OWASP-BWA は VirtualBox 上で Host-only 接続 により接続し、外部ネットワークへ影響を及ぼさないクローズドな状態で実施している。
この設定により、実習内容が外部へ漏れ出す危険を防ぎ、安全な検証環境を構築している。
1.3 DVWAを用いたOSコマンドインジェクションの確認
1.3.1 OWASP-BWA にアクセス
まず、Webブラウザから OWASP-BWA にアクセスし、DVWA(Damn Vulnerable Web Application) へログインする。このとき、URL のアドレス部分は対象のアドレスを使用し、名前とパスワードはデフォルトのものを利用する。
- URL: http://192.168.128.7/dvwa/index.php
- 認証情報: user: admin, pass: admin
ログイン後、DVWA が提供する各種脆弱性学習メニューが表示される。本演習ではその中の 「Command Execution」 を使用する。
1.3.2 Command Execution の動作確認
メニューから 「Command Execution」 を選択すると、任意の IPv4 アドレスを指定して ping を実行する簡易フォームが表示される。まずは通常どおり BWA の IP アドレスを入力し、ping の結果が画面に表示されることを確認した。
次に、IP アドレスの後に区切り文字 ; を用いてコマンドを追加できるかを確認するため、以下のような入力を行った。
送信すると、画像の通り ping の出力に続けて uname -a の実行結果が表示され、OS レベルのコマンドが実行されてしまう挙動が確認できた。
1.3.3 Kali 側で nc による待ち受けの確認
次に、脆弱性を利用して Kali 側に接続させる挙動を観察するため、Kali Linux で nc(netcat) を待ち受け状態にした。
Kali 上で次のように指定し、特定のポート(今回は 1691番)で待ち受ける。
この状態で、DVWA の入力フォームに特定の文字列を送信すると、脆弱なサーバ側から Kali に接続し、結果としてサーバ上のシェルが Kali から操作可能な状態になる。試しに以下の内容を送信する。
送信後、Kali のターミナルにも返答が表示された。これは待ち受けが成功したことを意味し、Kali のターミナル上で Web サーバが実行しているユーザとして、システムコマンドを実行できる状態になった ことを示している。

Kaliのターミナルの出力結果

BWAのターミナルの出力結果(内容が同じであることがわかる。)
1.4 結果の考察
今回の演習では、DVWA の「Command Execution」を使い、OS コマンドインジェクションが実際にどのように起きるのかを確認した。入力欄に IP アドレスだけでなく「; uname -a」などの文字列を混ぜると、そのまま OS のコマンドとして実行されてしまうことから、アプリ側がユーザ入力を信頼しすぎていることが分かった。
普段は意識しないが、Web アプリが内部で外部コマンドを呼び出している場合、入力内容をそのまま結合してしまうと、今回のように簡単に想定外の操作が行われてしまう。特に OS コマンドインジェクションは Web アプリの範囲を越えて OS レベルまで影響が広がるため、被害が大きくなりやすい攻撃である。
また、Kali 側で nc を待ち受けた際には、脆弱な Web サーバがこちらに接続してくる様子が確認できた。もし実際の運用サーバで同様の状況が起きれば、攻撃者にサーバ内部を操作されてしまう可能性がある。単に画面出力が変化するだけでなく、「サーバ側のシェルが奪われる」という危険性が現実味を伴って理解できた点は大きい。
今回の演習を通し、外部入力を扱う際にどれほど慎重である必要があるかを再認識した。不要な外部コマンド呼び出しを避ける、入力値を厳しく制限する、最低権限でアプリケーションを動かすなど、基本的な対策の重要性が浮き彫りとなった。実際に挙動を観察することで、教科書だけでは分からない脆弱性の危険性を強く実感できた。
1.5 まとめ
本章では、DVWA を使って OS コマンドインジェクションのしくみと危険性を確認した。入力欄に追加した文字列がそのまま OS コマンドとして実行されてしまう様子を見ることで、ユーザ入力を適切に処理しないことのリスクを理解することができた。また、nc を使った待ち受けでは、脆弱なサーバが外部へ接続しようとする動作を確認し、攻撃者がサーバ内部を操作できる可能性があることを実感した。
こうした脆弱性は特別な状況でなくとも、実装上の些細な油断から容易に生まれてしまう。そのため、入力値検証や外部コマンドの利用を避ける設計など、基本的な対策が極めて重要である。今回の演習は、Web アプリの脆弱性が OS レベルにまで波及する可能性を理解する良い機会となった。

