軟體測試 -- SQL注入測試跟JS注入測試
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 攻擊例子:
使用者登入注入:
使用者輸入賬戶跟密碼之後相當於呼叫SQL語句進行資料庫使用者查詢, 相當於: SELECT * FROM user WHERE username = 'user' ADN password = 'pwd123'
當用戶名輸入改為:user'--(單引號閉合user左邊的單引號),密碼隨意輸入,如:111,然後點選提交按鈕, 等價於SQL語句:SELECT * FROM user WHERE username = 'user'--
這就導致了輸入一個錯誤的密碼或者不輸入密碼就可登入使用者名稱為'user'的賬號,這是一個危險的操作
一個數字輸入的注入:
在瀏覽器搜尋位址列輸入:https://www.baidu.com/baidu?tn=monline_3_dg&ie=utf-8&wd=123,這是一個get型介面,傳送這個請求相當於呼叫一個查詢語句:SELECT * FROM article WHERE id = 123
當輸入資料改為: https://www.baidu.com/baidu?tn=monline_3_dg&ie=utf-8&wd=
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)堆查詢注入,可以同時執行多條語句的執行時的注入