|
|
|

在最近兩年中,安全專家應(yīng)該對(duì)網(wǎng)絡(luò)應(yīng)用層的攻擊更加重視。因?yàn)闊o(wú)論你有多強(qiáng)壯的防火墻規(guī)則設(shè)置或者非常勤于補(bǔ)漏的修補(bǔ)機(jī)制,如果你的網(wǎng)絡(luò)應(yīng)用程序開發(fā)者沒(méi)有遵循安全代碼進(jìn)行開發(fā),攻擊者將通過(guò)80端口進(jìn)入你的系統(tǒng)。廣泛被使用的兩個(gè)主要攻擊技術(shù)是SQL注入[ref1]和CSS[ref2]攻擊。SQL 注入是指:通過(guò)互聯(lián)網(wǎng)的輸入?yún)^(qū)域,插入SQLmeta-characters(特殊字符代表一些數(shù)據(jù))和指令,操縱執(zhí)行后端的SQL查詢的技術(shù)。這些攻擊主要針對(duì)其他組織的WEB服務(wù)器。CSS攻擊通過(guò)在URL里插入script標(biāo)簽,然后誘導(dǎo)信任它們的用戶點(diǎn)擊它們,確保惡意Javascript代碼在受害人的機(jī)器上運(yùn)行。這些攻擊利用了用戶和服務(wù)器之間的信任關(guān)系,事實(shí)上服務(wù)器沒(méi)有對(duì)輸入、輸出進(jìn)行檢測(cè),從而未拒絕javascript代碼。
這篇文章討論SQL注入和CSS攻擊漏洞的檢測(cè)技術(shù)。網(wǎng)上已經(jīng)有很多關(guān)于這兩種基于WEB攻擊的討論,比如如何實(shí)施攻擊,他們的影響,怎樣更好的編制和設(shè)計(jì)程序防止這些攻擊。然而,對(duì)如何檢測(cè)這些攻擊并沒(méi)有足夠的討論。我們采用流行的開源的IDSSnort[ref3],組建根據(jù)檢測(cè)這些攻擊的規(guī)則的正則表達(dá)式。附帶,Snort默認(rèn)規(guī)則設(shè)定包含檢測(cè)CSS的方法,但是這些容易被避開檢測(cè)。比如大多通過(guò)hex進(jìn)制編碼,如%3C%73%63%72%69 %70%74%3E代替避開檢測(cè)。
依賴levelofparanoia組織的能力,我們已經(jīng)編寫了多種檢測(cè)相同攻擊的規(guī)則。如果你希望檢測(cè)各種可能的SQL注入攻擊,那么你需要簡(jiǎn)單的留意任何現(xiàn)行的SQLmeta-characters,如單引號(hào),分號(hào)和雙重破折號(hào)。同樣的一個(gè)極端檢測(cè)CSS攻擊的方法,只要簡(jiǎn)單地提防HTML標(biāo)記的角括號(hào)。但這樣會(huì)檢測(cè)出很多錯(cuò)誤。為了避免這些,這些規(guī)則需要修改使它檢測(cè)更精確些,當(dāng)仍然不能避免錯(cuò)誤。
在Snort規(guī)則中使用pcre(PerlCompatibleRegularExpressions)[ref4]關(guān)鍵字,每個(gè)規(guī)則可以帶或不帶其他規(guī)則動(dòng)作。這些規(guī)則也可以被公用軟件如grep(文檔搜索工具)使用,來(lái)審閱網(wǎng)絡(luò)服務(wù)器日志。但是,需要警惕的是,用戶的輸入只有當(dāng)以GET提交請(qǐng)求時(shí),WEB服務(wù)器才會(huì)記錄日記,如果是以POST提交的請(qǐng)求在日記中是不會(huì)記錄的。
2.SQL注入的正則表示式
當(dāng)你為SQL注入攻擊選擇正則表示式的時(shí)候,重點(diǎn)要記住攻擊者可以通過(guò)提交表單進(jìn)行SQL注入,也可以通過(guò)Cookie區(qū)域。你的輸入檢測(cè)邏輯應(yīng)該考慮用戶組織的各類型輸入(比如表單或Cookie信息)。并且如果你發(fā)現(xiàn)許多警告來(lái)自一個(gè)規(guī)則,請(qǐng)留意單引號(hào)或者是分號(hào),也許些字符是你的Web應(yīng)用程序創(chuàng)造的合法的在CookieS中的輸入。因此,您需要根據(jù)你的特殊的WEB應(yīng)用程序評(píng)估每個(gè)規(guī)則。
依照前面提到,一個(gè)瑣細(xì)的檢測(cè)SQL射入攻擊的正則表達(dá)式要留意SQL特殊的meta-characters譬如單引號(hào)(’)雙重?cái)U(kuò)則號(hào)(--),為了查出這些字符和他們hex等值數(shù),以下正則表達(dá)式適用:
2.1檢測(cè)SQLmeta-characters的正則表達(dá)式
/(%27)|(’)|(--)|(%23)|(#)/ix
解釋:
我們首先檢查單引號(hào)等值的hex,單引號(hào)本身或者雙重?cái)U(kuò)折號(hào)。這些是MSSQLServer或Oracle的字符,表示后邊的為評(píng)論,隨后的都將被忽略。另外,如果你使用MySQL,你需要留意’#’和它等值的hex的出現(xiàn)。注意我們不需要檢查雙重破折號(hào)等值的hex,因?yàn)檫@不是HTMLmeta- character,瀏覽器不會(huì)進(jìn)行編碼。并且,如果攻擊者設(shè)法手工修改雙重破折號(hào)為它的hex值%2D(使用代理像 Achilles[ref5]),SQL注入將失敗。
加入上述正則表達(dá)式的新的Snort規(guī)則如下:
alerttcp$EXTERNAL_NETany->$HTTP_SERVERS$HTTP_PORTS(msg:"SQLInjection-Paranoid";flow:to_server,established;uricontent:".pl";pcre:"/(%27)|(’)|(--)|(%23)|(#)/i";classtype:Web-application-attack;sid:9099;rev:5;)
在本篇討論中,uricontent關(guān)鍵字的值為".pl",因?yàn)樵谖覀兊臏y(cè)試環(huán)境里,CGI程序是用Perl寫的。uricontent關(guān)鍵字的值取決于您的特殊應(yīng)用,這個(gè)值也許是".php",或".asp",或".jsp",等。從這點(diǎn)考慮,我們不顯示對(duì)應(yīng)的Snort規(guī)則,但是我們會(huì)給出創(chuàng)造這些規(guī)則的正則表達(dá)式。通過(guò)這些正則表達(dá)式你可以很簡(jiǎn)單的創(chuàng)造很多的Snort規(guī)則.在前面的正則表達(dá)式里,我們檢測(cè)雙重破折號(hào)是因?yàn)椋杭幢銢](méi)有單引號(hào)的存在那里也可能是SQL射入點(diǎn)[ref6]。例如,SQL查詢條目只包含數(shù)值,如下:
selectvalue1,value2,num_value3fromdatabase
wherenum_value3=some_user_supplied_number
這種情況,攻擊者可以執(zhí)行額外的SQL查詢,示范提交如下輸入:
3;insertvaluesintosome_other_table
最后,pcre的修飾符’i’和’x’是用于分別匹配大小寫和忽略空白處的。上面的規(guī)則也可以另外擴(kuò)展來(lái)檢查分號(hào)的存在。然而,分號(hào)很可以是正常HTTP應(yīng)答的一部分。為了減少這種錯(cuò)誤,也是為了任何正常的單引號(hào)和雙重?cái)U(kuò)折號(hào)的出
現(xiàn),上面的規(guī)則應(yīng)該被修改成先檢測(cè)=號(hào)的存。用戶輸入會(huì)響應(yīng)一個(gè)GET或POST請(qǐng)求,一般輸入提交如下:
username=some_user_supplied_value&password=some_user_supplied_value
因此,SQL注入嘗試將導(dǎo)致用戶的輸入出現(xiàn)在a=號(hào)或它等效的hex值之后。
2.2修正檢測(cè)SQLmeta-characters的正則表達(dá)式
/((%3D)|(=))[^n]*((%27)|(’)|(--)|(%3B)|(:))/i
|
|
發(fā)表留言請(qǐng)先登錄!
|