var name =
requset.get("name") `
var cmd =
"echo 'Hello " + name + "'"
RUN_CMD(cmd)`
外部输⼊,进⾏简单的拼接,最终放⼊⼀个执⾏外部命令的
函数中去执⾏ 但命令执⾏的函数,
都⼀定存在这个rce吗?
如果不⼀定存在RCE,
它们之间的差别是什么
$user_input =
$_GET['input'];`
system('whoami ' .
$user_input);`
如果用户能够控制 $_GET['input']的值 在系统上面执行任意指令
便算是通过命令注入来造成RCE,
如果不是在系统上面执行
在应用程序上面执行 就只能算
命令注入
eval()
:exec()
:eval()
类似,如果执行的代码来源不安全,可能导致安全漏洞。pickle.loads()
/ pickle.load()
: pickle.loads()
/ pickle.load()
:getattr()
:subprocess.Popen()
/ 相关函数:os.system()
/ os.popen()
:subprocess.Popen()
,InvokerTransformer
类,这个类可以调用任意方法。攻击者将其配置为执行恶意代码,比如运行一个外部命令。InvokerTransformer
被触发,执行了预设的恶意代码。InvokerTransformer
类的transform
方法可以用来执行任意代码,而在反序列化过程中,对象的方法会自动执行。因此,攻击者可以构造一个当被反序列化时会自动执行恶意操作的对象。exec
- 执行一个外部程序passthru
- 执行外部程序并且显示原始输出proc_open
- 执行一个命令,并且打开用来输入/输出的文件指针shell_exec
- 通过shell 执行命令并将完整的输出以字符串的方式返回system
- 执行外部程序,并且显示输出os.system()
- 执行系统指令os.popen()
- popen()方法用于从一个命令打开一个管道subprocess.call()
- 执行由参数提供的命令Runtime.getRuntime().exec()
ProcessBuilder()
exec()
系统调用,从而在受影响的系统上执行任意代码。#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>int main() {
// 打开文件
int file_descriptor =open("example.txt",
O_WRONLY | O_CREAT,
S_IRUSR | S_IWUSR);
if (file_descriptor
== -1) {
perror("Erroropening file");
return 1;
}// 写入文件
const char *text ="Hello, System Call!";
ssize_t bytes_written= write(file_descriptor,
text, strlen(text));
if (bytes_written
== -1) {
perror("Errorwriting to file");
close(file_descriptor);
return 1;
}// 关闭文件
close(file_descriptor);return 0;
}
open
、write
和close
等函数都是系统调用。open
用于打开文件,write
用于写入文件,close
用于关闭文件。这些函数提供了对底层文件系统的访问,涉及到了内核态的操作。syscall
指令触发从用户态到内核态的切换,执行相应的系统调用。这里的例子演示了如何创建一个文件并写入内容,是系统调用在文件操作中的简单应用。bash -c whoami
时,用户输入的是bash -c whoami
而内核态执行的是bash(pid:52350) -->
sys\_fork -->
bash(pid:52796) -->
sys\_execve -->
/bin/whoami(pid:52796)
bash -c
要执行的具体代码,它将返回当前执行这段代码的用户的用户名。bash -c whoami
bash -c
是一条命令,并理解后面的whoami
是bash -c
要执行的代码。fork
创建一个新的进程(子进程),让子进程执行bash
。bash -c whoami
。bash -c
的执行过程中,bash
发现后面要执行whoami
,于是使用系统调用fork
再创建一个新的进程(子进程),让这个新进程执行whoami
。bash -c
的一个子过程,执行的是whoami
命令。execve
系统调用来执行/bin/whoami
。execve
系统调用加载/bin/whoami
程序到子进程(whoami)的内存空间。/bin/whoami
程序。/bin/whoami
程序执行完成后,将结果返回给子进程。fork
和execve
等系统调用bash -c whoami
在内核态得到执行,返回了当前用户的用户名Shell 与 RCE 漏洞
Shell作为用户与操作系统交互的接口,在RCE漏洞的产生中扮演了关键角色。当应用程序通过shell执行外部命令时,如果这些命令包括未经过滤或转义的用户输入,就可能导致RCE漏洞。这种情况下,恶意构造的输入被shell解释执行,从而允许攻击者运行任意代码。 Fork-Execve过程与RCE
在Unix和类Unix系统中,进程的创建和命令的执行通常通过 fork()
和execve()
系统调用实现。当应用程序以拥有shell权限的用户身份运行,并使用这些系统调用执行外部命令时,恶意输入的拼接可能触发RCE漏洞。相比之下,直接使用execve()
执行命令通常更安全,因为它不会创建新的shell进程,从而减少了恶意输入被解释执行的可能性。PHP的特殊情况
在PHP中,许多执行外部命令的函数实际上是通过调用 sh -c
来执行命令的。这增加了RCE的风险,因为它为恶意输入提供了一个直接的执行路径。受限情况下的RCE利用
在受限的环境中,例如沙箱环境、受限的服务器配置或权限受限的账户,RCE的实现更具挑战性。在这些环境中,攻击者可能无法直接执行任意命令,但仍可以通过利用现有进程或应用程序的特定功能和参数来实现RCE。 示例:利用Curl进行RCE
在一个只允许执行 curl
命令的沙箱环境中,攻击者可能利用curl
的功能和shell的命令替换来绕过限制。例如,通过构造如下命令:bashCopy code
curl https://example.com/file.txt -o >(cat)在这个示例中, >(cat)
是一种命令替换的语法,它允许将cat
命令的输出结果作为文件路径传递给-o
参数。这种方法可以被用来绕过写入文件的限制,直接在标准输出上显示下载的内容,从而在受限环境中实现间接的RCE。(cat) 的命令替换:>(cat) 是一种命令替换的语法。在这个上下文中,它的作用是将 cat 命令的输出结果作为文件路径传递给 -o 参数
构造的目的是在沙箱环境中绕过将内容写入文件的限制,而是直接输出到标准输出,使得你可以在沙箱环境中查看下载的内容,而无需直接写入文件