Written by WizLANSCOPE編集部
目 次
OSコマンドインジェクションとは、Webアプリケーションへの入力値に不正なOSコマンドを紛れ込ませることで、サーバー側で意図しない命令を実行させるサイバー攻撃です。
特に、Webアプリケーションがユーザーからの入力値をOSコマンドに組み込んでいる場合は、実装方法によって攻撃を受ける恐れがあります。
攻撃に成功すると、サーバー内に保存された情報の漏洩やファイルの改ざん、システムの乗っ取りなど、深刻な被害につながる可能性があります。
本記事では、OSコマンドインジェクションの仕組みや想定される被害、有効な対策について分かりやすく解説します。
▼本記事でわかること
- OSコマンドインジェクションの仕組み
- OSコマンドインジェクションによる被害
- OSコマンドインジェクションへの対策
「OSコマンドインジェクションとはどのような攻撃なのか」「どのような対策が有効なのか」を知りたい方は、ぜひ最後までご覧ください。

OSコマンドインジェクションとは

OSコマンドインジェクションとは、Webアプリケーションの脆弱性を悪用し、サーバー上で意図しないOSコマンドを実行させるサイバー攻撃です。
「インジェクション」は「注入」を意味します。
攻撃者は、Webアプリケーションの入力に不正なOSコマンドを紛れ込ませることで、サーバー上で意図しないOSコマンドを実行させます。
攻撃が成功すると、情報漏洩やファイル・データベースの改ざん・削除、不正プログラムの実行、マルウェア感染など、深刻な被害につながる恐れがあります。
OSコマンドインジェクションの仕組み

OSコマンドインジェクションは、Webアプリケーションがユーザーからの入力値を適切に検証せず、そのままシェルへ渡すことで、攻撃者が意図したOSコマンドが実行されてしまう攻撃です。
ここでは具体例を用いて、攻撃のメカニズムを解説します。
例えば、Webアプリケーションが入力値を利用して、次のようなコマンドを実行するとします。
| ls<入力値> |
ここで攻撃者が入力フォームに以下のような文字列を入力したとします。
| documents; cat /etc/passwd |
Webアプリケーションは、入力値をそのまま連結してシェルに渡します。
| ls documents; cat /etc/passwd |
「;」はシェルの制御演算子のひとつで、「前後のコマンドを順番に実行する」という意味を持っています。
そのためシェルは、この文字列を2つのコマンドとして解釈し、次のコマンドを順番に実行します。
| ls documents cat /etc/passwd |
lsコマンドは指定したディレクトリ内のファイルやフォルダの一覧を表示し、catコマンドは指定したファイルの内容を表示します。
/etc/passwdにはシステム上のユーザーアカウント情報が保存されており、攻撃者はこれらの情報を収集することでシステム構成を把握し、さらなる攻撃へ発展させる可能性があります。
このように、ユーザーからの入力値を適切に検証せずOSコマンドへ渡す実装は、攻撃者に悪用される恐れがあります。
OSコマンドインジェクションの脆弱性が生じる原因

OSコマンドインジェクションの脆弱性は、主に以下のような要因によって発生します。
- 入力値をOSコマンドに組み込む設計になっている
- 入力値が適切に検証・制限されていない
- シェルを介してOSコマンドを実行している
前述した仕組みからもわかるように、入力値をOSコマンドの一部として利用するような設計になっている場合、攻撃者が悪意を持って入力した文字列がコマンドとして解釈されるリスクが高まります。
また、入力値の検証が不十分な場合、「;」などの制御演算子を含む文字列もそまま受け付けてしまいます。
この状態でシェルを介してOSコマンドを実行する関数を使用すると、シェルは「;」をコマンドの区切りとして解釈するため、開発者が想定していないOSコマンドまで実行される可能性があります。
前提として、シェルは渡された文字列をコマンドとして解釈・展開し、実行する役割を担います。不正な入力かどうかを判断して実行を拒否する機能はありません。
そのため、ユーザーからの入力値を適切に検証・制限したうえでシェルへ渡すこと、あるいはシェルを介さずにOSコマンドを実行する実装を採用することが重要です。
OSコマンドインジェクションとSQLインジェクションの違い

