TOP 10 Web應(yīng)用脆弱性之一:未經(jīng)驗(yàn)證的輸入
描述
Web 應(yīng)用使用HTTP 請(qǐng)求(也許還有文件,也是一種特殊請(qǐng)求) 來(lái)進(jìn)行輸入,并決定如何進(jìn)行響應(yīng)。攻擊者可以篡改HTTP 請(qǐng)求的任何部分,包括url,查詢(xún)字符串(querystring), headers, cookies, 表單字段(包括隱藏字段),試圖繞過(guò)服務(wù)器的安全機(jī)制。常見(jiàn)的通用輸入篡改攻擊包括:
o 強(qiáng)迫瀏覽(forced browsing);
o 命令注入(command insertion);
o 交叉站點(diǎn)腳本(cross site scripting);
o 緩沖區(qū)溢出(buffer overflows);
o 格式字符串攻擊(format string attacks);
o SQL注入(SQL injection);
o 有毒餅干(cookie poisoning);
o 隱藏字段操作(hidden field manipulation),等等。
某些站點(diǎn)試圖通過(guò)過(guò)濾惡意輸入來(lái)保護(hù)自己。但問(wèn)題是編碼信息的方式無(wú)窮無(wú)盡。這些編碼方式看起來(lái)并不是加密的,所以似乎也用不著解碼。但是,開(kāi)發(fā)人員仍然經(jīng)常忘記將所有的參數(shù)在使用之前解碼為最簡(jiǎn)單的形式。參數(shù)應(yīng)該在其被校驗(yàn)之前轉(zhuǎn)換為最簡(jiǎn)單的形式,否則,惡意輸入就可能掩飾自己從而流過(guò)過(guò)濾器。簡(jiǎn)化這些編碼的過(guò)程稱(chēng)為是“規(guī)格化(canonicalization)”。因?yàn)閹缀跛械?SPAN lang=EN-US>HTTP 輸入都可以編碼為多種格式,這種技術(shù)便可以打亂各種旨在利用和攻擊上述弱點(diǎn)的攻擊行為。這使得過(guò)濾非常困難。
有非常之多的web 應(yīng)用僅使用客戶(hù)端校驗(yàn)來(lái)驗(yàn)證輸入??蛻?hù)端校驗(yàn)機(jī)制是非常容易繞過(guò)的,這樣就使得Web應(yīng)用幾乎對(duì)惡意參數(shù)的攻擊毫無(wú)保護(hù)。攻擊者可以使用攻擊甚至telnet來(lái)產(chǎn)生他們自己的HTTP 請(qǐng)求。他們才不關(guān)心開(kāi)發(fā)人員預(yù)定想要在客戶(hù)端發(fā)生的時(shí)候事情呢。注意,客戶(hù)端校驗(yàn)僅僅在提高性能和可用性方面有益,但是它毫無(wú)安全可言。因此,對(duì)于惡意參數(shù)攻擊,服務(wù)器端校驗(yàn)是必須的。
這種攻擊的數(shù)量在不斷上升,因?yàn)橛写罅康闹С謪?shù)的“模糊化”(“fuzzing”)、腐朽(corruption)、以及野蠻強(qiáng)制增長(zhǎng)的工具出現(xiàn)。不應(yīng)該低估了這些使用非校驗(yàn)輸入進(jìn)行攻擊的影響。實(shí)際上如果開(kāi)發(fā)人員能夠在使用參數(shù)之前對(duì)其進(jìn)行驗(yàn)證,就可抵擋大部分的攻擊。因此,最好使用一個(gè)中心化的、強(qiáng)大的驗(yàn)證機(jī)制來(lái)對(duì)所有HTTP 請(qǐng)求的輸入都進(jìn)行驗(yàn)證,這樣利用此弱點(diǎn)進(jìn)行攻擊的數(shù)量就會(huì)大減。
環(huán)境影響
所有web servers, application servers, 以及應(yīng)用環(huán)境都容易受到這種參數(shù)篡改的攻擊。
如何決定你的應(yīng)用是否脆弱
一個(gè)Web應(yīng)用所用的未經(jīng)驗(yàn)證的HTTP請(qǐng)求的任何和部分都稱(chēng)為是“臟” 參數(shù)。找出臟參數(shù)的最簡(jiǎn)單的方式是進(jìn)行最詳細(xì)的代碼評(píng)審,找出所有從HTTP請(qǐng)求提取信息的方法調(diào)用。比如,在J2EE應(yīng)用中,這些包括HttpServletRequest 類(lèi)(以及其子類(lèi))中的方法。然后你就可以循著代碼查看參數(shù)變量是在哪里使用的。如果變量在使用之前未作驗(yàn)證,這可能就是一個(gè)潛在的問(wèn)題。在Perl中,你因該考慮使用 “taint” (-T) 選項(xiàng)。
你也可以通過(guò)一些工具來(lái)找出臟參數(shù),比如OWASP的 WebScarab。它們可以查看和評(píng)審?fù)ㄟ^(guò)HTTP/HTTPS的所有數(shù)據(jù),并進(jìn)行分析。
如何保護(hù)
保護(hù)很簡(jiǎn)單,那就是確保任何參數(shù)在被使用之前都進(jìn)行了驗(yàn)證。最好的辦法是使用一個(gè)中心化的組件庫(kù),比如Java中的Jarkarta Commons Validator.每個(gè)參數(shù)都演進(jìn)行嚴(yán)格檢查。涉及到過(guò)濾臟數(shù)據(jù)的“負(fù)面”方法或者依賴(lài)于簽名的方法都不可能很有效率,并且難以維護(hù)。
參數(shù)應(yīng)該進(jìn)行“正向”規(guī)格的檢查,正向規(guī)格( “positive” specification )的定義可包括:
- 數(shù)據(jù)類(lèi)型(string, integer, real, 等)
- 允許的字符集
- 最大最小長(zhǎng)度
- 是否允許null
- 是否必需
- 是否允許重復(fù)
- 數(shù)值范圍
- 特定的法定值 (枚舉)
- 特定模式(正則表達(dá)式)
* 本系列整理自 OWASP(Opensource Web Applicaiton Security Project )