在CTF中,命令执行一般发生在远程,故被称为远程命令执行,即RCE(Remote Command Exec),也被成为RCE(Remote Code Exec)
命令执行函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| 1-system <?php system($_POST["cmd"]);?>
2-passthru <?php passthru($_POST["cmd"]);?>
3-exec <?php echo exec($_POST["cmd"]);?>
4-pcntl_exec <?php pcntl_exec("/bin/bash",array($_POST["cmd"])); ?>
5-shell_exec <?php echo shell_exec($_POST["cmd"]); ?>
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
|
代码执行函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| 1-eval <?php eval($_POST["cmd"]) ?>
2-assert <?php assert($_POST["cmd"]) ?>
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
6-preg_replace()
#preg_replace('正则规则','替换字符','目标字符') #执行命令和上传文件参考assert函数(不需要加分号)。 #将目标字符中符合正则规则的字符替换为替换字符,此时如果正则规则中使用/e修饰符,则存在代码执行漏洞。 preg_replace("/test/e",$_POST["cmd"],"jutst test");
|
eval()函数和system()函数的比较
今天写命令执行博客的时候发现eval函数和system函数两者用起来有很大区别,这才记起来以前学到过eval是代码执行而system是命令执行,时间太久都忘记了,所以再复习一遍。
虽然代码执行漏洞和命令执行漏洞在提交漏洞时分的没那么详细,但我们在学习时还是要学会区分不同的概念。
eval类型函数是代码执行而不是命令执行
system类型函数是命令执行而不是代码执行
eval函数里必须是一个符合php语法的语句,如果语句结尾没有分号会报错:eval()’d code
1 2 3 4
| <?php eval("echo 1+1;"); //2 system("echo 1+1;"); //1+1; ?>
|
1 2 3 4 5
| <?php $num=1; eval("\$a = $num;"); //有效,$a=1 system("\$b = $num;"); //无效,$b=NULL ?>
|
1 2 3 4
| <?php eval("phpinfo();"); //phpinfo()被执行 system("phpinfo()"); //phpinfo()不被执行 ?>
|
1 2 3 4
| <?php system("whoami"); //whoami命令被执行 eval("whoami"); //whoami命令不被执行 ?>
|