コマンド実行とコード実行の脆弱性

目次

1.コマンド実行の脆弱性

 1.PHPの一般的なコマンド実行関数

 2.コマンド実行の脆弱性防御

2.コード実行の脆弱性 

1.脆弱性

2.PHPのコード実行関数

3.コード実行の脆弱性の防御


1.コマンド実行の脆弱性

       プログラマーがスクリプト言語(PHPなど)を使用してアプリケーションを開発する場合、スクリプト言語の開発は非常に高速で、簡潔で、便利ですが、いくつかの問題もあります。たとえば、速度が遅い場合、またはシステムの最下層に到達できない場合、開発するアプリケーション、特に一部のエンタープライズレベルのアプリケーションでは、いくつかの外部プログラムを呼び出す必要があります。アプリケーションがいくつかの外部プログラムを呼び出す必要がある場合、いくつかのシステムコマンド関数を使用します。アプリケーションがこれらの関数を呼び出してシステムコマンドを実行するときに、ユーザーの入力がシステムコマンドのパラメーターとしてコマンドラインに接続されている場合、ユーザーの入力をフィルタリングせずにコマンド実行のループホールが発生します。

       つまり、コマンドの実行により、オペレーティングシステムのコマンドが直接呼び出されます。原則として、オペレーティングシステムでは、「&、|、||」をすべてコマンドコネクタとして使用できます。ユーザーはブラウザから実行コマンドを送信します。サーバーは実行機能をフィルタリングしないため、ユーザーの入力が使用されます。システムコマンドとしてのパラメータはコマンドラインに接続され、ユーザー入力をフィルタリングせずにコマンド実行のループホールを引き起こします。

command1&command2     两个命令同时执行,前面执行不成功后面也执行
command1&&command2    只有前面命令执行成功,后面命令才继续执行
command1;command2     不管前面命令执行成功没有,后面的命令继续执行(Linux)
command1||command2    将一个命令的标准输出作为另外一个命令的标准输入。当第一条命令失败时,它仍然会执行第二条命令
command1||command2    顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令

 1.PHPの一般的なコマンド実行関数

  • system():文字列をOSコマンドとして実行し、出力関数を使用して、印刷する必要はありません
  • exec():文字列をOSコマンドとして実行し、実行結果を出力する必要があります
  • shell_exec():シェルコマンドを実行し、出力文字列を返します
  • passthru():文字列をOSコマンドとして実行し、独自の出力関数を使用して、印刷する必要はありません
  •  ``(逆引用):shell_exec関数と同じ関数
  • popen()          

コマンド実行ケース、ポータル-DVWAのコマンドインジェクションの脆弱性(コマンドインジェクション)

 2.コマンド実行の脆弱性防御

1.コマンド実行関数の使用を最小限に抑え、disable_functionsでそれらを無効にします

2.コマンドによって実行される関数またはメソッドを入力する前に、パラメーターをフィルター処理します

3.引用符を使用してパラメーター値を可能な限りラップし、addslashesを呼び出してスプライスする前にエスケープします

2.コード実行の脆弱性 

       アプリケーションが文字列をコードに変換できるいくつかの関数を呼び出す場合(PHPのeval()、evalは文字列を関数として実行できます)、ユーザーが文字列を制御するかどうかは考慮されないため、コード実行のループホールが発生します。ブラックボックスから脆弱性を見つけることは一般的に困難であり、それらのほとんどはソースコードに基づいてコード実行の脆弱性を判断します。

       コード実行(インジェクション)はSQLインジェクションの脆弱性に似ています。SQLiはSQLステートメントをデータベースにインジェクションして実行しますが、コード実行はコードをアプリケーションにインジェクションし、最終的にサーバーで実行できます。このような脆弱性が特別にフィルタリングされていない場合、それはWebバックドアが直接存在することと同等です。

1.脆弱性

       コード実行の脆弱性を介してWebユーザーのアクセス許可を継承し、任意のコードを実行できます。サーバーが正しく構成されておらず、Webユーザーのアクセス許可が比較的高い場合は、ターゲットサーバー上の任意のファイルコンテンツの読み取りと書き込みが可能であり、Webサイトとサーバー全体を制御することもできます。

2.PHPのコード実行関数

  • eval()は文字列をphpコードとして実行します
  • assert()もPHPコードとして実行されます
  • call_user_func()コールバック関数。is_callableを使用して、呼び出すことができるかどうかを確認できます。
  • call_user_fuc_array()コールバック関数、パラメーターは配列です
  • create_function()は無名関数を作成します
  • preg_replace()phpのバージョンが7未満の場合、コードは/ eのときに実行されます。
  • array_map()は、配列の各要素にコールバック関数を適用します
  • array_filter()は、配列内の各値をコールバック関数に順番に渡します。コールバック関数がtrueを返す場合、配列の現在の値が返される結果配列に含まれます。配列のキー名は変更されません。
  • usort()は、カスタム関数を使用して配列を並べ替えます

一言で言えば、トロイの木馬は悪用されたコード実行の脆弱性です。

<?php @eval($_POST[cmd]);?>

3.コード実行の脆弱性の防御

  • ユーザーがeval()関数のパラメーターに簡単にアクセスできないようにしたり、通常のルールを使用して入力データ形式を厳密に判断したりできないようにします。
  • 文字列は一重引用符で囲まれ、挿入する前にaddslashes()が実行されます
  • preg_replace()のe修飾子の使用をあきらめ、規則性に一致するオブジェクトの2番目のパラメーターが一重引用符で囲まれていることを確認します。

 

 

 

おすすめ

転載: blog.csdn.net/qq_44159028/article/details/114642034