深入解读命令执行:基本概念、攻击技术和防范应对( 六 )


3)远程系统命令执行- 函数
在 PHP 中,() 函数是一个常用的执行系统命令的函数 。攻击者可能利用 () 函数构造恶意输入来执行任意系统命令,实现远程系统命令执行( Code,RCE)攻击 。
当 () 函数中包含用户输入或其他不受信任的数据且未经过充分验证和过滤时,攻击者可以构造特定的输入来注入可执行的系统命令,并利用服务器上的权限,从而控制该服务器、窃取敏感信息或者破坏服务器上的数据 。
例如,假设存在以下代码:
$userInput = 'some user input'; // 这是用户输入 $cmd = 'ls -la ' . $userInput; passthru($cmd);
在这个例子中,由于程序未对 $ 参数进行有效的过滤和验证,攻击者可以通过引入 shell 控制字符来注入可执行的系统命令,并使 $cmd 变量直接从用户控制的输入字符串中构建而成 。因此攻击者可以构造如下可以执行删除根目录下所有文件的命令:
$userInput = '; rm -rf /'; $cmd = 'ls -la ' . $userInput; passthru($cmd);
为避免此类问题,请始终对从外部来源到应用程序中的所有数据进行严格的输入验证和过滤,并尽可能避免直接在应用程序中执行不可信的系统命令 。相反,您应该考虑使用安全性更高的 API 函数来替换 (),例如 、exec、 等,并始终在调用这些函数之前进行充分的数据验证和过滤,以确保用户输入仅包含预期的数据 。
示例:
【深入解读命令执行:基本概念、攻击技术和防范应对】在php的www目录下创建一个.php文件,内容如下:

访问:
4)远程系统命令执行- 函数
在 PHP 中,() 函数是一个常用的执行系统命令的函数 。攻击者可能利用 () 函数构造恶意输入来执行任意系统命令,实现远程系统命令执行( Code,RCE)攻击 。
当 () 函数中包含用户输入或其他不受信任的数据且未经过充分验证和过滤时,攻击者可以构造特定的输入来注入可执行的系统命令,并利用服务器上的权限,从而控制该服务器、窃取敏感信息或者破坏服务器上的数据 。
例如,假设存在以下代码:
$userInput = 'some user input'; // 这是用户输入 $cmd = 'ls -la ' . $userInput; $result = shell_exec($cmd);
在这个例子中,由于程序未对 $ 参数进行有效的过滤和验证,攻击者可以通过引入 shell 控制字符来注入可执行的系统命令,并使 $cmd 变量直接从用户控制的输入字符串中构建而成 。因此攻击者可以构造如下可以执行删除根目录下所有文件的命令:
$userInput = '; rm -rf /'; $cmd = 'ls -la ' . $userInput; $result = shell_exec($cmd);
为避免此类问题,请始终对从外部来源到应用程序中的所有数据进行严格的输入验证和过滤,并尽可能避免直接在应用程序中执行不可信的系统命令 。相反,您应该考虑使用安全性更高的 API 函数来替换 (),例如 exec、、 等,并始终在调用这些函数之前进行充分的数据验证和过滤,以确保用户输入仅包含预期的数据 。
命令执行常用特殊字符
在命令执行中,攻击者可能会使用特殊字符来注入可执行的系统命令,进而实现远程系统命令执行( Code,RCE)攻击 。
以下是一些常用的特殊字符:
;(分号):在 Linux 中,分号分隔符用于将多个命令组合在一起执行;在中,分号被用于分隔环境变量 。&(与号):在 Linux 中,可以使用 “&” 运算符将一个程序置于后台运行;在中,“&” 被用于连接不同的命令 。|(管道符):管道符将第一个命令的输出作为第二个命令的输入,可以在命令行中进行高级数据处理 。$(美元符):美元符是 shell 脚本中的变量前缀,将被替换为相应的变量值 。(和)(括号):用于控制命令的执行顺序,类似于数学表达式中的括号 。*(星号)和?(问号):用于匹配文件名或路径名中的通配符 。