前几天在微博和公众号上看到一些使用Linux通配符/glob模式来绕过命令执行的方式,感觉很不错,学习总结下。
首先先了解下什么是Linux shell 通配符/glob模式:
概念:
glob 模式(globbing)也被称之为 shell 通配符,名字的起源来自于 Unix V6 中的
/etc/glob
(详见 man 文档)。glob 是一种特殊的模式匹配,最常见的是通配符拓展,也可以将 glob 模式设为精简了的正则表达式,在最新的 CentOS 7 中已经删除了 glob 的相关描述文档,删除的原因由于 glob 已经整合到了 shell 之中,然后就有了 shell 通配符。shell 通配符 / glob 模式通常用来匹配目录以及文件,而不是文本!!!
语法:
字符 | 解释 |
---|---|
* |
匹配任意长度任意字符 |
? |
匹配任意单个字符 |
[list] |
匹配指定范围内(list)任意单个字符,也可以是单个字符组成的集合 |
[^list] |
匹配指定范围外的任意单个字符或字符集合 |
[!list] |
同[^list] |
{str1,str2,…} |
匹配 srt1 或者 srt2 或者更多字符串,也可以是集合 |
专用字符集
字符 | 意义 |
---|---|
[:alnum:] |
任意数字或者字母 |
[:alpha:] |
任意字母 |
[:space:] |
空格 |
[:lower:] |
小写字母 |
[:digit:] |
任意数字 |
[:upper:] |
任意大写字母 |
[:cntrl:] |
控制符 |
[:graph:] |
图形 |
[:print:] |
可打印字符 |
[:punct:] |
标点符号 |
[:xdigit:] |
十六进制数 |
[:blank:] |
空白字符(未验证) |
Linux shell 元字符,在使用通配符时如果没有进行转义可能就会被辨识为元字符
字符 | 作用 | ||
---|---|---|---|
IFS |
由 < space > 或 < tab > 或 < enter > 三者之一组成 |
||
CR |
由 < enter > 产生 |
||
= |
设定变量 | ||
$ |
作变量或运算替换 | ||
> |
重导向标准输出 | ||
< |
重导向标准输入 | ||
`\ | ` | 命令管线 | |
& |
重导向文件描述符,或将命令静默执行 | ||
( ) |
将其内的命令置于 nested subshell 执行,或用于运算或命令替换 | ||
{ } |
将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围 | ||
; |
在前一个命令结束时,而忽略其返回值,继续执行下一个命令 | ||
&& |
在前一个命令结束时,若返回值为 true,继续执行下一个命令 | ||
`\ | \ | ` | 在前一个命令结束时,若返回值为 false,继续执行下一个命令 |
! |
执行 history 中的命令 |
示例:
举几个简单的例子,举一反三,同理,各种混合结合效果更佳!
|
|
其他绕过方式
|
|
注意事项
- 在使用专属字符集的时候,字符集之外还需要用 [ ] 来包含住,否则专用字符集不会生效,例如 [[:space:]]
- 想要转义的时候,单引号与双引号使用方法是不同的,单引号会转义所有字符,而且单引号中间不允许再出现单引号,双引号允许出现特定的 shell 元字符,具体字符可以自行查询
- 在使用花括号 {} 的时候,里面的单个字符串需要使用单引号或者双引号括住,否则就会视为多个的单个字符
Referer:
https://www.cnblogs.com/divent/archive/2016/08/11/5762154.html
https://medium.com/secjuice/waf-evasion-techniques-718026d693d8