命令执行(RCE)漏洞和代码执行漏洞区别如下:
-
代码执行实际上是调用服务器网站代码进行执行 -
命令执行则是调用操作系统命令进行执行
一、命令执行漏洞
1、什么是命令执行
命令执行(Remote Command Execution, RCE)
Web应用的脚本代码在执行命令的时候过滤不严
从而注入一段攻击者能够控制的代码,在服务器上以Web服务的后台权限远程执行恶意指令
成因
-
代码层过滤不严 -
系统的漏洞造成命令注入 -
调用的第三方组件存在代码执行漏洞常见的命令执行函数 -
PHP:exec、shell_exec、system、passthru、popen、proc_open等 -
ASP.NET:System.Diagnostics.Start.Process、System.Diagnostics.Start.ProcessStartInfo等 -
Java:java.lang.runtime.Runtime.getRuntime、java.lang.runtime.Runtime.exec等
-
2、常用命令执行函数
(1)system
该函数会把执行结果输出 并把输出结果的最后一行作为字符串返回 如果执行失败则返回false 这个也最为常用
<?php
highlight_file(__FILE__);
system('pwd');
system('whoami');
?>
(2)exec
不输出结果,返回执行结果的最后一行 可以使用output进行输出
<?php
highlight_file(__FILE__);
exec('pwd',$b);
var_dump($b);
?>
(3)passthru
此函数只调用命令 并把运行结果原样地直接输出 没有返回值。
<?php
highlight_file(__FILE__);
passthru('ls');
?>
(4)shell_exec
不输出结果,返回执行结果 使用反引号(``)时调用的就是此函数
<?php
highlight_file(__FILE__);
var_dump(shell_exec('ls'));
?>
(5)ob_start
此函数将打开输出缓冲,当输出缓冲激活后,脚本将不会输出内容(除http标头外) 相反需要输出的内容被存储在内部缓冲区中。
内部缓冲区的内容可以用 ob_get_contents()
函数复制到一个字符串变量中
想要输出存储在内部缓冲区中的内容
可以使用 ob_end_flush()
函数 另外, 使用 ob_end_clean()
函数会静默丢弃掉缓冲区的内容
<?php
ob_start("system");
echo "whoami";
ob_end_flush();