浅谈sql注入bypass – 作者:nch111

1. WAF产生的背景:
传统防火墙 ( firewall ) àà 阻断数据包àà工作网络层
Web服务器功能丰富àà成为攻击目标 (应用层)àà waf由此而生
WAF(web application firewall)称为web应用防火墙,
他是通过执行一系列针对HTTP,HTTPS的安全策略,
来专门对web应用提供保护的一款产品。WAF是基于规则的防护,
可以提供各种web应用的安全规则,waf生产商去维护这个规则库,
并实时为其更新,用户按照这些规则,可以对应用进行全方面的保护
1. 架构层绕过waf
用户本身是进入waf后访问web页面的,只要我们找到web的真实IP,绕过waf就不在话下了
在同网段内,页面与页面之间,服务器与服务器之间,通过waf的保护,然后展示给我们,只要我们在内部服务之间进行访问,即可绕过waf
边界漏洞,同样类似于同网段数据,我们可以利用已知服务器存在的ssrf漏洞,将数据直接发送给同网段的web2进行SQL注入
2. 资源限制角度绕waf
由于数据太大,会导致waf无法将所有的数据都检测完,这个时候会忽略掉我们代入的sql注入语句,
从而绕过waf,即:使用POST请求,对服务器请求很大资源数据,逃逸sql注入语句。
3. 协议层面绕过
l 基于协议层,有的waf只过滤GET请求,而对POST请求没做别的限制,因此,可以将GET型换为POST型
文件格式,页面仅对Content-Type为application/x-www-form-urlencoded数据格式进行过滤,
因此我们只要将Content-Type格式修改为multipart/form-data,即可绕过waf
l 参数污染:有的waf仅对部分内容进行过滤,例如:
index.php?id=1&id=2&id=3
这样的参数id=1,waf也许仅对前部分的id=1进行检测,而后面的参数并不做处理。
这样我们就可以在id=2的后面写入sql注入语句进行sql注入
4. 规则层面绕waf
单引号,%2527
用+拼接函数和括号
云锁,白名单bypass规则,index.php/admin/?id=1
360,守护神GET型 :GET+POST
1. 等价函数 : 
l hex()、bin() ==> ascii()
l sleep() >benchmark()
l concat_ws()>group_concat()
l mid()、substr() ==> substring()
l @@version ==> version()
2. 等价符号 :
l and和or不能使用可以尝试下&&和||,还有=不能使用的情况可以考虑尝试<、>因为如果不小于又不大于那便是等于。逻辑异或xor,like(可以)
3. 特殊符号:
l 使用反引号`,例如select `version()`,可以用来过空格和正则,特殊情况下还可以将其做注释符用, group by 9(可以)
4. 缓冲区溢出:
l and(select 1)=(Select 0xA*1000) uNiOn SeLeCt 1,2,version() –+
5. 宽字节绕过 :%df’
6. asp允许每个字符前面添加一个%号
SELECT FIELD FROM TABLE ààà %S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E
7. 二次注入 : admin ‘#
二次注入是一种应对转义的手段,其能成功的核心点是只被转义一次的情况下“/”不会被存入数据库,所以取出来的数据没有转义符号
8. 编码绕过(utf,base64,url,unicode)
l (“1′ AND SLEEP(5)#”)à ‘MScgQU5EIFNMRUVQKDUpIw==’
l SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))
9. 大小写绕过 : selectààSelEcT
10. 双写绕过 : selselectect ààselect
11. 内联注释 : /*!xxx*/ ,/*!44232*/ /**/ /*!xxx*/
12. 替代空格 : %0a , %0d , c , d ,%20 ,%09 ,%0b, +,/**/ , /*!xxxxxxxxxx*/
13. 注    释 : %23%0a
14. 利用PHP中的PATH_INFO
挑选一个白名单加在后面
15. 静态资源绕过
当文件后缀名为js、jpg、png等静态资源后缀请求,类似白名单机制,waf为了检测效率,直接略过这样一些静态资源文件名后缀的请求
16. 判断函数:
locate(‘s’,( select database())=1
17. uri参数溢出
id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1& id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=-1′ union select 1,2,schema_name %0a/*!from*/information_schema.SCHEMATA #
参数混淆或者多个参数,waf出于性能考虑可能会不进行过多检查
18. GET+POST
waf逻辑漏洞,当同时提交GET+POST请求时,进入POST规则逻辑,而忽略了GET请求的有害参数输入,可轻易Bypass
19. 畸形绕过
select-1                    
select+1                      
select—1
20. 利用pipline绕过
http协议是由tcp协议封装而来,当浏览器发起一个http请求时,浏览器先和服务器建立tcp连接后,然后发送http数据包(即我们用burpsuite截获的数据),其中包含了一个Connection字段,一般值为close,apache等容器根据这个字段决定是保持该tcp连接或是断开。当发送的内容太大,超过一个http包容量,需要分多次发送时,值会变成keep-alive,即本次发起的http请求所建立的tcp连接不断开,直到所发送内容结束Connection为close为止。
关闭burp的Repeater的Content-Length自动更新, Repeater下拉选项中取消update Content-Length选中。
图片[1]-浅谈sql注入bypass – 作者:nch111-安全小百科
21. 利用分块编码传输绕过
在头部加入Transfer-Encoding: chunked ,代表这个报文采用了分块编码。这时,post请求报文中的数据部分需要改为用一系列分块来传输。每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的,也不包括分块数据结尾的,且最后需要用0独占一行表示结束。要开启已关闭的content-length自动更新
图片[2]-浅谈sql注入bypass – 作者:nch111-安全小百科
修改后
图片[3]-浅谈sql注入bypass – 作者:nch111-安全小百科
22. 利用协议未覆盖进行绕过
HTTP头里的Content-Type一般有application/x-www-form-urlencoded,multipart/form-data,text/plain三种,其中multipart/form-data表示数据被编码为一条消息,页上的每个控件对应消息中的一个部分。所以,当waf没有规则匹配该协议传输的数据时可被绕过。

来源:freebuf.com 2020-08-19 20:43:26 by: nch111

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论