作者:掌控安全学员-暗箭
欢迎关注公众号:掌控安全EDU
不知不觉来到掌控学院也快两个月了,想起俩个月前,从零开始,一步一个脚印的走到现在。
虽然有时很疲惫,但是却很快乐。
在下才疏学浅,仅在这里发表一下不成熟的见解,希望对大家的提升有所帮助
首先我们要了解什么是waf:
Web应用防火墙,Web Application Firewall的简称
我们口头相谈的waf有什么功能呢?
WAF可以发现和拦截各类Web层面的攻击,记录攻击日志,实时预警提醒,在Web应 用本身存在缺陷的情况下保障其安全。
但是,WAF不是万能的、完美的、无懈可击的,在种种原因下,它们也会有 各自的缺陷,作为用户不可以盲目相信WAF而不注重自身的安全。
我们来看一下目前主流的WAF绕过技术:
作为攻击者,我们要清楚我们利用哪方面来进行绕过:
Web容器的特性
Web应用层的问题
WAF自身的问题
数据库的一些特性
Web容器特性1
在IIS+ASP的环境中,对于URL请求的参数值中的%,如果和后面的字符构成的字符串在URL编码表之外,ASP脚本 处理时会将其忽略。
现在假设有如下请求:
http://zkaq666.com/1.asp?id=1 union se%lect 1,2,3,4 fro%m adm%in
在WAF层,获取到的id参数值为
1 union all se%lect 1,2,3,4 fro%m adm%in
此时waf因为 % 的分隔,无法检测出关键字 select from 等
但是因为IIS的特性,id获取的实际参数就变为
1 union all select 1,2,3,4 from admin
从而绕过了waf。
这个特性仅在iis+asp上 http://asp.net并不存在。
Web容器特性2
IIS的Unicode编码字符
IIS支持Unicode编码字符的解析,但是某些WAF却不一定具备这种能力。
//已知 ‘s’ 的unicode编码为:%u0053, ‘f’ 的unicode编码为 %u0066
如下:
http://zkaq666.com/1.asp?id=1 union all %u0053elect 1,2,3,4, %u0066rom admin
但是IIS后端检测到了Unicode编码会将其自动解码,脚本引擎和数据库引擎最终获取到的参数会是: 1 union all select 1,2,3,4 from admin
这种情况需要根据不同的waf进行相应的测试,并不是百发百中。但是对于绕过来说,往往只要一个字符成功绕过 即可达到目的。
Web容器特性3
HPP(HTTP Parameter Pollution): HTTP参数污染:
如下图
在HTTP协议中是允许同样名称的参数出现多次的。例如:
http://zkaq666.com/1.asp?id=123&id=456 这个请求。
根据WAF的不同,一般会同时分开检查 id=123 和 id=456 ,也有的仅可能取其中一个进行检测。但是对于 IIS+ASP/http://ASP.NET来说,它最终获取到的ID参数的值是123,空格456(asp)或123,456(http://asp.net)。
所以对于这类过滤规则,攻击者可以通过:
id=union+select+password/&id=/from+admin来逃避对 select * from 的检测。因为HPP特性,id的参数值最终会变为:union select password/,/from admin
Web容器的特性 –4
畸形HTTP请求
当向Web服务器发送畸形的,非RFC2616标准的HTTP请求时, Web服务器出于兼容的目的,会尽可能解析畸形HTTP请求。而如果Web服务器的兼容方式与WAF不一致,则可能会出现绕过的情况。
下面来看这个POST请求: