绕过waf之命令执行
引子
人生不是做菜,不能等所有材料准备好了再下锅。
参考资料
Web Application Firewall (WAF) Evasion Techniques
Web Application Firewall (WAF) Evasion Techniques #2
正文
本文要讨论的是在linux系统中,当有rce(远程命令执行)漏洞时,绕过waf的操作有哪些。
基础知识提要
wildcard通配符,又叫做globbing通配符,有很多语法可以使用?/和数字+字母,就可以执行系统命令。
例如:
1 |
|
如果防火墙没有过滤?和/,那么就可以构造通配符的命令注入
使用这种方式 /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 |
|
使用上面提到的方式,可以将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 |
|
空格和双引号
在python中,空格和双引号可以连接两个字符串,例如:python -c 'print "te" "st"'
单引号
在bash中,单引号可以作为连接符,注意单引号要成双数来闭合引号。
1 |
|