命令执行绕过的方法
谈谈绕过的方法
在这之前,我们先来总结一下常用的命令注入绕过方法,还是挺有意思的,会对 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
绕过黑名单
依然是上面的例子,如果现在不让我们使用 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