输出重定向与 /dev/null
重定向丢弃机制
分析>/dev/null 2>&1:
- >:将标准输出重定向
- /dev/null 是一个特殊设备文件,写入的数据会被内核直接丢弃
- 2>&1:将标准错误(文件描述符2)重定向到标准输出(文件描述符1),即把错误输出和正常输出都导向/dev/null
因此,这个命令的整体效果是,运行命令时,不会在终端上看到任何输出或错误信息。这个技巧常用于需要静默运行的脚本或命令。
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c." >/dev/null 2>&1");
}
在system执行命令里拼接了重定向到/dev/null,出现命令执行没有回显的效果,利用shell特性完成绕过
解决方案:
注释
使用注释绕过
ctf@ubuntu:~$ ls
1.txt
ctf@ubuntu:~$ ls # >/dev/null 2>&1
1.txt
命令分隔符
在Linux命令行中,分号(;)、竖线(|)、双竖线(||)、和符号(&)以及双与符号(&&)有不同的作用:
在linux终端中,一次是可以执行多个命令的,例如pwd;ls;,通过这些分隔符,可以分割多个命令
可以通过拼接,实现类似cat flag;ls,拼接到php里后,就是cat flag;ls >/dev/null 2>&1,这样第二条命令没有回显,第一条不受影响
分号(;):用于分隔多个命令,依次执行每个命令,不管前面的命令是否成功。 例如:?c=ls;pwd;
竖线(|):管道符号,用于将一个命令的输出传递给另一个命令作为输入。 # 测试失败
双竖线(||):逻辑或运算符,用于在第一个命令失败时执行第二个命令。 例如:?c=ls||
和符号(&):在命令末尾使用表示在后台执行该命令。 例如:?c=pwd%26
双与符号(&&):逻辑与运算符,用于只有在第一个命令成功执行后才执行第二个命令。 例如:?c=pwd%26%26
在ctf web题目中,如果get传参&,需要urlencode编码为%26,否则会被当做分隔符分割成多个参数,导致命令执行失败