欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

使用Python检测并绕过Web应用程序防火墙

来源:本站整理 作者:佚名 时间:2017-07-03 TAG: 我要投稿

Web应用防火墙通常会被部署在Web客户端与Web服务器之间,以过滤来自服务器的恶意流量。而作为一名渗透测试人员,想要更好的突破目标系统,就必须要了解目标系统的WAF规则。如今,许多WAF都是基于签名的。下图简单描绘了一个Web应用防火墙的工作流程:
什么是基于签名的防火墙?
在基于签名的防火墙中你可以自定义签名,如果你知道某种网络攻击遵循某种类型的模式或签名。那么你就可以定义匹配模式过滤掉它们,例如:
Payload :- alert`1`
上面定义的是一种常见的XSS payload,我们知道所有这类攻击都可能包含- >“”这些字符 ,因此我们可以在WAF中设定一个包含这些字符的的过滤规则,我们可以进行如下定义:
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文档定义如下:
html>
body>
form name="waf" action="waf.php" method="post">
Data: input type="text" name="data">br>
input type="submit" value="Submit">
form>
body>
html>
 PHP脚本:
html>
body>
Data from the form :  echo $_POST["data"]; ?>br>
body>
html>
 步骤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 = "svg>script>alert`1`p>"
maliciousRequest.form['data'] = crossSiteScriptingPayLoad
第一行代码我们首先将payload赋给了变量‘crossSiteScriptingPayLoad’。
第二行代码我们将payload提交给了表单字段“data”。
步骤4:提交表单并记录响应
下面我们提交此表单并记录响应信息:
maliciousRequest.submit()
response = maliciousRequest.response().read()
print response
提交表单
将响应赋给变量。
将将响应信息打印出来。
由于我目前并未安装部署防火墙,所以我得到了如下响应:

可以看到payload被打印在了HTML文档中,这也说明应用程序代码中没有任何的过滤机制,并且由于没有防火墙的保护,我们的恶意请求也未被阻止。

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载