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