绕过WAF-SQL篇

1.首先WAF的核心基本上是正则匹配,又由于安全和客户体验性挂钩,所以它不会什么都拦截,其拦截对象是搭配式语句

2.基本的绕过手法:

 1. 如果and 1=1 被拦截时可以试试 and -1=-1试试,或者and true试试(一般没用)
 2. 可以用&代替and,但是在url上&是连接的意思,所以需要写&的url编码
 3. ?id=1可以写成?id=2-1 如果执行成功且相同则有注入点(但是该方法只争对整型)
 4. ?id=0x31来代替?id=1,如果成功且相同则有注入点(只针对字符型而使用16进制)

3.接下来是一些实战和看别人博客的总结的绕过(以下绕过手法针对最新版本Apache:v4.0,大部分尝试过是可以绕过的)
注:常见的大小写,双写绕过,编码绕过这种只对很老版本的WAF有用的就不写了

  1. 一般union select会被拦截,但单独的union或者select不被拦截的时候可以union all select

  2. 内联注释(只针对MYSQL)

/*!50001*/表示当前数据库版本≥5.00.01时中间的语句会执行
 	(1).可以试试/*!select*/来代替select试试
 	(2)若/*!select*/被拦截了可以试试/*!50001select*/;若还拦截发现/*!5000select*/没有拦截因为没有对应的版本号可以考虑有没有没有过滤的正确的版本号
 	(3)对于(2)中的考虑可以抓包然后直接用burp跑一下试试,看看哪些版本号没有被拦截
 	(4)在写from 表名 时,如果被拦截了可以试试/*!from*/或者/*!表名*/来看看然后如上的手法都试试(不过应该没用)
  1. 特殊字符绕过(%0a表示换行)
首先WAF认为注释中的一定是安全的,所以不会拦截所以可以对注释进行考虑
	(1)写/*%a*/时实际上会表示成/*%a*/ */(因为换行的缘故所以会自动补加*/)
	(2)可写语句?id=1 union /*!10044 select */ 1,2,3 -- hh /*%0a from 表名 %23*/ limit 0,1
			注:-- hh /* 是把/*注释了

4.反引号绕过
如果有些函数被禁了,那么尝试反引号如:
(1)and sleep(5)被禁了,那么写and sleep(5)可能就不会被禁

5.等价替换(利用函数代替)
比如union select 被禁了试试union all试试这种,可以自己查一下。

6.利用容器特性

(1)iis传参里面写s%e%l%e%c%t等价于select。这一类的方法
(2)Apache的HPP中的参数污染,如:?id=1/*& id=2 union select 1,2,3 from 表名 limit 1,1 %23*/

7.白名单绕过
如果是管理员权限或者是127.0.0.1(X-Forwarded-For)本地访问可能不会拦截

8.缓冲区绕过(这个方法实战的效果还不错,我用过几次都成功了)
就是数据太多了,超出了WAF检测范围
(1)测试数据要多长才会溢出的方法是写python脚本测试或者用burp来测
注:用burp需要把请求头改为POST,因为GET只能传入有限的数据,好像最多是256个数据
方法是:在burp最下面写id=1 //(注:一共有4千5或者4千6左右的.) union select 1,2,3 这样来绕过

你可能感兴趣的:(绕过WAF-SQL篇)