关于WAF
概述
WAF(Web应用防火墙)是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
通俗来说就是WAF产品里集成了一定的检测规则,会对每个请求的内容根据生成的规则进行检测并对不符合安全规则的作出对应的防御处理,从而保证Web应用的安全性与合法性
工作原理
WAF的处理流程大致可分为四部分:预处理、规则检测、处理模块、日志记录
预处理
预处理阶段首先在接收到数据请求流量时会先判断是否为HTTP/HTTPS请求,之后会查看此URL请求是否在白名单之内
如果该URL请求在白名单列表里,直接交给后端Web服务器进行响应处理,对于不在白名单之内的对数据包解析后进入到规则检测部分
规则检测
每一种WAF产品都有自己独特的检测规则体系,解析后的数据包会进入到检测体系中进行规则匹配,检查该数据请求是否符合规则,识别出恶意攻击行为
处理模块
针对不同的检测结果,处理模块会做出不同的安全防御动作
如果符合规则,则交给后端Web服务器进行响应处理,对于不符合规则的请求会执行相关的阻断、记录、告警处理
不同的WAF产品会自定义不同的拦截警告页面,在日常渗透中我们也可以根据不同的拦截页面来辨别出网站使用了哪款WAF产品,从而有目的性的进行WAF绕过
日志记录
WAF在处理的过程中也会将拦截处理的日志记录下来,方便用户在后续中可以查看日志进行分析
WAF分类
软WAF
软件WAF安装过程比较简单,需要安装到需要安全防护的web服务器上,以纯软件的方式实现
代表产品:安全狗,云锁,D盾等
硬WAF
硬件WAF的价格一般比较昂贵,支持多种方式部署到Web服务器前端,识别外部的异常流量,并进行阻断拦截,为Web应用提供安全防护
代表产品有:Imperva、天清WAG等
云WAF
云WAF的维护成本低,不需要部署任何硬件设备,云WAF的拦截规则会实时更新
对于部署了云WAF的网站,我们发出的数据请求首先会经过云WAF节点进行规则检测,如果请求匹配到WAF拦截规则,则会被WAF进行拦截处理,对于正常、安全的请求则转发到真实Web服务器中进行响应处理
代表产品有:阿里云云盾,腾讯云WAF等
自定义WAF
更多情况下会遇到的是网站开发人员自己写的防护规则
网站开发人员为了网站的安全,会在可能遭受攻击的地方增加一些安全防护代码,比如过滤敏感字符,对潜在的威胁的字符进行编码、转义等
部署方式
- 透明网桥
- 反向代理
- 镜像流量
- 路由代理
绕过WAF
编码绕过
绕WAF最常见的方法就是使用各种编码进行绕过,但编码能绕过的前提是提交编码后的参数内容在进入数据库查询语句之前会有相关的解码代码
- URL编码
- 二次URL编码
- Unicode编码
- Base64编码
- Hex编码
- ASCII编码
字母大小写转换绕过
部分WAF只过滤全大写(SLEEP)或者全小写(sleep)的敏感字符,未对sleeP/slEEp进行过滤,可对关键字进行大小写转换进行绕过
空格过滤绕过
- 使用空白符替换空格绕过
- 使用‘+’替换空格绕过
- 使用注释符/**/替换空格绕过
双关键字绕过
部分WAF会对关键字只进行一次过滤处理,可使用双关键字绕过
内联注释绕过
在MySQL里,/**/是多行注释,这个是SQL的标准,但是MySQL扩张了解释的功能,如果在开头的的/*后头加了惊叹号(/*!50001sleep(3)*/),那么此注释里的语句将被执行
请求方式差异规则松懈性绕过
有些WAF同时接收GET方法和POST的方法,但只在GET方法中增加了过滤规则,可通过发送POST方法进行绕过
异常Method绕过
有些WAF只检测GET,POST方法,可通过使用异常方法进行绕过
超大数据包绕过
部分WAF只检测固定大小的内容,可通过添加无用字符进行绕过检测
复参数绕过【参数污染】
在提交的URL中给一个参数多次赋了不同的值(?id=1&id=2),部分WAF在处理的过程中可能只处理前面提交的参数值(id=1),而后端程序在处理的时候可能取的是最后面的值
添加%绕过过滤
将WAF中过滤的敏感字符通过添加%绕过过滤
例如:WAF过滤了select ,可通过se%lect绕过过滤,在进入后端执行中对参数串进行url解码时,会直接过滤掉%字符,从而注入语句被执行。IIS下的asp.dll文件在对asp文件后参数串进行url解码时,会直接过滤%字符
协议未覆盖绕过
四种常见的content-type类型
- Content-Type:multipart/form-data;
- Content-Type:application/x-www-form-urlencoded
- Content-Type: text/xml
- Content-Type: application/json
部分WAF可能只对一种content-type类型增加了检测规则,可以尝试互相替换尝试去绕过WAF过滤机制
宽字节绕过
宽字节注入是因为使用了GBK编码。为了防止sql注入,提交的单引号(%27)会进行转义处理,即在单引号前加上斜杠(%5C%27)
%00截断
部分WAF在解析参数的时候当遇到%00时,就会认为参数读取已结束,这样就会只对部分内容进行了过滤检测
Cookie/X-Forwarded-For注入绕过
部分WAF可能只对GET,POST提交的参数进行过滤,未对Cookie或者X-Forwarded-For进行检测,可通过cookie或者X-Forwarded-For提交注入参数语句进行绕过
利用pipline绕过
当请求中的Connection字段值为keep-alive,则代表本次发起的请求所建立的tcp连接不断开,直到所发送内容结束Connection为close为止。部分WAF可能只对第一次传输过来的请求进行过滤处理
利用分块编码传输绕过
分块传输编码是HTTP的一种数据传输机制,允许将消息体分成若干块进行发送。当数据请求包中header信息存在Transfer-Encoding: chunked,就代表这个消息体采用了分块编码传输
冷门函数/字符/运算符绕过
- floor() ==> updatexml(),extractvalue()
- Substring() ==> Mid(),Substr(),Lpad(),Rpad(),Left()
- concat() ==> concat_ws(),group_concat()
- limit 0,1 ==> limit1 offset 0
- and ==> &&
- or ==> ||
- = ==> <,>
- = ==> like
- Sleep() ==> benchmark()
本文系作者 @小白学安全 原创发布在 xbxaq.com 站点,未经许可,禁止转载!
评论