OSコマンドインジェクションと混同しやすい攻撃に、「SQLインジェクション」があります。
SQLインジェクションとは、Webアプリケーションの脆弱性を悪用し、不正なSQL文を実行させるサイバー攻撃です。
OSコマンドインジェクションとSQLインジェクションは、どちらもWebアプリケーションの脆弱性を悪用し、不正な文字列を注入して意図しない処理を実行させるという点で共通しています。
一方で、攻撃対象や実行される命令、想定される被害には違いがあります。
OSコマンドインジェクションとSQLインジェクションの違いは、以下の通りです。
| SQLインジェクション | OSコマンドインジェクション | |
|---|---|---|
| 攻撃対象 | データベース | サーバーOS |
| 実行される命令 | SQL文 | OSコマンド |
| 被害例 | 情報漏洩、データ改ざん | 情報漏洩、Webシェルの設置、マルウェア感染 |
SQL(Structured Query Language)とは、データベースを操作するための言語です。
攻撃者はSQLインジェクションによって不正なSQL文を実行させ、データベース内の情報を不正に取得したり、データを改ざん・削除したりします。
このように、SQLインジェクションの攻撃対象はデータベースであり、攻撃者はデータベースへ送信されるSQL文を改変して攻撃を行います。
一方、OSコマンドインジェクションの攻撃対象はサーバーOSです。攻撃者はOSへ渡されるコマンドを改変し、本来実行される予定のコマンドに加えて、不正なOSコマンドを実行させます。
OSコマンドインジェクションでは、サーバーOS上で任意のコマンドが実行されるため、情報漏洩やデータの改ざんだけでなく、Webシェルの設置やマルウェア感染など、サーバー全体を侵害する深刻な被害につながる可能性があります。
OSコマンドインジェクションによる被害

OSコマンドインジェクション攻撃を受けると、主に以下のような被害が生じる可能性があります。
- 情報漏洩
- マルウェア・ランサムウェアへの感染
- 攻撃の踏み台化
- ファイルの改ざん・削除
詳しく確認していきましょう。
情報漏洩
OSコマンドインジェクションによって、いきなりデータベース内の情報が取得されるとは限りません。
一般的には、攻撃者は任意のOSコマンドを実行し、まずOSやWebサーバーの種類、ディレクトリ構成、ネットワーク構成などを調査して、サーバー内の環境を把握します。
そのうえで、データベースの接続情報が記載された設定ファイルや認証情報などを取得し、重要な情報へアクセスするための足がかりを得ます。
最終的には、取得した認証情報などを悪用してデータベースやクラウドストレージへ不正にアクセスしたり、サーバー内の機密ファイルを閲覧したりすることで、個人情報や機密情報が漏洩する恐れがあります。
マルウェア・ランサムウェアへの感染
OSコマンドインジェクションによって、マルウェアやランサムウェアに感染する恐れもあります。
OSコマンドインジェクションが成功すると、攻撃者はサーバー内を調査し、認証情報の収集や権限昇格を行うことで、操作できる範囲を広げます。
その後、不正なプログラムをサーバーへダウンロード・実行することで、マルウェアやランサムウェアに感染させるケースがあります。
さらに、侵害されたサーバーを起点として、社内ネットワーク内のほかのサーバーや端末へ感染が拡大すると、システムが利用できなくなったり、重要なデータが暗号化されたりするなど、事業継続に大きな影響を及ぼす恐れがあります。
攻撃の踏み台化
OSコマンドインジェクションが成功すると、攻撃者はサーバー上にWebシェルを設置する恐れがあります。
Webシェルとは、攻撃者が侵害したWebサーバーを遠隔から継続的に操作するためのプログラム(スクリプト)のことです。
Webシェルが設置されると、攻撃者はWebシェルへアクセスしてコマンドを送信するだけで、サーバー上で任意のOSコマンドを実行できるようになります。
その結果、サーバーが攻撃者の管理下に置かれ、ほかのサーバーやシステムへの攻撃、中継サーバーとしての悪用、マルウェアの配布など、さまざまな不正行為の踏み台として利用される恐れがあります。
万が一、自社のサーバーがサイバー攻撃の踏み台として悪用された場合、自社だけでなく取引先や顧客にも被害が及ぶ可能性があるほか、社会的信用の低下にもつながりかねません。
ファイルの改ざん・削除
前述した情報漏洩やマルウェア・ランサムウェア感染などは、OSコマンドインジェクションが成功したからといって、すぐに発生するわけではありません。
多くの場合、攻撃者はまずサーバー内を調査し、認証情報や設定ファイルを収集するなど、段階的に攻撃を進めていきます。
一方で、ファイルの改ざん・削除は、OSコマンドインジェクションだけで実行されてしまうケースがあります。
攻撃者はサーバー内を調査して対象となるファイルを特定すると、OSコマンドを使ってファイルを書き換えたり削除したりします。
その結果、Webサイトが改ざんされて意図しない内容が表示されたり、システムの動作に必要なファイルが削除されてサービスが停止したりする恐れがあります。

OSコマンドインジェクションへの対策

OSコマンドインジェクションを防ぐためには、Webアプリケーションの設計や実装段階から適切な対策を講じることが重要です。
本記事では、OSコマンドインジェクション対策として代表的な以下の6つの方法を紹介します。
- OSコマンドを使用しない設計にする
- シェルを経由しないAPIを利用する
- 入力値の検証を徹底する
- Webアプリケーションの権限を最小限にする
- WAFを導入する
- 脆弱性診断を実施する
最も効果的な対策は、ユーザー入力をOSコマンドへ渡さない設計を採用することですが、業務要件などの理由からOSコマンドの利用が避けられないケースもあります。
そのような場合は、これから紹介する対策を組み合わせ、多層的にリスクを低減することが重要です。
OSコマンドを使用しない設計にする
OSコマンドインジェクションを防ぐうえで最も効果的なのは、そもそもOSコマンドを使用しない設計にすることです。
ファイルの操作やディレクトリの作成といった処理は、OSコマンドを使わなくても、プログラミング言語が提供する標準ライブラリやAPIで実現できるケースが多くあります。
まずはOSコマンドを呼び出す必要が本当にあるのかを見直し、同じ処理を実現できる標準ライブラリやAPIがある場合は、そちらを利用しましょう。
シェルを経由しないAPIを利用する
OSコマンドの使用を避けられない場合は、シェルを経由せずにプログラムを実行できるAPIを利用しましょう。
前述の通り、シェルを介してOSコマンドを実行すると、「;」などの制御演算子がコマンドの区切りとして解釈され、想定していないコマンドまで実行される恐れがあります。
一方、シェルを経由しないAPIでは、実行するプログラムと引数を分けてOSへ渡します。
そのため、入力値に「;」が含まれていたとしても、コマンドの区切りではなく、ひとつの引数として扱われます。
これにより、攻撃者が入力値を利用して別のOSコマンドを追加することが難しくなり、OSコマンドインジェクションのリスクを大幅に抑えられます。
ただし、シェルを経由しなければすべて安全というわけではありません。
実行するプログラムによっては、入力値がオプションやファイルパスとして悪用される恐れがあるため、後述する入力値の検証もあわせて行うことが重要です。
入力値の検証を徹底する
OSコマンドインジェクションを防ぐためには、ユーザーから受け取る入力値を適切に検証することが欠かせません。
入力値の検証方法として有効なのが、「ホワイトリスト方式」です。
ホワイトリスト方式とは、あらかじめ許可した文字や値だけを受け付ける方法です。
例えば、ファイル名を入力させるフォームであれば、英数字やハイフン(-)、アンダースコア(_)など、処理に必要な文字だけを許可します。
一方、ブラックリスト方式は、危険と判断した文字や文字列だけを禁止する方法です。
ブラックリスト方式は、あらかじめ登録した文字や文字列を拒否できる一方で、登録されていない文字列や新たな回避手法には対応できない可能性があります。
そのため、OSコマンドインジェクション対策では、許可する入力だけを受け付けるホワイトリスト方式を採用することが推奨されます。
Webアプリケーションの権限を最小限にする
Webアプリケーションの実行ユーザーに付与する権限を最小限にすることも、有効な対策のひとつです。
仮にOSコマンドインジェクションが成功したとしても、Webアプリケーションに与えられている権限が限定されていれば、攻撃者が実行できる操作やアクセスできる範囲を制限できます。
例えば、Webサーバーのプロセスを管理者権限で実行するのではなく、必要最小限の権限を持つ一般ユーザー権限で実行することが重要です。
「必要な権限だけを付与する」という最小権限の原則を徹底することで、万が一攻撃を受けた場合でも被害の拡大を防ぎやすくなります。
WAFを導入する
WAF(Web Application Firewall)とは、WebアプリケーションへのHTTP通信を監視し、不正なリクエストを検知・遮断するセキュリティソリューションです。
OSコマンドインジェクションのように、Webアプリケーションの脆弱性を悪用する攻撃に対しても、不審なリクエストを検知・遮断することで、被害の発生リスクを低減できます。
例えば、OSコマンドインジェクションに利用される攻撃パターンや不審な文字列を含むリクエストを検知した場合、 Webアプリケーションで処理される前に、不審なリクエストを遮断できる場合があります。
ただし、WAFはあくまでも攻撃を検知・遮断するための対策であり、Webアプリケーションの脆弱性そのものを解消するものではありません。そのため、入力値の検証や適切な実装とあわせて導入することが重要です。
脆弱性診断を実施する
OSコマンドインジェクションにつながる脆弱性を早期に発見する方法として、脆弱性診断を定期的に行うことも有効です。
脆弱性診断とは、システムやネットワーク、Webアプリケーションにセキュリティ上の欠陥(脆弱性)がないかを調査し、その影響を評価するものです。
定期的に実施することで、OSコマンドインジェクションをはじめとする脆弱性を早期に発見し、攻撃を受ける前に対処できる可能性が高まります。
また、脆弱性はシステムのリリース時だけでなく、機能追加やシステム改修などをきっかけに新たに生じることもあります。
そのため、一度診断して終わりではなく、リリース前や機能追加・改修のタイミング、定期的なセキュリティ点検の際にも継続して実施し、脆弱性を放置しないことが大切です。

