1. SQL注入的概念:
1.1 概念: SQL注入就是將SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行的惡意SQL命令.
1.2 SQL如何產生:
1) WEB開發人員無法保證所有的輸入都已經過濾
2) 數據庫未做相應的安全配置
3)攻擊者利用發送給SQL服務器的輸入參數構造可執行的SQL代碼
1.3 攻擊方式: get請求、post請求、http頭信息、cookie等
1.4 如何預防(開發所做):
1) 嚴格檢查輸入變量的類型和格式
2) 過濾和轉義特殊字符
在username這個變量前進行轉義,對'、"、\等特殊字符進行轉義,如:php中的addslashes()函數對username參數進行轉義
3) 利用mysql的預編譯機制
1.5 攻擊例子:
1) 用戶登錄注入:
用戶輸入賬戶跟密碼之后相當於調用SQL語句進行數據庫用戶查詢,
相當於: SELECT * FROM user WHERE username = 'USER' ADN password = '123456'
當用戶名輸入改為:USER'--(單引號閉合user左邊的單引號),密碼隨意輸入,如:111,然后點擊提交按鈕
等價於SQL語句:SELECT * FROM user WHERE username = 'USER'--'ADN password = '123456'
這就導致了輸入一個錯誤的密碼或者不輸入密碼就可登錄用戶名為'user'的賬號,這是一個危險的操作
2) 一個數字輸入的注入:
在瀏覽器搜索地址欄輸入:https://www.baidu.com/baidu?tn=monline_3_dg&ie=utf-8&wd=hello,這是一個get型接口,發送這個請求相當於調用一個查詢語句:
SELECT * FROM article WHERE id = hello
當輸入數據改為: https://www.baidu.com/baidu?tn=monline_3_dg&ie=utf-8&wd= -1 OR 1 =1
那么 id = -1永遠是false,1=1永遠是true,所有整個where語句永遠是ture,所以where條件相當於沒有加where條件,那么查詢的結果相當於整張表的內容.
2. SQL注入的測試點:
2.1.輸入域的值為數字型,用1=1,1=2法
若滿足條件,則存在SQL注入漏洞,程序沒有對提交的整型參數的合法性做過濾或判斷
2.2.輸入域的值為字符型,用 ’1=1’, ’1=2’ 法
若滿足條件,則存在SQL注入漏洞,程序沒有對提交的字符型參數的合法性做過濾或判斷
2.3.輸入域中的值為搜索型,用’and [查詢條件] and ‘%’=’% 等
若滿足條件,則存在SQL注入漏洞,程序沒有對提交的查詢的合法性做過濾或判斷
2.4.用UNION查詢語句
利用Union可以連接查詢,從而從其他表中得到信息
2.5.大小寫排查
程序員對大小寫的過濾不充分時,會忽視大小寫混合的情況,容易存在漏洞
2.6.用UNICODE字符集檢查
用UNICODE字符集轉化的輸入,會把+號轉為%2B,把%號轉化為%25等,容易忽略過濾
2.7.用ASCII碼檢查
把輸入的字符用ASCII碼代替,如a=char(97),容易忽略過濾
2.8.用;號或—號檢查
分號;在SQLServer中表示隔開前后兩句語句,--表示后面的語句為注釋,容易忽略過濾
2.9.利用系統表
通過查詢數據庫的系統表名,可判斷具體用的數據庫類型
2.10.利用數據庫服務器的系統變量user 等
可以得到數據庫名,數據庫的用戶名,從而進行進一步攻擊
2.11.利用相關函數
若字符是中文的,比如where name=’用戶’,可以用where name=nchar(29992)+nchar(25143)代替。
2.12.界面輸入框中是否對SQL敏感字符進行了屏蔽
"exec" ,"xp_","sp_","declare","Union","cmd","+","//","..",";","'","--","%" 等命令關鍵字
2.13.是否對SQL腳本語法出錯信息進行了屏蔽
有些SQL注入的目的就是為了看到報錯的SQL命令,通過分析這些SQL命令,獲取關鍵的數據庫名,表名以及字段名等信息
2.14.在瀏覽器的地址欄中是否對一些恆等表達式進行了屏蔽
例如:https://www.baidu.com/baidu?tn=monline_3_dg&ie=utf-8&wd=19 and 1=1
2.15.對於提交表單的瀏覽器地址是否進行了敏感字符或命令集的屏蔽
2.16.對於cookie參數提交部分,是否對於cookie文件進行了敏感字符或命令集的屏蔽
3. 自動化SQL注入的工具Sqlmap
Sqlmap是一款自動化sql注入的工具,其功能強大,支持多種數據庫,包括mysql,sqlserver等主流的數據庫,采用獨特的sql注入方法來達到自動化注入掃描漏洞的目的。
1)基於布爾的盲注(Type:boolean-based blind),即可以根據返回頁面判斷條件真假的注入
2)基於時間的盲注(Type:time blind),即不能根據頁面返回內容判斷任何信息,用條件語句查看時間延遲語句是否執行(即頁面返回時間是否增加)來判斷
3)基於報錯注入(Type:error-based),即頁面會返回錯誤信息,或者把注入的語句的結果直接返回在頁面中
4)聯合查詢注入(union query),可以使用union的情況下的注入
5)堆查詢注入,可以同時執行多條語句的執行時的注入