该RCE是RemoteCommand/CodeExecute、远程命令/代码执行这两种漏洞的简称。
远程代码执行(操作系统命令注入或简称命令注入)是一个漏洞。黑客注入的payload将作为操作系统命令来运行。OS命令注入攻击只在网站app程序代码含有操作系统调用且调用中应用了用户输入时才可能发生。他们并非特定于语言,命令注入漏洞可能会出现在允许您调用系统shell命令的所有语言中:C、Java、PHP、Perl、Ruby、Python等等。
系统应用网站服务器的权限运行注入的命令。所以命令注入的漏洞本身并不会破坏整个系统。然而,攻击者可以应用特权升级和其他漏洞来获取更多的访问权限。
远程代码执行,编码注入攻击不同于命令注入。由于需求设计的原因,有时后台需要将用户的输入作为代码的一部分来运行,也就导致了远程代码执行的漏洞。不论是应用代码执行的变量,还是应用不安全的反序列化,等等。在代码注入或远程代码执行(RCE)中,攻击者可以运行恶意代码,在网站上编辑webshell,控制整个网站乃至云服务器。它的真正危害取决于服务器端解释程序的限制(比如PHP,Python等等)。有时候,攻击者可以从代码注入升级到命令注入。
代码注入经常在应用程序运行时发生,但代码没有经过验证。下面是PHP应用程序示例中出现代码注入错误的源代码。基于上述例子,攻击者可以应用下面的结构运行任意PHP代码。因此,PHP信息页面将显示出来。弱点检测,RCE弱点是由于程序应用了危险变量而没有强有力的验证过滤而导致的,因此在黑盒测试过程中,通常的思路是在输入端进行渗透测试。
很多开发者认为文本字段是数据验证的唯一领域。这个假设不正确。所有外部输入都必须通过数据验证:文本字段、列表框、单选按钮、复选框、cookie、HTTP头数据、HTTPpost数据、隐藏字段、参数名称和参数值……当然这并不是一个详尽的清单。对“过程到过程”或“实体到实体”通信也必须进行研究。所有与上游或下游过程通信并接受其输入的代码都必须重新检查。
全部缺陷都是输入验证错误。这说明,从信任边界外的外部来源收到的输入,其数据验证是错误的。实际上,对于这类漏洞,我们需要在应用程序中查找所有输入流。它可能来自于用户的浏览器,CLI,或者厚客户端(fatclient),或者“提供”app的上游进程。当进行白盒测试时,我们可以把注意力集中在危险变量出现的地方(上面概述的)。如果有我们能够控制的数据,并且能够构造注入攻击,那么漏洞就会存在。这样的测试可以通过自动化工具来完成。