コマンド実行の脆弱性の概要

コマンド実行定義

  • 基本定義: コマンド実行の脆弱性とは、攻撃者がシステム コマンドを自由に実行できることを意味し、リモート コマンド実行 (リモート コード実行) とシステム コマンド実行に分けられます。
  • 原則: プログラムを適用する際、PHP の system、exec、shell_exec、passthru、popen、proc_popen などのシステム コマンドを実行する関数を呼び出す必要がある場合がありますが、ユーザーがこれらの関数のパラメータを制御できる場合、悪意のあるシステムはコマンドは通常のコマンドに結合される可能性があるため、コマンド実行攻撃が発生します。

コマンド実行条件

  • ユーザーは関数入力を制御できます
  • コードやシステムコマンドを実行する可能性のある危険な関数があります

コマンド実行の原因

  • 開発者がソース コードを作成するときにコード内の実行可能な特殊関数エントリをフィルタリングしなかったため、クライアントは悪意を持って作成されたステートメントを送信し、それを実行のためにサーバーに送信する可能性があります。
  • コマンド インジェクション攻撃中、Web サーバーは System、eval、exec などの機能をフィルタリングしません。これが脆弱性攻撃が成功する主な理由です。

コマンド実行の脆弱性の害

  • Webサービスプログラムの権限を継承して、システムコマンド(任意のコード)の実行やファイルの読み書きを行います。
  • リバウンドシェル
  • Web サイト全体、またはサーバー全体を制御する
  • イントラネットのさらなる普及

リモートコマンド実行の脆弱性関連機能

主張する()

説明: アサーションが false かどうかを確認します
assert(mixed $assertion, Throwable $Exception = ?): bool
従来のアサーション (PHP5 および 7)
**アサーションが文字列の場合、assert() によって PHP コードとして実行されます。**ブール条件がアサーションとして渡された場合、この条件はアサーション関数のパラメーターとして表示されません。定義したassert_options() 処理関数を呼び出すと、条件は文字列に変換され、ブール値は値 false は空の文字列に変換されます。
この機能はデバッグのみに使用する必要があることを表明します。条件が常に true であるべきかどうかをテストするため、何らかのプログラム エラーを示すため、または特定の機能 (拡張機能や特定のシステム制限および機能など) の存在を確認するための健全性チェックに使用する必要があります。
ここに画像の説明を挿入
ここに画像の説明を挿入
簡単に言うと、assert の後に文字列が続き、PHP コードとして扱われます。

preg_replace()

preg_replace — 正規表現の検索と置換を実行します。

preg_replace(
    string|array $pattern,
    string|array $replacement,
    string|array $subject,
    int $limit = -1,
    int &$count = null
): string|array|null

件名内のパターンに一致する部分を検索し、置換に置き換えます。
preg_replace (mixed $pattern ,mixed $replacement ,mixed $subject [,int $limit = -1 [,int count ] ]) :mixed ここで、pattern は検索するパターンです。文字列または文字列の配列を指定できます。pattern に「/e」修飾子がある場合、 count ]] ) :mixed ここで、 pattern は検索するパターンです。文字列または文字列の配列を指定できます。パターンに「/e」修飾子がある場合、カウント] ] ) _:mix e dここで、pattern検索するパターンです文字列または文字列の配列を指定できます。パターン「/ e 修飾子がある場合置換値はphpコードとして実行されます
次に、この関数の具体的な使用法を説明します。
モデルを単純化します。preg_replace (O, A, HELLOWORLD) は、3 番目のパラメーターの O を A に置き換えることです。
画像の説明を追加してください
コードの最初のパラメータの「.」は任意の文字を表し、「*」は任意の回数を表し、この 2 つを接続して任意の文字列を表します。
画像の説明を追加してください
/e が追加されているため、この時点で 2 番目のパラメーターが php 関数として実行されます。

call_user_func()

call_user_func —最初の引数をコールバック関数として
call_user_func(callable callback ,mixed . . . callback,mixed ... を呼び出す折り返し電話_ _mi x e d ...引数): 混合
画像の説明を追加してください
画像の説明を追加してください

a ( a(a ( b) 可変関数

<?php
if(isset( $_GET['a' ])&isset($_GET['b'])){
    
    
    @$a = $_GET['a'];
    @$b = $_GET['b' ];
    @$a($b);//函数,可变函数
    //$a就是函数的名
    //$b就是函数的值
    //?a=assert&b=phpinfo()
    //assert(phpinfo());
else{
    
    
    echo "Please input a&b";
?>

画像の説明を追加してください

画像の説明を追加してください
つまり、前者は関数名として使用され、後者は関数のパラメータとして使用されます。

リモートコマンド実行の脆弱性の悪用

?a=@eval( KaTeX 解析エラー: 位置 28 の '_' の後に予期されるグループ: ...1 文のトロイの木馬?a=print(_̲__FILE_); 現在の絶対値を取得します... _POST[1],$_POST[ 2])); 1 =shell.php&2=<?phpphpinfo()?>シェルを書き込む

画像の説明を追加してください
ここに画像の説明を挿入

************************************************* *********************************************** ****** ******************************************* ********* *****リモートコマンドの実行 提供する文字列はphpコードですが、システムコマンドはシステムコマンドによって提供される文字列を実行します。


システムコマンド実行の脆弱性関連機能

  • システム()
  • 実行()
  • シェル_exec()
  • パススルー()
  • ポペン()
  • 疑問符

システム()

画像の説明を追加してください
画像の説明を追加してください

実行()

(PHP 4、PHP 5、PHP 7、PHP 8)

exec — 外部プログラムを実行する

説明 :
exec(string KaTeX 解析エラー: 予期された 'EOF'、位置 16 で '&' を取得しました: コマンド、配列 &̲出力 = null、int &$result_code = null): string|false
exec() は指定されたコマンドを実行します。
ここに画像の説明を挿入
ここに画像の説明を挿入

シェル_exec()

説明:
shell_exec(string $command): string|false|null
パラメータは、実行するコマンドです。
ここに画像の説明を挿入

パススルー()

パススルー ( stringコマンド [ , ints コマンド [, int sコマンド[ _ _t s return_var ] ) : void

exec() 関数と同様に、 passthru() 関数も外部コマンドの実行に使用されます。実行された Unix コマンドがバイナリ データを出力し、ブラウザに直接送信する必要がある場合は、exec() 関数や system() 関数の代わりにこの関数を使用する必要があります。pbmplus などの画像ストリームを直接出力できるコマンドを実行するためによく使用されます。Content-type を image/gif に設定し、pbmplus プログラムを呼び出して gif ファイルを出力すると、PHP スクリプトからブラウザに画像を直接出力できます。
パラメータ:
command: 実行するコマンド。
return_var: return_var パラメータが指定されている場合、Unix コマンドの戻りステータスがこのパラメータに記録されます。

ぽぺん()

Popen ( string $command , string $mode ) : リソースは、
指定されたコマンドの実行によって生成されたプロセスへのパイプを開きます。
パラメータ
コマンド: コマンド。
モード:モード。

<?php
if(isset($_GET['a'])){
    
    
    popen( "whoami >>1.txt" , 'r');
}else{
    
    
    echo "Please input a";
}
?>

コード内の大なり記号を確認してください:
">:overwrite"
">>:append"

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/ssslq/article/details/130228672