操作系统连接符:
拼接命令
分号;
多个命令无论对错顺序执行 比如源码是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反弹