waf绕过思路总结
引言
首先有一个问题,什么是waf
waf 的全称是:Web Application Firewall
可以这个是web 应用的防火墙,但是和传统的防火墙有什么区别呢?
放置位置
IDS: 入侵检测系统
IPS: 入侵防御系统
WAF: Web应用程序防火墙
osi 模型中的位置
- 传统防火墙工作在传输层和网络层(3,4)层
- waf 工作于应用层,同时能够向下兼容网络防火墙
工作方式
- waf 能够比较有效的过滤特定web 应用程序的内容
- 常规的防火墙的工作是充当于服务器的安全门
waf 分类
软waf
软件WAF安装过程比较简单,需要安装到需要安全防护的web服务器上,以纯软件的方式实现。
代表产品:安全狗,云锁,D盾等
硬waf
硬件WAF的价格一般比较昂贵,支持多种方式部署到Web服务器前端,识别外部的异常流量,并进行阻断拦截,为Web应用提供安全防护。
代表产品有:Imperva、天清WAG等
云waf
云WAF的维护成本低,不需要部署任何硬件设备,云WAF的拦截规则会实时更新。对于部署了云WAF的网站,我们发出的数据请求首先会经过云WAF节点进行规则检测,如果请求匹配到WAF拦截规则,则会被WAF进行拦截处理,对于正常、安全的请求则转发到真实Web服务器中进行响应处理。
代表产品有:阿里云云盾,腾讯云WAF等
自定义waf
我们在平时的渗透测试中,更多情况下会遇到的是网站开发人员自己写的防护规则。网站开发人员为了网站的安全,会在可能遭受攻击的地方增加一些安全防护代码,比如过滤敏感字符,对潜在的威胁的字符进行编码、转义等。
waf 的部署模式
作为服务器的模块
好处是:对而已请求的拦截效率比较高
缺点是:过于分散,不好管理
作为反向代理服务器
优点是:部署简单,集中管理
缺点是:对恶意请求误判率比较高
作为路由器
优点是:集中管理,部署简单
缺点是:单点问题,需要双机,同时由于作为一个路由器,需要在用户态上实现协议栈(TCP/IP),维护路由信息,不占用域名,对性能要求更高;且对https支持难度高。因此整体实现难度很高。
作为交换机
优点是:部署方便简单,集中管理,不占域名,也不占用IP,也就是说,对攻击者来说,它完全是透明的
缺点是:单点问题,需要双机,作为一个交换机,也需要在用户态实现协议栈(链路,TCP/IP),维护转发表,也由于同时防护多个站点,对性能要求高;且对https支持难度高。
交换机和路由器的主要区别是:交换机工作与数据链路层,路由器工作于网络层传输层
第二种方式是主流waf 的工作方式
waf 功能
- 禁止HTTP协议的非安全方法
- 伪装Web服务的特征
- 防止API和命令注入
- 防止路径遍历和文件包含注入,对敏感的系统路径进行保护
- 防止sql注入
- 防止XSS攻击
- 防止网页挂马
- 防护CC攻击
- 文件上传的防护
- 动态IP黑名单
- 白名单
- 与实时计算平台对接
waf 工作原理
大致的处理流程是
预处理 -> 规则检测 -> 处理模块 -> 日志记录
预处理
预处理阶段首先在接收到数据请求流量时会先判断是否为HTTP/HTTPS请求,之后会查看此URL请求是否在白名单之内,如果该URL请求在白名单列表里,直接交给后端Web服务器进行响应处理,对于不在白名单之内的对数据包解析后进入到规则检测部分。
规则检测
每一种WAF产品都有自己独特的检测规则体系,解析后的数据包会进入到检测体系中进行规则匹配,检查该数据请求是否符合规则,识别出恶意攻击行为。
处理模块
针对不同的检测结果,处理模块会做出不同的安全防御动作,如果符合规则则交给后端Web服务器进行响应处理,对于不符合规则的请求会执行相关的阻断、记录、告警处理。
日志处理
WAF在处理的过程中也会将拦截处理的日志记录下来,方便用户在后续中可以进行日志查看分析。
waf 绕过
通过编码绕过
- url 编码
- 二次url 编码
- 其他编码
大小写绕过
空格绕过
使用空白符号进行绕过
数据库类型 允许的空白符 SQLite3 0A,0D,0C,09,20 MySQL5 09,0A,0B,0C,0D,A0,20 PosgresSQL 0A,0D,0C,09,20 Oracle 11g 00,0A,0D,0C,09,20 MSSQL 01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,20 使用
+
进行绕过使用注释符
1
/**/
双关键字绕过
内联sql 绕过
请求方式差异绕过
当白名单中有某一个请求的白名单的时候可以使用这个方式进行绕过
使用异常的方法绕过过滤规则
超大数据包绕过
复参数绕过
1
?id=1&id=2+and+sleep(3)
将攻击语句赋予最后一个id参数,可绕过WAF检测直接进入后端服务器。
添加%绕过过滤
将WAF中过滤的敏感字符通过添加%绕过过滤。
例如:WAF过滤了select ,可通过se%lect绕过过滤,在进入后端执行中对参数串进行url解码时,会直接过滤掉%字符,从而注入语句被执行。IIS下的asp.dll文件在对asp文件后参数串进行url解码时,会直接过滤%字符。
协议未覆盖绕过
下面是四种常见的content-type
1
2
3
4Content-Type:multipart/form-data;
Content-Type:application/x-www-form-urlencoded
Content-Type: text/xml
Content-Type: application/json部分WAF可能只对一种content-type类型增加了检测规则,可以尝试互相替换尝试去绕过WAF过滤机制。
例如使用multipart/form-data进行绕过。
宽字节绕过
%00截断
Cookie/X-Forwarded-For注入绕过
部分WAF可能只对GET,POST提交的参数进行过滤,未对Cookie或者X-Forwarded-For进行检测,可通过cookie或者X-Forwarded-For提交注入参数语句进行绕过。
Cookie:TOKEN=F6F57AD6473E851F5F8A0E7A64D01E28; id=1+and+1=1;
X-Forwarded-For:127.0.0.1’;WAITFOR DELAY’0:0:5’–
pipline
当请求中的Connection字段值为keep-alive,则代表本次发起的请求所建立的tcp连接不断开,直到所发送内容结束Connection为close为止。部分WAF可能只对第一次传输过来的请求进行过滤处理。
利用分块编码传输绕过
分块传输编码是HTTP的一种数据传输机制,允许将消息体分成若干块进行发送。当数据请求包中header信息存在Transfer-Encoding: chunked,就代表这个消息体采用了分块编码传输。
冷门函数
添加换行符
1
2
3
4
5Content-Disposition: "form-data"; name="file_x"; filename=[0x09]"xx.php"
Content-Disposition: "form-data"; name="file_x"; filename=[0x09]"xx.php
Content-Disposition: "form-data"; name="file_x"; filename=[0x09]"xx.php"[0x09]
Content-Disposition: "form-data"; name="file_x"; filename=[0x09]xx.php
Content-Disposition: "form-data"; name="file_x"; filename=[0x09]xx.php[0x09];多个等号
1
Content-Disposition: form-data; name=="file_x"; filename===="test.php"