湖北國菱帶你了解SQL
來源:湖北國菱計算機科技有限公司-荊州網(wǎng)站建設(shè)-荊州軟件開發(fā)-政府網(wǎng)站建設(shè)公司
時間:2021-01-12
什么是SQL注入
SQL 是用于訪問和處理數(shù)據(jù)庫的標(biāo)準(zhǔn)的計算機語言。
所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令。
SQL注入是由于開發(fā)人員把用戶輸入拼接進(jìn)入數(shù)據(jù)庫查詢語句,導(dǎo)致原有查詢語義被篡改。
SQL注入技術(shù)分為報錯注入、Union注入、時間盲注、布爾注入、堆疊注入等。
SQL注入可被利用來完成獲取數(shù)據(jù)庫數(shù)據(jù)、提權(quán)、DOS等攻擊。
工具:SQLMAP、啊D、明小子
Sql注入帶來的威脅
猜解后臺數(shù)據(jù)庫,盜取網(wǎng)站的敏感信息。
繞過認(rèn)證,列如繞過驗證登陸網(wǎng)站后臺
注入可以借助數(shù)據(jù)庫的存儲過程中進(jìn)行提權(quán)等操作。
SQL注入常用函數(shù)
Order by語句用于根據(jù)指定的列對結(jié)果進(jìn)行排序。
Union select union運算符可以將二個或二個以上select語句的查詢結(jié)果集合合并成一個結(jié)果集合顯示,既執(zhí)行聯(lián)合查詢。
Version ()版本
User () 數(shù)據(jù)庫用戶名
Database ()數(shù)據(jù)庫名
@@datadir 數(shù)據(jù)庫路徑
@@version_compile_os –操作系統(tǒng)版本
concat():連接一個或者多個字符串
group_concat():連接一個組的所有字符串,并以逗號分隔每一條數(shù)據(jù)
mysql 5.0版本以后提供了information.schema表,表中記錄了數(shù)據(jù)庫中所有的庫、表、列等信息
SCHEMATA表:儲存mysql所有數(shù)據(jù)庫的基本信息,包括數(shù)據(jù)庫名,編碼類型路徑等,show databases的結(jié)果取之此表
TABLES表:儲存mysql中的表信息,(當(dāng)然也有數(shù)據(jù)庫名這一列,這樣才能找到哪個數(shù)據(jù)庫有哪些表嘛)包括這個表是基本表還是系統(tǒng)表,數(shù)據(jù)庫的引擎是什么,表有多少行,創(chuàng)建時間,最后更新時間等。show tables from schemaname的結(jié)果取之此表
COLUMNS表:提供了表中的列信息,(當(dāng)然也有數(shù)據(jù)庫名和表名稱這兩列)詳細(xì)表述了某張表的所有列以及每個列的信息,包括該列是那個表中的第幾列,列的數(shù)據(jù)類型,列的編碼類型,列的權(quán)限,注釋等。是show columns from schemaname.tablename的結(jié)果取之此表
SQL注入攻擊防御
上面我們對SQL注入的原理和危害進(jìn)行了講解,并以攻擊者的角度對SQL注入漏洞的利用過程進(jìn)行了演示。下面我們以管理者的身份,從防御的角度來談一下SQL防注入。
通過SQL注入的原理我們得知,要想成功利用SQL注入漏洞,需要同時滿足兩個條件,一是攻擊者可以控制用戶的輸入,二是注入的代碼要被成功執(zhí)行。下面的內(nèi)容主要圍繞這兩個方面來展開。
首先,我們需要對從其他地方傳遞過來的參數(shù)在進(jìn)入數(shù)據(jù)庫之前進(jìn)行正確的處理。主要有以下幾個方面:
1.使用預(yù)編譯語句,綁定變量。
2.對傳入的參數(shù)進(jìn)行驗證,確保符合應(yīng)用中定義的標(biāo)準(zhǔn)。主要有白名單和黑名單兩種方法來實現(xiàn)。從理論上來講,白名單的安全性要比黑名單高,因為它只允許在白名單中定義的數(shù)據(jù)通過,其他數(shù)據(jù)都會被過濾掉。黑名單只會過濾定義在黑名單中的數(shù)據(jù)(比如SQL注入中的一些危險字符),通常使用正則表達(dá)式來實現(xiàn)。但需要注意的是,由于黑名單不可能包含所有的危險字符,所以可能會出現(xiàn)黑名單被繞過的情況。例如在mysql注入中,當(dāng)在黑名單中過濾了空格字符,我們可以使用'/*(mysql中注釋符)'和'+'來代替空格,繞過黑名單的限制繼續(xù)注入,因此我們應(yīng)該盡量多使用白名單。
除了對用戶的輸入進(jìn)行了驗證之外,有時因為程序員的安全意識和技術(shù)問題,也可能只是一個小小的疏忽,都有可能產(chǎn)生SQL注入漏洞。還有一種情況是,我們發(fā)現(xiàn)了SQL注入漏洞,但是由于條件所限或者其他原因,不能從代碼層來修復(fù)漏洞。比如在某一企業(yè)中有一套Web系統(tǒng)是由A程序員開發(fā)的,過了一段時間A離職了。后來,發(fā)現(xiàn)這套系統(tǒng)存在SQL注入漏洞,這時再讓A程序員回來修復(fù)漏洞幾乎是不可能的。而其他程序員由于對這套系統(tǒng)不熟悉或是因為技術(shù)問題沒有能力修復(fù)這個漏洞。這種情況在中小企業(yè)更為普遍。這時我們雖然不能從代碼層修復(fù)漏洞,但我們可以采用一些其他方式來阻止漏洞被利用成功,把面臨的風(fēng)險降到最低。如可以布署WAF(Web應(yīng)用防火墻)來阻斷SQL注入攻擊,雖然有些攻擊者可以繞過WAF的限制,但畢竟是少數(shù)。對于絕大多數(shù)的攻擊WAF都是可以檢測到并阻斷。即便是高水平的攻擊者,在布署WAF以后,也會明顯使漏洞利用變得困難。
最后,在數(shù)據(jù)庫方面,應(yīng)該使用“最小權(quán)限原則”,避免Web應(yīng)用使用高權(quán)限賬戶直接連接數(shù)據(jù)庫。如果有多個不同的應(yīng)用使用同一數(shù)據(jù)庫,則應(yīng)該為每個應(yīng)用分配不同的賬戶,并且只賦予必要的權(quán)限。
總結(jié)
其實在平常項目中,如果我們用了各種框架,并不需要我們來做防sql注入工作,因為框架已經(jīng)幫我們封裝好了,但是我們一旦用原始的獲取用戶輸入值的方式,就必須注意防止sql注入了。sql注入攻防原理是必須懂的,并時刻謹(jǐn)記于心,安全無事小,必須在每一個環(huán)節(jié)都注意防護(hù)。