■丁燕
SQL注入有病 安全專家有良方
■丁燕
SQL注入攻擊是一個(gè)非常老的攻擊方式,由于很多應(yīng)用程序都存在SQL注入漏洞而且SQL注入方式與手段變化多端,盡管大型企業(yè)一般都花巨資購(gòu)買多種安全保護(hù)系統(tǒng),但是SQL注入攻擊導(dǎo)致企業(yè)蒙受損失的新聞還是層出不窮:
香港航空某站SQL注入(涉及156萬(wàn)乘客信息/268萬(wàn)機(jī)票信息/八千多員工信息);中石化車e族APP存在SQL注入漏洞之一(可跨9個(gè)庫(kù));海爾旗下日日順商城SQL注入導(dǎo)致300萬(wàn)會(huì)員信息泄漏;邯鄲市工信辦漏洞危及大量個(gè)人信息以及金額等數(shù)據(jù),百萬(wàn)用戶數(shù)據(jù)泄露;中國(guó)電信翼支付某系統(tǒng)漏洞泄露400萬(wàn)用戶信息、支付交易明細(xì)信息(超市購(gòu)物/加油站加油)以及充值等數(shù)據(jù)。
從這些例子可以看出SQL注入是當(dāng)前應(yīng)用安全防護(hù)的重點(diǎn)和難點(diǎn),是什么原因?qū)е氯绱斯爬系墓舴绞皆诋?dāng)今安全軟件如此豐富的情況下依舊導(dǎo)致這么大傷害呢?筆者認(rèn)為有以下幾點(diǎn):
SQL注入漏洞大面積的存在:當(dāng)今系統(tǒng)越來(lái)越復(fù)雜,發(fā)布節(jié)奏越來(lái)越快,遺漏代碼非常多。很多公司對(duì)安全不夠重視,帶病上線是非常常見(jiàn)的事情。
關(guān)系型數(shù)據(jù)庫(kù)是現(xiàn)在最流行的存儲(chǔ)方式,大多數(shù)有價(jià)值的信息都存在數(shù)據(jù)庫(kù)里。這對(duì)黑客的誘惑力太大了。
攻擊方式并不難找,網(wǎng)絡(luò)有大量的SQL注入攻擊的方法和手段。黑客很容易找到攻擊的方式。
SQL注入:就是通過(guò)把SQL命令插入到Web表單提交或輸入域名或頁(yè)面請(qǐng)求的查詢字符串里,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令。
具體來(lái)說(shuō),它是利用現(xiàn)有應(yīng)用程序,將(惡意)的SQL命令注入到后臺(tái)數(shù)據(jù)庫(kù)引擎執(zhí)行的能力,它可以通過(guò)在Web表單輸入(惡意)SQL語(yǔ)句得到一個(gè)存在安全漏洞的網(wǎng)站的數(shù)據(jù)庫(kù)信息,而不按照設(shè)計(jì)者的意圖執(zhí)行SQL語(yǔ)句。
首先讓我們了解下什么時(shí)候可能發(fā)生SQL注入:
假設(shè)我們?cè)跒g覽器中輸入U(xiǎn)RL:www.sample.com,由于它只是對(duì)頁(yè)面的簡(jiǎn)單請(qǐng)求無(wú)需對(duì)數(shù)據(jù)庫(kù)進(jìn)行動(dòng)態(tài)請(qǐng)求,所以它不存在SQL注入,當(dāng)輸入www.sample.com testid=23時(shí),我們?cè)赨RL中傳遞了變量testid,并且提供值為23,由于它是對(duì)數(shù)據(jù)庫(kù)進(jìn)行動(dòng)態(tài)查詢的請(qǐng)求(其中testid=23表示數(shù)據(jù)庫(kù)查詢變量),所以我們可以在該URL中嵌入了惡意SQL語(yǔ)句。
具體的例子和詳細(xì)的原理就不贅述了,有興趣的同學(xué)可以去谷歌或者百度搜索,上面會(huì)有大量的例子和攻擊方式。
最主要的保護(hù)方式有以下幾點(diǎn):
使用Prepared Statements(參數(shù)查詢)來(lái)代替Statements—這要求所有數(shù)據(jù)庫(kù)開(kāi)發(fā)人員在開(kāi)發(fā)SQL查詢語(yǔ)句時(shí)將代碼和數(shù)據(jù)分開(kāi),先定義查詢語(yǔ)句的結(jié)構(gòu),將數(shù)據(jù)通過(guò)參數(shù)的方式出入,這樣輸入的參數(shù)將不會(huì)當(dāng)作SQL命令來(lái)執(zhí)行,基本上能避免SQL注入的攻擊。
使用存儲(chǔ)過(guò)程來(lái)操作數(shù)據(jù)庫(kù)——所有的存儲(chǔ)過(guò)程都存放在數(shù)據(jù)庫(kù)里面,應(yīng)用程序調(diào)用存儲(chǔ)過(guò)程來(lái)查詢數(shù)據(jù)。
轉(zhuǎn)義用戶輸入的所有特殊字符——永遠(yuǎn)不要信任用戶的輸入,要對(duì)用戶的輸入進(jìn)行校驗(yàn),可以通過(guò)正則表達(dá)式,或限制長(zhǎng)度,對(duì)單引號(hào)和雙"-"進(jìn)行轉(zhuǎn)換等。這些在一定程度可以緩解SQL注入。
還有些輔助的方法:
以最低權(quán)限的數(shù)據(jù)庫(kù)連接,為每個(gè)應(yīng)用使用單獨(dú)的權(quán)限與有限的數(shù)據(jù)庫(kù)連接。不要把機(jī)密信息明文存放,加密或者h(yuǎn)ash掉密碼和敏感的信息。應(yīng)用的異常信息應(yīng)該給出盡可能少的提示,最好使用自定義的錯(cuò)誤信息對(duì)原始錯(cuò)誤信息進(jìn)行包裝,把異常信息存放在獨(dú)立的表中。RASP從根本上解決SQL注入攻擊。
上面描述的是一些非常有用的SQL防護(hù)手段,但是都存在需要花費(fèi)大量的精力制定代碼規(guī)范的缺點(diǎn),確保每個(gè)程序員都能按照這個(gè)規(guī)范來(lái)編寫代碼。但是現(xiàn)在的程序都非常復(fù)雜,代碼量動(dòng)輒百萬(wàn)行,需要非常多的程序員一起完成,要確保每個(gè)程序員寫出完全符合安全規(guī)范的代碼是完全不可能的。有些公司通過(guò)第三方代碼掃描工具對(duì)代碼進(jìn)行靜態(tài)和動(dòng)態(tài)掃描,試圖發(fā)現(xiàn)和修復(fù)所有SQL注入的漏洞,在實(shí)踐中也非常不理想,以下幾個(gè)方面的約束使這種想法很難實(shí)現(xiàn):
代碼量巨大,完全修復(fù)這些漏洞要花費(fèi)巨大的人力和時(shí)間,在大多數(shù)公司基本不可能實(shí)現(xiàn)。掃描工具漏洞更新比較滯后,很多漏洞都不能得到及時(shí)更新。即使完全修復(fù),上線后也會(huì)有新的漏洞產(chǎn)生。一般項(xiàng)目都會(huì)大量使用第三方API和框架,這些外部程序的漏洞是不可修改的,即使提供商承諾修改也需要比較長(zhǎng)得時(shí)間。
現(xiàn)在有很多的安全產(chǎn)品,包括傳統(tǒng)防火墻,WAF(Web防火墻)等等,這些安全產(chǎn)品基本上是根據(jù)數(shù)據(jù)流掃描的結(jié)果來(lái)提供保護(hù),并不了解應(yīng)用程序的上下文,所以不能精確識(shí)別攻擊行為,更談不上有效的保護(hù),再加之現(xiàn)在云計(jì)算越來(lái)越盛行,傳統(tǒng)的有清晰邊界的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)也越來(lái)越少,因此這些產(chǎn)品對(duì)類似于SQL注入等應(yīng)用安全攻擊效果并不好。
那么安全專家有什么好的建議呢?他們推薦了RASP,這是最近非常流行的應(yīng)用安全保護(hù)方案,它是在應(yīng)用程序運(yùn)行時(shí)進(jìn)行自我保護(hù),它將實(shí)時(shí)代碼漏洞掃描和Web防火墻實(shí)時(shí)攔截安全攻擊的能力組合起來(lái),像疫苗一樣將安全保護(hù)代碼注入到應(yīng)用程序中。它無(wú)需修改任何代碼,簡(jiǎn)單修改JVM啟動(dòng)腳本就可以和應(yīng)用程序結(jié)合在一起,在應(yīng)用程序運(yùn)行時(shí)一起運(yùn)行,擁有應(yīng)用程序的上下文,可以根據(jù)具體的用戶行為有針對(duì)性行的進(jìn)行安全監(jiān)控和保護(hù),既可以精確的識(shí)別和防范安全攻擊,也可以最大限度的降低對(duì)性能和用戶體驗(yàn)的影響。
而具體到SQL注入保護(hù)方面,RASP做得非常完美。它就像一個(gè)大的虛擬補(bǔ)丁,將大部分已知的SQL注入漏洞進(jìn)行修補(bǔ),確保大部分漏洞得到保護(hù)。這樣大部分的攻擊將無(wú)效,目前國(guó)內(nèi)已知的僅有OneRASP具備這樣的防護(hù)能力。
對(duì)于未知漏洞OneRASP將建立實(shí)時(shí)漏洞更新系統(tǒng),能及時(shí)更新最新漏洞,在不影響用戶系統(tǒng)的前提下,確保用戶及時(shí)有效地抵御零日攻擊。
對(duì)于無(wú)法預(yù)知的SQL注入方式,OneRASP也有辦法防御。常見(jiàn)的SQL注入保護(hù)方式往往采用通用的方法,而每個(gè)數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方式有很大的不同,這些通用的方式必然會(huì)有遺漏之處。對(duì)安全來(lái)說(shuō)任何遺漏都是致命的,黑客可以利用任何可乘之機(jī)獲得機(jī)密。OneRASP對(duì)SQL注入保護(hù)非常完整,它將保護(hù)代碼植入SQL注入攻擊的必經(jīng)點(diǎn):JDBC的各個(gè)廠家的實(shí)現(xiàn)類Statement.class里面,每個(gè)保護(hù)動(dòng)作都是在對(duì)數(shù)據(jù)庫(kù)SQL語(yǔ)言的實(shí)現(xiàn)完全理解的基礎(chǔ)上編寫的,考慮SQL注入的每種攻擊可能,實(shí)現(xiàn)從根上對(duì)SQL注入的完整保護(hù)。