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