1.大小写绕过

2.替换关键字

3.URL双重编码

4.使用注释

5.同功能的函数替换

6.特殊符号

7.HTTP参数控制

8.缓冲区溢出

9.番外篇-唠嗑

10.绕过总结

1.大小写绕过

大小写绕过主要用于针对小写或者大写的关键字匹配,如果各位有玩过上传漏洞靶场,那么对大小写绕过想必也是轻车熟路。

如果对方做了正则表达式或者其他的代码操作 对大小写敏感则无法绕过,当然这个也是最简单的绕过技术

举个栗子:777169.com/b.php?id=-5 UnIoN sElEcT 1,2,3

这个是示例,实际的情况可能filter的规则里有对大小写转换处理,但不是每个关键字都有处理(跟我们注入的适合 and 或用 or同样的道理 )

2.替换关键字

一般这种情况下大小写转换无法进行绕过,而且正则表达式会替换或者删除union,select这些关键字,当然一般只匹配一次就很容易绕过了

举个栗子:777169.com/b.php?id=-5 UNIunionON SELselectECT 1,2,3

这个也是比较简单的绕过,或者有时候药构造更复杂的语句 比如 SeleSELEselectCTct

3.URL双重编码

有时候URL只进行了一次过滤,这个时候,我们可以把我们构造的payload进行url双重编码

举个栗子:77169.com/b.php?id=-5//UNIunionON//SELselectECT/**/1,2,3

4.使用注释

首先我们要知道常用的注释符有哪些

这里列举了下 // -- /**/ # -- -- - ; -a

首先看看我们普通注释

举个栗子:77169.com/b.php?id=5%20order+by+5

特点是规避空格,跟关键字

当然还有我们的内联注释

一般我们内联注释用的比普通注释会更多,/!**/ 只能MYSQL识别

举个栗子:77169.com/b.php?id=-5 /!union/ /!select/ 1,2,3

为什么要做这个呢?就是为了拆分关键字让waf识别不出来 当然也有其他方法

5.同功能的函数替换

有时候我们一些功能函数不能用了,我们可以用相同效果的函数进行利用

下面简单列几个

concat_ws() & group_concat()mid(),substr() & substring()

@@user & user()

@@datadir & datadir()等等...

举个栗子:77169.com/b.php?id=5 union select 1,user()6.特殊符号

特殊字符是什么?除了字符串和数字都是特殊字符 比如~!@#¥%…………&*()—

乌云的一篇waf绕过技巧的文章的几个例子

1.使用反引号,例如selectversion()`,可以用来过正则跟空格,特殊情况下还可以把它当成注释符来用

2.神奇的"- .", select id-1 1.from users; " "是用于字符串链接的,"-"和"."在此也用于连接,可以逃过空格和关键字过滤

3.@符号,select@……1.from users; @用于变量定义如@var_name,一个@表示用户定义,@@表示系统变量

4.Mysql function() as xxx 也可不用as和空格 select-count(id)test from users; //绕过空格限制

7.HTTP参数控制

这种方法是HTTP分割注入,使用控制字符 , 执行换行

也是比较好使的一种方法,

举个栗子: 77169.com/?id=1 union/&b=/select 1,user/&c=/from users--

这里是不同的参数之间进行分割,到了数据库执行查询时再合并语句

8.缓冲区溢出

缓冲区溢出用于对WAF,有不少WAF是C写的,而C语言本身没有缓冲区保护机制,因此如果WAF在处理测试量时超出其缓冲区长度,就会引发bug从而实现绕过

举个栗子: ?id=1 and(select 1)=(Select 0xA*1000) uNiOn SeLeCt 1,2,version(),4,5,database(),version(),8,9,10,11,12,13,14,15,16,17,18

栗子上的 0xA*1000 指的是0XA后面的 "A" 重复1000次,一般来说对应用软件构成缓冲区溢出都需要比较大的测试长度,这里1000仅供参考