概述:
RCE漏洞可以让攻击者直接向后台服务器远程注入操作命令或代码,从而控制后台系统,分为远程系统命令执行和远程代码执行。
远程系统命令执行:
(危害:执行系统命令)
一般出现这种漏洞是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口(比如路由器,防火墙,入侵检测等设备的web管理界面上)
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器
补充知识:Ping测试是一种网络工具,用于测试两台计算机之间的连接是否正常。通过发送一个ICMP数据包到目标计算机,并等待它的回应,可以检测网络连接的延迟和丢包情况。Ping测试通常用于诊断网络问题,确定网络连接是否稳定以及网络延迟的情况。
远程代码执行:
同样后台有时候会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞(可能是使用了代码执行的函数,或者使用了不安全的反序列化)
因此如果需要给前端用户操作类的API接口,一定需要对接口输入的内容进行严格的判断(比如试试严格的白名单策略)
补充知识:API接口是指应用程序编程接口(Application Programming Interface),它定义了不同软件系统或组件之间相互通信的规范。API接口允许不同的软件系统之间进行数据交换和互操作,使得它们能够相互调用对方提供的功能或服务。通过API接口,开发人员可以在不了解内部实现细节的情况下,调用其他软件系统或服务的功能,从而实现系统之间的集成和协作。
eval()
函数(php):接受一个字符串参数 $code
,其中包含要执行的 PHP 代码。它会将字符串中的代码当作 PHP 代码来执行,并返回执行结果。
system()函数用于执行外部命令,并返回执行结果。
string system ( string $command [int &$return_var ] )
其中,$command
是要执行的外部命令,$return_var
是一个可选参数,用于存储外部命令的返回值。
当调用system()函数时,PHP会执行指定的外部命令,并将输出直接发送到标准输出。同时,如果提供了$return_var
参数,它会存储外部命令的返回值。
需要注意的是,system()函数会直接输出外部命令的结果,因此在一些情况下可能不太适用。如果需要获取外部命令的输出而不直接输出到页面上,可以考虑使用exec()函数。
常见命令:ls(执行ls命令列出目录内容),pwd(显示当前用户的用户名)
演示
墨者学院靶场题(命令注入执行分析,黑盒通过应用功能分析):
首先确定操作系统,看一下网络数据包
通过ubuntu确定应该是linux操作系统(有利于后续命令执行)
补充知识:
常见的基于 Linux 内核构建的操作系统有:
1. Ubuntu:一个流行的桌面和服务器操作系统,提供了友好的用户界面和强大的软件管理工具。
2. Debian:一个稳定、安全的操作系统,被广泛用于服务器和嵌入式设备。
3. CentOS:一个专注于企业级应用的操作系统,提供了长期支持和稳定性。
4. Fedora:一个面向开发者和技术爱好者的操作系统,提供了最新的软件和技术。
5. Arch Linux:一个面向有经验的用户的操作系统,提供了高度定制和灵活性。
6. openSUSE:一个多用途的操作系统,适用于桌面、服务器和嵌入式设备。
7. Red Hat Enterprise Linux (RHEL):一个专业的企业级操作系统,提供了高级的支持和安全功能。
这些操作系统都是基于 Linux 内核开发的,各自有着不同的特点和适用场景。
首先我们看到了页面,有ping操作,因此我们先猜测此处有命令执行,我们先输入一个地址看一下
发现返回了地址信息,因为有回显我们可以通过执行命令ls,看一下其目录
结果发现命令格式有误,应该是存在地址校验。
那我们试一下在地址后面再加上一条命令尝试绕过
还是格式不正确,但是有弹窗。
我们可以联想到它应该是在前端进行了校验
于是我们检查前端代码
果然在前端进行了校验,我们将onsubmit后边改为return true 进行前端绕过,再尝试一下
绕过成功,发现文件名,进行读取
补充知识:cat命令通常用于Unix和类Unix系统中用来查看文件的内容。
在ping命令中使用cat命令时,通常会使用重定向操作符"<",其作用是将cat命令的输出作为ping命令的输入。这样可以将cat命令输出的内容传递给ping命令进行处理。
最后读取到了flag
墨者学院靶场题(PHP代码分析溯源,白盒代码审计):
首先看题,发现把代码展示了出来,并告知了key在根目录
因为代码进行了加密和解密,我们先解密出源代码
(直接复制在php编译器上输出一下)
发现解密后的代码时这样的
因为其接受request请求所以我们利用url发送一下请求(本来eval是代码执行函数,但是后边加了反引号 ` ` ,进行了命令执行)
补充信息:在Linux中,反引号 ` ` 和 $()
都可以用来执行命令并将其结果赋值给变量。这两种方法的作用是相同的,但推荐使用 $()
,因为它更易读且更容易嵌套。
找到了存放key的目录,进行访问
得到key的值
标签:web,操作系统,命令,外部命令,代码,漏洞,代码执行,RCE,执行 From: https://blog.csdn.net/2301_79688134/article/details/136634581