命令执行RCE及其绕过详细总结

各情景下的绕过

Posted by tahano on December 31, 2024

操作系统连接符:

拼接命令

分号;

​ 多个命令无论对错顺序执行 比如源码是system(”ls”.$cmd)为了读取flag我们可以对cmd传参

cmd=;cat /flag

这样会先查看目录后读取flag文件

&

​ 作用和分号一样,但是在使用的时候要把&进行URL编码为%26才能正常执行

cmd=%26cat /flag

&&

​ 前面命令执行不成功后面命令无法执行

cmd=ls%26%26cat /flag #成功执行

cmd=-11%26%26cat /flag #两条命令都不执行

管道输出符|

​ 前面命令的输出作为后面命令的输入,把前面命令的结果作为后面命令的参数;前面后面的命令都执行,但是只显示后面的命令执行结果。

||

​ 前面的命令执行成功,则后面的命令不会执行;前面的命令执行失败,则后面的命令执行(类似if-else语句)

常见函数

(至少记住每个函数的两点1、有没有回显2、参数怎么放)

system:语法为system(string $command, int &$return var = ?),command: 执行 command 参数所指定的命令常用参数并且输出执行结果,如果提供 return var 参数,则外部命令执行后的返回状态将会被设置到此变量中。示例:system(’ls’)会直接返回当前文件下的目录。该函数提交命令自己回显

exec:示例exec(“cat /flag”),其本身没有回显

passthru(读取二进制流):system()的平替,写个命令就会执行命令,自己能回显

shell_exec和反引号``:格式分别为shell_exec(ls)和ls,不能自己回显,需要借用echo\print等输出结果

popen:语法为popen(string $command, string $mode),command参数: 要执行的命令,mode参数: 模式’r’表示阅读,’w’ 表示写入。不能自己回显,需要print_r等输出内容

proc_popen:语法为proc_open($command,$descriptor spec,$pipes,$cwd,$env vars,$options),

$command是要执行的命令。 $descriptorspec是一个描述符规范数组,用于指定进程的输入、输出和错误的文件描述符。 $pipes是一个引用变量,用于存储与进程相关的管道。 $cwd(可选)是设置子进程的当前工作目录。 $env(可选)是设置子进程的环境变量。 $other_options(可选)是其他选项,如设置超时等。 我也不太清楚,但是挺复杂的参数多,而且不能自己回显

pcntl_exec:语法格式为pcntl exec(string $path, array $args = ?, array $envs = ?) path必须时可执行二进制文件路径或一个在文件第一行指定了 一个可执行文件路径标头的脚本 (比如文件第一行是#!/usr/local/bin/perl的perl脚本)。args是一个要传递给程序的参数的字符串数组。 envs是一个要传递给程序作为环境变量的字符串数组。这个数组是 key => value格式的,key代表要传递的环境变量的名称,value代表该环境变量值。该函数没有回显,解决方法一:cat文件并输出到有权限读取路径;解决方法二:shell反弹