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