eval函数
eval()函数可以将参数中的变量值执行,通常处于处理模板和动态加载PHP代码,但也常常被攻击者利用,比如一句话后门程序:
<?php eval($_GET[cmd])?>
assert()函数
assert()函数在PHP中用来判断一个表达式是否成立,返回真或假。如果直接将PHP代码传入也会被执行。
<?php assert($_GET["cmd"]);?>
preg_replace()函数
在preg_replace()函数中,当第一个参数的正则表达式有e修正符是,第二个参数的字符串当作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()将给字符串增加一个单引号,并且能引用或者转码任何已经存在的单引号,以确保能够直接将一个字符串传入shell函数,并且是安全的。
escapeshellcmd()对字符串中可能会欺骗shell命令执行任意命令的字符进行转义。该函数保证用户输入的数据在传送到exec()函数或system()函数或执行操作符之前进行转义。
<?php
//故意允许任意数量的参数
$command = './configure '.$_POST['configure_options'];
$escaped_command = escapeshellcmd($command);
system($escaped_command);
?>
escapeshellcmd()函数应被用在完整的命令字符串上。即使如此,攻击者还是可以传入任意数量的参数。应使用escapeshellarg()函数对单个参数进行转义