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

1. リモートコマンド実行の脆弱性

1. システム関数を利用してリモートコマンド実行を実現する

PHP では、コマンドの実行を許可する関数は次のとおりです。

  • eval()
  • 主張する()
  • preg_replace()
  • call_user_func()

これらの機能がページに存在し、ユーザー入力が厳密にフィルタリングされていない場合、リモート コマンド実行の脆弱性が発生する可能性があります。

  1. eval() 関数
  • 定義と使用法
    eval() 関数は、文字列を PHP コードとして評価します。
    文字列は有効な PHP コードである必要があり、セミコロンで終わる必要があります。
    コード文字列内で return ステートメントが呼び出されない場合は、NULL を返します。コードに解析エラーがある場合、eval() 関数は false を返します。

  • 構文
    eval(phpcode)
    phpcode 必須。評価する PHP コードを指定します。

<?php
$a = $_GET['a'];
eval($a);
?>
http://127.0.0.1/oscommand/1.php?a=phpinfo();
  1. アサート()関数
  • 定義と使用法
    アサーションが FALSE かどうかを確認する

  • 文法

    • PHP 5
      ブールアサート (mixed $assertion [, string $description ] )
    • PHP 7
      boolassert (mixed $assertion [, Throwable $Exception ] )

assert() は指定されたアサーションをチェックし、結果が FALSE の場合は適切なアクションを実行します。

<?php
$a = $_GET['a'];
assert($a);
?>
http://127.0.0.1/oscommand/1.php?a=phpinfo();
http://127.0.0.1/oscommand/1.php?a=phpinfo()

ps: eval() とassert() の違い
eval() 関数を正しく実行するには、PHP のコード仕様を満たす必要がありますが、assert() 関数にはこの問題はなく、PHP のコード仕様は準拠していません。非常に要求の厳しい

  1. preg_replace() 関数
  • 定義と構文
    preg_replace 関数は、正規表現の検索と置換を実行します。

  • 構文
    mixed preg_replace (mixed $pattern ,mixed $replacement ,mixed $subject [, int KaTeX解析エラー: 'EOF'が予期され、位置12で'\['を取得しました:limit = -1 \̲[̲, int & count ]] )
    件名内のパターンに一致する部分を検索し、置換に置き換えます。
    パラメータの説明:

    • pattern : 検索するパターンは、文字列または文字列の配列です。pattern の場合: 検索するパターン。文字列または文字列の配列を指定できます。いつパターン_ _ _ _ _ _:検索するパターン文字または文字配列_ パターンに「/e」修飾子がある場合、$replacementの値がphpコードとして実行されます。
    • $replacement: 置換に使用する文字列または文字列の配列。
    • $subject: 置換を検索するターゲット文字列または文字列の配列。
    • $limit: オプション。各パターンのサブジェクト文字列ごとの置換の最大数。デフォルトは -1 (無制限) です。
    • $count: オプション、置換が実行される回数。
<?php
$a = $_GET['a'];
echo preg_replace("/test/e", $a, "just test!")
?>
http://127.0.0.1/oscommand/1.php?a=phpinfo()

ps: php5.4 以前では、 preg_replace() は通常どおりコードを実行できますが、php5.5 以降のバージョンでは、「/e」修飾子が非推奨になり、preg_replace_callback を使用する必要があることが通知されます。代わりに () 関数を使用します。

  1. call_user_func() 関数
  • 定義と使用法
    call_user_func — 最初の引数をコールバック関数として呼び出す

  • 構文
    mixed call_user_func ( callable $callback [,mixed$parameter[,mixed$…]] )
    最初のパラメータcallbackは呼び出されるコールバック関数で、残りのパラメータはコールバック関数のパラメータです。

<?php
call_user_func($_GET['a'],$_GET['b']);
?>
http://127.0.0.1/oscommand/1.php?a=assert&b=phpinfo()
  1. その他の機能
  • ob_start()、unserialize()、creat_function()
  • usort()、uasort()、uksort()
  • 配列フィルター()
  • array_reduce()
  • 配列マップ()

2. システムコマンド実行の脆弱性

  1. システムコマンドで実行される機能
  • システム()
  • 実行()
  • シェル_exec()
  • パススルー()
  • pcntl_exec()
  • ポペン()
  • proc_open()
  • バックティック
  1. 環境分析
<?php
if (isset($_POST['submit'])){
    
    
	$target = $_REQUEST['ip'];
	
	if(isset(php_uname('s'), 'Windows NT')) {
    
    
		$cmd = shell_exec('ping ' . $taeget);
		echo '<pre>'.$cmd.'</pre>';
	} else {
    
    
			$cmd = shell_exec('ping -c 3 ' . $target);
			echo '<pre>'.$cmd.'</pre>'
	}
}

ページはリクエストを通じて受信 IP パラメーターを取得し、現在のシステム タイプを取得した後、対応するコマンド「ping + ターゲット IP」を結合して実行します。このプロセス中、IP パラメーターは制御可能であるため、コマンドを結合できます。 IP内で。

127.0.0.1&&whoami
127.0.0.1;whoami
127.0.0.1||whoami
  1. 予防
  • PHP で高リスクのシステム関数を無効にする
    php.ini を検索し、disable_functions を見つけて、無効な関数名を追加します
  • 重要な文字を厳密にフィルタリングする
$substitutions = array(
	'&&' => '',
	';' => '',
	'||' => '',
);
$target = str_replace(array_keys($substitutions), $substitution, $target);
  • 許可されるパラメータの種類を厳密に制限する
    正規表現を活用する

おすすめ

転載: blog.csdn.net/ssjjtt1997/article/details/98945609