1. 程式人生 > >淺談開啟magic_quotes_gpc後的sql注入攻與防

淺談開啟magic_quotes_gpc後的sql注入攻與防

通過啟用php.ini配置檔案中的相關選項,就可以將大部分想利用SQL注入漏洞的駭客拒絕於門外。

       開啟magic_quotes_gpc=on之後,能實現addslshes()和stripslashes()這兩個函式的功能。在PHP4.0及以上的版本中,該選項預設情況下是開啟的,所以在PHP4.0及以上的版本中,就算PHP程式中的引數沒有進行過濾,PHP系統也會對每一個通過GET、POST、COOKIE方式傳遞的變數自動轉換,換句話說,輸入的注入攻擊程式碼將會全部被轉換,將給攻擊者帶來非常大的困難。

       雖然如此,攻擊者仍然有機會進行SQL注入攻擊。。。。。。前提是,當引數為數字型的時候,且未經過Intval()函式的處理,因為經過intval()的處理之後,所有的資料就都會強制轉換成數字。

       前面已經提到過,開啟magic_quotes_gpc=on之後,相當於使用addslshes()這個函式。但是數字型沒有用到單引號,所以理所當然的繞過了addslshes()函式的轉換了。而使用MySQL自帶的char()函式或者HEX(),char()可以將引數解釋為整數並且返回這些整數的ASCII碼字元組成的字串,使用十六進位制表示必須在數字前加上0x。

       例項演示:

       假設我們知道管理員的使用者名稱為admin,密碼不知道。並且已經將magic_quotes_gpc啟用。

       SQL語句:sql="select∗fromuserswhereusername=sql="select∗fromuserswhereusername=name and password='pwd′";注意:變數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(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#;