1. リモートコマンド実行の脆弱性
1. システム関数を利用してリモートコマンド実行を実現する
PHP では、コマンドの実行を許可する関数は次のとおりです。
- eval()
- 主張する()
- preg_replace()
- call_user_func()
- …
これらの機能がページに存在し、ユーザー入力が厳密にフィルタリングされていない場合、リモート コマンド実行の脆弱性が発生する可能性があります。
- 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();
- アサート()関数
-
定義と使用法
アサーションが FALSE かどうかを確認する -
文法
- PHP 5
ブールアサート (mixed $assertion [, string $description ] ) - PHP 7
boolassert (mixed $assertion [, Throwable $Exception ] )
- PHP 5
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 のコード仕様は準拠していません。非常に要求の厳しい
- 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 を使用する必要があることが通知されます。代わりに () 関数を使用します。
- 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()
- その他の機能
- ob_start()、unserialize()、creat_function()
- usort()、uasort()、uksort()
- 配列フィルター()
- array_reduce()
- 配列マップ()
- …
2. システムコマンド実行の脆弱性
- システムコマンドで実行される機能
- システム()
- 実行()
- シェル_exec()
- パススルー()
- pcntl_exec()
- ポペン()
- proc_open()
- バックティック
- …
- 環境分析
<?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
- 予防
- PHP で高リスクのシステム関数を無効にする
php.ini を検索し、disable_functions を見つけて、無効な関数名を追加します - 重要な文字を厳密にフィルタリングする
$substitutions = array(
'&&' => '',
';' => '',
'||' => '',
);
$target = str_replace(array_keys($substitutions), $substitution, $target);
- 許可されるパラメータの種類を厳密に制限する
正規表現を活用する