[web安全] SQL注入原理與分類
阿新 • • 發佈:2019-01-03
一、SQL注入原理
SQL注入漏洞的形成原因:使用者輸入的資料被SQL直譯器執行
利用SQL注入繞過登入驗證
在登入的過程中使用者輸入“使用者名稱”和“密碼”。
在程式中執行如下的SQL語句:select count(*) from admin where username='[使用者名稱]'and password='[密碼]'
隨後根據返回結果的數目判斷驗證是否通過,如果大於0,表示通過,使用者可以成功登入。
攻擊者在[使用者名稱]處輸入'or 1=1 --,在[密碼]處輸入任意內容,即可繞過驗證,因為此時的SQL語句變成:
select count(*) from admin where username=''or 1=1 --'and password='[任意內容]',即查詢admin表所有的資料條數,肯定大於0,通過。
如果攻擊者在[使用者名稱]處輸入'or 1=1;drop table admin --,則程式執行select count(*) from admin where username=''or 1=1;drop table admin -- 'and password='[任意內容]',則會刪除admin表。
二、注入漏洞分類
2.1 數字型注入
當輸入的引數為整型時,如ID、年齡、頁碼等,如果存在注入漏洞,則可以認為是數字型注入。
測試步驟為:
http://www.example.com/test.php?id=8' 返回異常
http://www.example.com/test.php?id=8 and 1=1 返回正常
http://www.example.com/test.php?id=8 and 1=2 返回異常
2.2 字元型注入
當輸入引數為字串時,稱為字元型。數字型與字元型注入最大的區別在於:數字型不需要單引號閉合,而字串型別一般要使用單引號來閉合。
當查詢內容為字串時,SQL語句如下:select * from table where username='admin'
當利用程式碼時,不能輸入admin and 1=1,應該輸入admin' and 1=1 -- ,即語句為select * from table where username='admin' and 1=1 -- '
有時我們可能需要兩個單引號來平衡原SQL語句,SQL語句如下:update Person set username='username',set password='password' where id=1
攻擊者可以在使用者名稱或者密碼位置輸入'+(select @@version)+',即語句變為update Person set username='username',set password=''+(select @@version)+'' where id=1
再如insert語句:insert into users (username,password,title) values ('username','password','title')
當注入title欄位時,可以注入'+(select @@version)+',即語句變為insert into users (username,password,title) values ('username','password',''+(select @@version)+'')
2.3 其他按照注入位置命名的注入
POST注入:注入欄位在POST資料中;
Cookie注入:注入欄位在Cookie資料中;
延時注入:使用資料庫延時特性注入;
搜尋注入:注入處為搜尋的地點;
base64注入:注入字串需要經過base64加密;
注:嚴格地說,數字也是字串,在資料庫中進行資料查詢時,where id='1'也是合法的,只不過在查詢條件為數字時一般不會加單引號。
SQL注入漏洞的形成原因:使用者輸入的資料被SQL直譯器執行
利用SQL注入繞過登入驗證
在登入的過程中使用者輸入“使用者名稱”和“密碼”。
在程式中執行如下的SQL語句:select count(*) from admin where username='[使用者名稱]'and password='[密碼]'
隨後根據返回結果的數目判斷驗證是否通過,如果大於0,表示通過,使用者可以成功登入。
攻擊者在[使用者名稱]處輸入'or 1=1 --,在[密碼]處輸入任意內容,即可繞過驗證,因為此時的SQL語句變成:
select count(*) from admin where username=''or 1=1 --'and password='[任意內容]',即查詢admin表所有的資料條數,肯定大於0,通過。
如果攻擊者在[使用者名稱]處輸入'or 1=1;drop table admin --,則程式執行select count(*) from admin where username=''or 1=1;drop table admin -- 'and password='[任意內容]',則會刪除admin表。
二、注入漏洞分類
2.1 數字型注入
當輸入的引數為整型時,如ID、年齡、頁碼等,如果存在注入漏洞,則可以認為是數字型注入。
測試步驟為:
http://www.example.com/test.php?id=8' 返回異常
http://www.example.com/test.php?id=8 and 1=1 返回正常
http://www.example.com/test.php?id=8 and 1=2 返回異常
如果以上三個步驟都滿足,那麼程式就可能存在SQL注入漏洞。
這種數字型注入最多出現在ASP、PHP等弱型別語言中,弱型別語言會自動推導變數型別,例如,引數id=8,PHP會自動推導變數id的資料型別為int型別,那麼id=8 and 1=1,則會推導為string型別,這是弱型別語言的特性。而對於Java、C#這類強型別語言,如果試圖把一個字串轉換為int型別,則會丟擲異常,無法繼續執行。所以,強型別的語言很少存在數字型注入漏洞。
2.2 字元型注入
當輸入引數為字串時,稱為字元型。數字型與字元型注入最大的區別在於:數字型不需要單引號閉合,而字串型別一般要使用單引號來閉合。
當查詢內容為字串時,SQL語句如下:select * from table where username='admin'
當利用程式碼時,不能輸入admin and 1=1,應該輸入admin' and 1=1 -- ,即語句為select * from table where username='admin' and 1=1 -- '
有時我們可能需要兩個單引號來平衡原SQL語句,SQL語句如下:update Person set username='username',set password='password' where id=1
攻擊者可以在使用者名稱或者密碼位置輸入'+(select @@version)+',即語句變為update Person set username='username',set password=''+(select @@version)+'' where id=1
再如insert語句:insert into users (username,password,title) values ('username','password','title')
當注入title欄位時,可以注入'+(select @@version)+',即語句變為insert into users (username,password,title) values ('username','password',''+(select @@version)+'')
2.3 其他按照注入位置命名的注入
POST注入:注入欄位在POST資料中;
Cookie注入:注入欄位在Cookie資料中;
延時注入:使用資料庫延時特性注入;
搜尋注入:注入處為搜尋的地點;
base64注入:注入字串需要經過base64加密;
注:嚴格地說,數字也是字串,在資料庫中進行資料查詢時,where id='1'也是合法的,只不過在查詢條件為數字時一般不會加單引號。