eval関数
eval()関数は、パラメーターの変数値を実行できます。これは通常、テンプレートを処理し、PHPコードを動的にロードするために使用されますが、バックドアプログラムなどの攻撃者によっても使用されます。
<?php eval($_GET[cmd])?>
アサート()関数
PHPでassert()関数を使用して、式が真であり、真または偽を返すかどうかを判断します。PHPコードが直接渡されると、それが実行されます。
<?php assert($_GET["cmd"]);?>
preg_replace()関数
preg_replace()関数では、最初のパラメーターの正規表現にe修飾子がある場合、2番目のパラメーターの文字列はPHPコードとして実行されます。
<?php
preg_replace("/pregStr/e",$_GET['cmd'],"cmd_pregStr");
?>
create_function()関数
create_function()関数の関数は、渡されたパラメーターから無名関数を作成し、一意の名前を返します。PHPがcreate_function()に渡された入力を誤ってフィルタリングすると、リモートの攻撃者が脆弱性と特権付きアプリケーションの権限を使用して、任意のコードを実行する可能性があります。
<?php
$newfunc = create_function('$a,$b',$_GET['cmd']);
?>
お願い
?cmd =;} phpinfo(); / * phpinfoは関数を呼び出さずに実行されます
セキュリティの問題に簡単につながるその他の機能
assert() pcntl_exex()
array_filter() preg_replace()
array_map() require()
array_reduce() require_once()
array_diff_uassoc() register_shutdown_function()
array_diff_ukey() register_tick_function()
array_udiff() set_error_handler()
array_udiff_assoc() shell_exec()
array_udiff_uassoc() stream_filter_register()
array_intersect_assoc() system()
array_intersect_uassoc() usort()
array_uintersect() uasort()
array_uintersect_assoc() uksort()
array_uintersect_uassoc() xml_set_character_data_handler()
array_walk() xml_set_default_handler()
array_walk_recursive() xml_set_element_handler()
create_function() xml_set_external_entity_ref_handler()
escapeshellcmd() xml_set_notation_decl_handler()
exec() xml_set_processing_instruction_handler()
include xml_set_start_namespace_decl_handler()
include_once() xml_set_unparsed_entity_decl_handler()
ob_start()
passthru()
コード実行防御
escapeshell()およびescapeshellcmd()関数は、着信コマンド実行関数のパラメーターが実際に文字列パラメーターの形式であり、注入できないことを保証するために使用されます
<?php
system('ls ' . escapeshellarg($dir));
?>
escapeshellarg()は、文字列に単一引用符を追加し、既存の単一引用符を引用またはトランスコードして、文字列がシェル関数に直接渡され、安全であることを確認できます。
escapeshellcmd()は、シェルコマンドを欺いて任意のコマンドを実行する可能性がある文字列内の文字をエスケープします。この関数は、ユーザーが入力したデータがexec()関数またはsystem()関数または実行演算子に転送される前に確実にエスケープされるようにします。
<?php
//故意允许任意数量的参数
$command = './configure '.$_POST['configure_options'];
$escaped_command = escapeshellcmd($command);
system($escaped_command);
?>
escapeshellcmd()関数は、完全なコマンド文字列で使用する必要があります。それでも、攻撃者は任意の数のパラメーターを渡すことができます。escapeshellarg()関数は、単一のパラメーターをエスケープするために使用する必要があります