雖然如此,攻擊者仍然有機會進行SQL注入攻擊。。。。。。前提是,當參數為數字型的時候,且未經過Intval()函數的處理,因為經過intval()的處理之後,所有的資料就都會強制轉換成數字。
前面已經提到過,開啟magic_quote_gpc=on之後,相當於使用addslshes()這個函數。但是數字型沒有用到單引號,所以理所當然的繞過了addslshes()函數的轉換了。而使用MySQL內建的char()函數或者HEX(),char()可以將參數解釋為整數並且返回這些整數的ASCII碼字元組成的字串,使用十六進位表示必須在數字前加上0x。
執行個體示範:
假設我們知道管理員的使用者名稱為admin,密碼不知道。並且已經將magic_quote_gpc啟用。
SQL語句:
代碼如下 |
複製代碼 |
$sql="select * from users where username=$name and password='$pwd'"; |
注意:變數$name沒加引號
此時,在地址欄中輸入username=admin%23,則合成後的sql語句為:
代碼如下 |
複製代碼 |
select * from users where username='admin' #' and password=''; |
這時候通過url地址欄輸入的單引號(’)將被加上反斜線,該sql語句將失效。
admin轉換成ASCII後是char(97,100,109,105,110)
此時在地址欄中輸入
代碼如下 |
複製代碼 |
username=char(97,100,109,105,110)%23 |
SQL語句就變成了:
代碼如下 |
複製代碼 |
select * from users where username=char(97,100,109,105,110)#' and password=''; |
執行結果為真,就可以順利進入後台。
對於數字型注入攻擊,必須在任何的數字型參數放入資料庫之前使用intval()對參數進行強制轉換成數字,從而可以斷絕數字型注入漏洞的產生。
比如:
代碼如下 |
複製代碼 |
$id=intval($_GET[‘id’]); select * from articles where id=’$id’; |
地址欄中輸入:
代碼如下 |
複製代碼 |
id=5’ or 1=1%23 |
SQL語句將變成:
代碼如下 |
複製代碼 |
select * from articles where id=’5’; 而不是select * from articles where id=’5’ or 1=1#; |
總結:
對於每一個變數都記得加上單引號,比如where username=’$name’,
開啟magic_quote_gpc並不是絕對安全的,對於數字型注入攻擊,僅僅使用addslashes()函數進行轉換是不夠的,還需使用intval()強制將參數轉換成數字