ctf中命令执行的绕过方法

Linux还得多学学

Posted by kevin on December 10, 2019

谈谈绕过的方法

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

2019.12.19 补充:这些绕过真的是太骚了,马的,这些人怎么想出来的!

拼接型

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

奇淫技巧

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

绕过空格

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

$ cat file1                                                                 
hello                                                                                     
world

${IFS}

要是不让用空格呢?在 Linux 下,有很多方法可以绕过空格, ${IFS} $IFS$9 ${IFS}$9 都表示空格,可以绕过空格,这里 $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 

绕过黑名单

依然是上面的例子,如果现在不让我们使用 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   

reference

命令执行的一些绕过技巧

ctf命令执行与绕过

https://www.cnblogs.com/v1vvwv/p/DVWA-Command-Injection.html