OSコマンドインジェクション対策なら「LANSCOPE プロフェッショナルサービス」

OSコマンドインジェクション対策として脆弱性診断を検討している方に、LANSCOPE プロフェッショナルサービスの「Webアプリケーション脆弱性診断」を紹介します。
本サービスでは、OSコマンドインジェクションをはじめ、SQLインジェクションやクロスサイトスクリプティング(XSS)など、Webアプリケーションの脆弱性を専門の診断員が調査し、潜在的なリスクを洗い出します。
診断は、国家資格を保有するセキュリティエキスパートが担当し、脆弱性を発見するだけでなく、原因や想定される影響、具体的な改善方法まで分かりやすくご提案します。
また、診断結果はリスクを点数化して可視化するほか、経営層向けのエグゼクティブサマリーや、発見された脆弱性の対策・修正提言をまとめた報告書もご提供します。
PCサイトやモバイルサイト、Web APIなど幅広い診断に対応しており、優先度を踏まえた対策をご提案するため、効率的にセキュリティ対策を進めることが可能です。
「Webサイトを安全に運用したい」「OSコマンドインジェクションをはじめとする脆弱性を早期に発見したい」という企業・組織の方は、ぜひLANSCOPE プロフェッショナルサービスの「Webアプリケーション脆弱性診断」ご検討ください。
まとめ
本記事では、OSコマンドインジェクションの仕組みや発生する原因、想定される被害、そして有効な対策について解説しました。
本記事のまとめ
- OSコマンドインジェクションとは、Webアプリケーションへの入力を悪用し、サーバー上で意図しないOSコマンドを実行させるサイバー攻撃
- 脆弱性が発生する主な原因として、入力値をOSコマンドに組み込む設計や、入力値の検証不足、シェル経由でOSコマンドを実行していることが挙げられる
- 最も有効な対策はOSコマンドを使用しない設計にすることだが、使用を避けられない場合は、シェルを経由しないAPIの利用や入力値の検証などを組み合わせることが重要
OSコマンドインジェクションが成功すると、情報漏洩やファイルの改ざん・削除、マルウェア・ランサムウェア感染、さらには他のシステムへの攻撃の踏み台として悪用されるなど、深刻な被害につながる恐れがあります。
しかし、適切な設計や入力値の検証など、基本的な対策を徹底することで、こうしたリスクは大きく低減できます。
また、脆弱性はシステムのリリース後にも、機能追加や改修をきっかけに新たに生じることがあるため、一度対策して終わりではなく、定期的に脆弱性診断を実施し、問題を早期に発見・対処することが大切です。
本記事で紹介したLANSCOPE プロフェッショナルサービスでは、OSコマンドインジェクションをはじめとするWebアプリケーションの脆弱性を診断する「Webアプリケーション脆弱性診断」を提供しています。
Webサイトを安全に運用したい方や、脆弱性対策を強化したい方は、ぜひご活用ください。

おすすめ記事
