WEB漏洞-SQL注入之WAF绕过注入
现在越来越多的公司会购买硬件waf或软件waf;在拥有waf后,我们再按照常规的渗透测试方式去渗透网站则会被直接拦截,所以当渗透有waf的网站时,需要先绕过waf,再去渗透测试。
1.常见waf有哪些?
waf分为硬件防火墙和软件防火墙,其中硬件防火墙出自各大安全公司,价格昂贵,一般大公司才会购买;软件防火墙相对便宜,小公司使用较多。
现在国内互联网中常见的waf软件有以下三种:
- 安全狗(更新缓慢容易绕过)
- 宝塔(免费版和收费版)
- 阿里云盾(阿里云服务器自带,也叫安骑士)
- 云waf(云锁,360安全云等)
2.怎么了解waf的检测规则?
可以通过查看waf的配置中的检测规则,
- 它有哪些检验项目
- 每个项目会拦截哪些提交方式?
- 拦截关键字是什么
- 默认开启了哪些检测规则
在了解waf的检测规则后,再尝试绕过它,会有事半功倍的效果哦!
3.waf的安全策略
waf有很多检测规则,但是一般不会开启全部功能;因为部分拦截规则开启后可能会拦截用户的正常访问,所以大部分管理员不会修改waf的默认配置,当然也不排除有些管理员为了安全性而开启全部拦截规则。
4.怎么才算绕过waf?
waf的检测规则一般是检测用户提交的数据中是否存在某些敏感关键词,当存在关键词时直接拦截并提示,不存在时则可以正常访问;我们渗透测试时如果遇到存在waf的网站,就需要想办法找到waf检测规则的漏洞,再去执行提交的payload且不会被waf拦截。
5.有哪些方式绕过waf?
绕过waf一般采用以下方式:
- 通过修改提交的数据,绕过waf的匹配规则
- 通过修改数据提交方式,绕过waf匹配规则
- 使用其他方式,绕过waf匹配规则
6.绕过waf方法
这里的waf防护软件是安全狗,其它waf也是使用类似的方法绕过,这里主要是提供绕waf的思路!
1.修改提交方式
使用get方式提交参数会被waf拦截,修改成post提交可能就可以绕过waf,但是修改提交方式绕过waf拥有一定的局限性,需要目标站点支持你修改的提交方式
这里以sqllib靶场第二关为例,我已经修改后端接收方式为$_REQUEST
使用get方式提交SQL注入语句:
使用POST方式提交SQL注入语句:
成功绕过waf~~~
2.使用特殊符号
SQL中有很多特殊符号,比如: ~,! 等等;这些特殊符号插入到SQL语句中并不会影响SQL语句的正常执行,但是waf检测时,由于特殊符号的存在改变了原有SQL语句的结构,绕过了waf原有的匹配规则,导致waf没有识别出恶意的SQL注入语句,这样就成功绕过了waf且正常执行了SQL语句。
3.反序列化绕过waf
通过反序列化代码绕过waf,前提条件是目标站点支持代码的反序列化,否则无法利用。具体绕过方法后续记录
4.注释符混用+特殊符号+编码解码绕过实战
SQL中有多种注释符,根据数据库的不同注释符也不一样,比如/**/,# 等等...
与特殊符号类似,将注释符号混合插入到SQL语句中并不会影响SQL语句的正常执行,干扰waf的匹配规则;由于注释符的存在改变了原有SQL语句的结构,绕过了waf原有的匹配规则,导致waf没有识别出恶意的SQL注入语句,这样就成功绕过了waf且正常执行了SQL语句。
当提交参数中包含某些敏感关键词如 and ,union select,database()时直接返回安全狗拦截页面
这是因为这些敏感关键字在安全狗的匹配规则中,如下图:
1.1绕过小技巧:
我们在绕过waf时可以先去看下检测规则,提交的参数有哪些会被拦截,都拦截哪些提交方式,再去针对性的绕过,会事半功倍哦!
扯远了,回到安全狗,现在了解到安全狗会拦截 get 方式提交的 and or 等操作符,在目标网站不支持其它方式提交数据时,就得想办法绕过:
只输入 and :并不会拦截
只输入 1=1 : 也不会拦截
组合之后就会拦截:
那么尝试去掉所有空格试试: 也不拦截,但是无法正常查询
那现在尝试修改空格的编码方式,替换空格为其它符号,或者插入注释符干扰就好了:
http://sqli7.com/Less-2/?id=1/*%23*/and/*%00*/%23a%0A/*!/*!*/1=1;%23
http://sqli7.com/Less-2/?id=1/*%23*/and%23a%0A1=1;%23
等价于:
http://sqli7.com/Less-2/?id=1 and
1=1#
http://sqli7.com/Less-2/?id=1/*%23*/and/*%00*/%23a%0A/*!/*!*/1=2;%23
http://sqli7.com/Less-2/?id=1/*%23*/and%23a%0A1=2;%23
等价于:
http://sqli7.com/Less-2/?id=1 and
1=2#
成功绕过~
1.2具体参数解释:
/**/ 注释符,里面的内容不生效
/*!*/ 注释符,里面的内容生效
%23 #
%0A 换行
%00 空
; 在SQL语句中是结束符,后面的内容直接截断不生效
中间的a是随意写的,用于干扰waf的匹配规则
1.3绕过原理
以下列语句为例:
http://sqli7.com/Less-2/?id=1/*%23*/and/*%00*/%23a%0A/*!/*!*/1=1;%23
/*%23*/ 是无意义语句,纯粹是为了干扰waf,因为注释符中的内容并不会执行
/*%00*/ 是无意义语句,纯粹是为了干扰waf,因为注释符中的内容并不会执行
%23a%0A %23是URL编码的#,在SQL语句中#表示结束符,后面的语句不会执行,所以后面的字母a不会被带入到SQL语句中,只是为了隔断,写其它字符也一样;而%0A是换行,并不会受到前面#的影响,会将SQL语句换行到下一行;
/*!/*!*/ 一样也是无意义的语句,/*!/*!*/ 会被MySQL认为是里面的特殊字符 !/*! 被外面的注释符/**/ 注释掉,并不会生效