SQL注入學(xué)習(xí)筆記
SQL注入基礎(chǔ)
SQL注入介紹:
SQL注入漏洞是由于SQL語句的調(diào)用方法不完善而產(chǎn)生的安全隱患。一旦應(yīng)用中存在SQL注入漏洞,就可能造成如下影響。值得注意的是,以下影響中攻擊者都能夠直接對(duì)服務(wù)器實(shí)施主動(dòng)攻擊,而不需要用戶參與。
數(shù)據(jù)庫內(nèi)的信息全部被外界竊取
數(shù)據(jù)庫中的內(nèi)容被篡改
登錄認(rèn)證繞過(應(yīng)用程序登錄不需要用戶名和密碼)
其他,例如服務(wù)器上的文件被讀取或修改、服務(wù)器上的程序被執(zhí)行等。
SQL注入的威脅:
錯(cuò)誤查詢導(dǎo)致信息泄露。
聯(lián)合查詢導(dǎo)致信息泄露。
繞過認(rèn)證。
篡改數(shù)據(jù)。
讀取文件。
根據(jù)數(shù)據(jù)庫引擎的不同,通過SQL注入攻擊還可能會(huì)達(dá)到下列效果。
執(zhí)行OS命令。
讀取文件
編輯文件
通過HTTP請(qǐng)求攻擊其他服務(wù)器。
SQL注入安全隱患產(chǎn)生原因:
SQL注入攻擊能夠以開發(fā)者意想不到的方式改變SQL語句的構(gòu)造,其中很大程度上都是因?yàn)樽置媪康木壒?/strong>。字面量指的是SQL語句中的固定值。SQL中每種數(shù)據(jù)類型都有相應(yīng)的字面量,其中最常用的字符串字面量和數(shù)值字面量。
字符串字面量的問題:
SQL標(biāo)準(zhǔn)規(guī)格中規(guī)定字符串字面量必須用單引號(hào)括起來。而若要在字符串字面量內(nèi)使用單引號(hào),就需要使用連續(xù)的兩個(gè)單引號(hào)來表示。這被稱為單引號(hào)轉(zhuǎn)義。
例如: abc’de字符串,需要使用兩個(gè)單引號(hào)來轉(zhuǎn)義。 ‘a(chǎn)bc’’de’
針對(duì)數(shù)值的SQL注入攻擊:
Web開發(fā)中普遍使用的腳本語言(PHP,Perl,Puby等)多為動(dòng)態(tài)類型語言,不限制變量類型。因此,理應(yīng)填入數(shù)值的地方就有可能會(huì)被填入其他類型的字符。比如,假設(shè)一下SQL語句中南age列的類型為整型,存儲(chǔ)的是年齡。
復(fù)制
由于數(shù)值字面量沒有用單引號(hào)圍住,所以,當(dāng)出現(xiàn)非數(shù)值的字符時(shí)即被視為數(shù)值字面量終止。此例中,分號(hào); 不是數(shù)值,因此分號(hào)以后的值就被排除了數(shù)值字面量,而被解釋為SQL語句的一部分。
安全對(duì)策:
產(chǎn)生SQL注入漏洞的根本原因?yàn)?,被指定為參?shù)的字符串的一部分被排除出字面量,導(dǎo)致SQL語句發(fā)生了變化。因此,要防止SQL注入漏洞,就必須防止SQL語句在拼接過程中被更改。具體可采取如下兩種方法:
使用占位符拼接SQL語句。
在應(yīng)用程序中拼接SQL語句時(shí),要確保字面量被正確處理,SQL語句不可被更改。
由于第二種方法的實(shí)施非常困難,因此常用第一種方式。
使用靜態(tài)占位符。
靜態(tài)占位符的綁定變量操作在數(shù)據(jù)庫引擎中執(zhí)行。含有占位符的SQL語句被直接發(fā)送至數(shù)據(jù)庫引擎,數(shù)據(jù)庫引擎執(zhí)行編譯等準(zhǔn)備工作后確定SQL。歲后綁定值也被發(fā)送至數(shù)據(jù)庫引擎,數(shù)據(jù)庫引擎將收到的值填充進(jìn)SQL語句后將其執(zhí)行。
由于SQL語句是在包含占位符的狀態(tài)下編譯的,因此從理論上來說,之后SQL語句就不可能再被改變。
動(dòng)態(tài)占位符:
動(dòng)態(tài)占位符的方式為,首先在處理SQL的程序庫中執(zhí)行綁定變量操作,然后再將SQL語句發(fā)送給數(shù)據(jù)庫引擎處理。綁定變量是字面量會(huì)被妥善處理,因此只要處理中沒有Bug就不會(huì)遭受SQL注入攻擊。
靜態(tài)和動(dòng)態(tài)占位符:
無論使用靜態(tài)還是動(dòng)態(tài)占位符都能消除SQL注入漏洞。但就理論上來說,靜態(tài)占位符能夠完全消除SQL注入漏洞出現(xiàn)的可能性,所以應(yīng)當(dāng)盡可能地采用靜態(tài)占位符。
SQL注入的輔助性對(duì)策:
不顯示詳細(xì)錯(cuò)誤消息
display_error=Off
檢驗(yàn)輸入值得有效性
設(shè)置數(shù)據(jù)庫權(quán)限