RCE——远程命令执行漏洞
什么是RCE
RCE又称远程代码执行漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
RCE产生原因
服务器没有对执行命令的函数做严格的过滤,最终导致命令被执行。
命令执行函数
PHP代码执行函数:
eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()、base64_decode、 gzinflate、gzuncompress、gzdecode、str_rot13等
PHP命令执行函数:
system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru()、assert、``等

远程命令执行原理:
很多应用系统从设计上需要给用户提供指定的远程命令操作的接口
比如很多网络设备的web管理界面上一般会有一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而如果设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器 。
现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过”自动化运维平台”进行操作。 在这种平台上往往会出现远程系统命令执行的漏洞
远程代码执行原理:
同样的道理,因为需求设计,后台有时也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。
因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。
系统命令拼接方式
| 管道符,前面命令标准输出,后面命令的标准输入。例如:help |more
& commandA & commandB 先运行命令A,然后运行命令B
|| commandA || commandB 运行命令A,如果失败则运行命令B
&& commandA && commandB 运行命令A,如果成功则运行命令B
ping命令案例
# 正常情况下,web输入框要求输入ip地址,回车即可开始ping
192.168.1.1
# 给ip后拼上其他命令
192.168.1.1 & whoami
# 整体命令变为
ping 192.168.1.1 & whoami
典型案例
Apache Struts漏洞(CVE-2017-5638):这是一个非常著名的RCE漏洞案例,影响了Apache Struts框架。攻击者可以通过发送恶意的HTTP请求利用该漏洞,执行任意代码并获取服务器的控制权。这个漏洞被广泛利用,导致了多个大规模数据泄露事件。
Microsoft Windows SMB漏洞(MS17-010):这是一个影响微软Windows操作系统的RCE漏洞。攻击者可以通过发送特制的SMB请求,利用该漏洞在远程系统上执行任意代码。这个漏洞被用于传播WannaCry勒索软件,造成了全球范围内的大规模攻击和数据损失。
Drupal漏洞(CVE-2018-7600):这是一个影响Drupal内容管理系统的RCE漏洞。攻击者可以通过发送特制的请求,利用该漏洞执行任意代码,并获取网站服务器的控制权。这个漏洞被广泛利用,导致了许多Drupal网站被入侵和操纵。
Apache Tomcat漏洞(CVE-2020-1938):这是一个影响Apache Tomcat服务器的RCE漏洞。攻击者可以通过发送特制的请求,利用该漏洞执行任意代码,并获取服务器的控制权。这个漏洞被称为“Ghostcat”,影响了许多Tomcat服务器。
Jenkins漏洞(CVE-2018-1000861):这是一个影响Jenkins持续集成工具的RCE漏洞。攻击者可以通过发送特制的请求,利用该漏洞在受影响的Jenkins服务器上执行任意代码。这个漏洞被广泛利用,导致了许多Jenkins服务器被入侵和滥用。
解决方案:
假定所有输入都是可疑的
- 尝试对所有输入提交可能执行命令的构造语句进行严格的检查或者控制外部输入
系统命令执行函数的参数不允许外部传递。 - 不仅要验证数据的类型,还要验证其格式、长度、范围和内容。
- 不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。
- 对输出的数据也要检查,数据库里的值有可能会在一个大网站的多处都有输出
即使在输入做了编码等操作,在各处的输出点时也要进行安全检查。
参考链接: