SQL注入WAF绕过策略

SQL注入WAF绕过策略

为了防止sql注入的安全问题,安全过滤应运而生。在php中的一个string匹配的函数preg_match便是如此。

先来PHP manual看看preg_match是什么吧

preg_match

说到preg_match就不得不提到正则表达式,JS中的正则表达式或者自行上网学习。然后提供一个在线的正则匹配网站还是非常不错的https://regex101.com/

ok接下来进入讲解,

1.架构层绕过WAF

  1. 寻找源站——>针对云WAF

云WAF是假设非嵌入式的,所有访问云WAF保护的网站的数据包都要经过WAF

云waf,WEB应用防火墙的云模式,这种模式让用户不需要在自己的网络中安装软件程序或部署硬件设备,就可以对网站实施安全防护,它的主要实现方式是利用DNS技术,通过移交域名解析权来实现安全防护。用户的请求首先发送到云端节点进行检测,如存在异常请求则进行拦截否则将请求转发至真实服务器

通俗来讲,云waf就是基于云端的web应用防火墙,不需要用户安装,只需要把域名进行解析到相关地址,就能使用云waf的防护功能。

所以我们可以通过直接找到真实服务器的IP地址访问而绕过了云WAF

  1. 利用同网段——>绕过WAF防护区域

这个方法给窝的感觉比较像旁站攻击云WAF可能对属于同一网段的访问放松了过滤的严格,绕过由此产生。

  1. 利用边界漏洞——>绕过WAF防护区域

2.资源限制角度绕过waf

post传入大的数据包body

3.协议层面绕过waf检测

  1. 协议为覆盖waf
    请求方式变换:GET->POST
    Content-Type变换:application/x-www-form-urlencodedmultipart/form-data
  2. 参数污染
    index.php?id=1&id=2
    这里遇到的是waf只是针对第一传参进行检测未对第二个传参进行检测

4.规则层面绕过

4.1 绕过注释符过滤

过滤了注释符,我们就没有办法用熟悉的–+来忽略后面的SQL代码了。但是提供了另外一个思路就是通过单引号去和后面的单引号闭合。比如 ’ or ‘1’='1

select username,password from table where id = 'id' limit 0,1

这样的一条代码来进行实例讲解

select username,password from table where id = 'id' or '1'='1' limit 0,1

可以看到完成了闭合。用一个简单的联合查询来看看吧

1' union select 1,database(),'3
select username,password from table where id = 'id' limit 0,1
--+ 把上面这一段的id参数替换后是什么呢?
select username,password 
from 
table where id = '1' union select 1,database(),'3' limit 0,1

可以看到通过后面的3将本来需要用–+来注释掉的单引号给闭合了,以前是用注释符注释掉后面的代码来构建一条SQL代码,现在我们与他达成了和解,不用注释符把他干掉了,用一个单引号闭合融入进去了。

4.2 绕过and和or过滤

在php中经常用到preg_match的正则表达式进行过滤。

  • 大小写不敏感,可以通过大小写变形来绕过。这个策略适用于正则中没有/i的情况。

  • 在过滤词汇中添加注释

    • a/**/nd或者o/**/r
    • 双写绕过anandd或者oorr,这个绕过策略适用于preg_match设置了匹配替换为空的情况。
  • 利用符号替代,这些符号在MySQL中是等价的,用该策略绕过匹配

    • and----> &&

    • or -----> ||

4.3 绕过空格过滤

  • 用空格的URL编码来代替,因为SQL会识别URLHex编码好的内容

空格的Hex编码是%0a,之前我们输入空格的地方用该编码替换即可。

还有一个Hex编码是%09,是Tab键的编码也是可以的。

windows环境下有些hex不能被利用,而在Linux下可以。

mysql空白符 正则匹配的空白符
%09 %09
%0A %0A
%0B %0B
%0C
%0D %0D
%20 %20
%A0
/*xxx*/

例如

union%25A0select

因为百分号的Hex就是%25,所以%25A0被解析为%A0,然后%A0是空格,所以完成了WAF绕过

  • 用注释符占位

① union /**/select
② union /*aaaaaaa%01bbs*/select
③ union /*aaaaaaaaaaaaaaaaaaaaa*/select
④ 内联注释:/*!xxxxxxxx*/

常见的注释符占位有这些。你发现到②③④在注释符里添加了很多字符,这是为了让post传入大的数据包body ,空格绕过的应用场景还有。

函数分割符号

① concat%2520(
② concat/**/(
③ concat%250c(
④ concat%25a0(
其实就是上面的空格绕过

4.4 绕过union和select的过滤

这个情况下往往就要用之前的双写大小写空格符绕过等等的组合拳试一试了。

你可能感兴趣的:(sql注入,1024程序员节)