1. 程式人生 > >sql注入一

sql注入一

·  最近在學習sql注入,把最近學到的知識做一下總結,防止以後忘記。

一、SQL注入的原理

  sql注入就是使用者通過輸入的資料,被當成SQL語句執行,來獲取更多的資料、更大的許可權。

  通過一個小例子來理解:

    一個正常的登入表單,輸入正確的賬號和密碼,程式就會查詢資料庫。如果存在此使用者且密碼正確,將會登入成功;如果密碼不正確,則會其實密碼或賬號錯誤。

                                 

    下來採用使用者" 'or 1=1  --  ",密碼隨便填寫,在點選登陸後,發現可以正常登入。當然這樣的漏洞現在已經很難找到了,在這裡只是舉一個簡單的例子。

    這是為什麼呢,我們猜想一下,本來輸入正確的使用者名稱和密碼,需要到資料庫中去查詢使用者,判斷使用者是否存在且其密碼是否正確。大膽的想一下,本來正確的資料庫查詢語句為:

      select count(*) from admin where username='使用者' and password='輸入的密碼'

    如果使用者名稱和密碼正確,返回結果為1,大於0,能正常登入,如果密碼和使用者名稱錯誤,返回結果為0,小於0,不能正常登入。

    接下來我們看一下特殊的使用者" 'or 1=1  --  " ,最終執行的sql語句為:

      select count(*)  from admin where username=' ' or 1=1 -- ' and password ='輸入的密碼'

    “--”後面的sql被註釋掉了,不能執行,where uernane = '賬戶' or 1=1始終為真,最後上面的sql語句執行的結果等於是把admin表中的使用者統計了一便,返回值肯定大於1,所以不管密碼是什麼,始終能登入成功。

二、判斷sql注點

  如果通過一下三個步驟全部滿足,則程式就可能存在sql注入漏洞。

    假設url為http:172.0.0.1/test.php?id=1,可以猜想SQL語句為:

      select * from table where id = 1

    1) http:172.0.0.1/test.php?id=1' and 1=1

      sql語句為:select * from table where id=1,這樣的語句肯定會出錯,導致程式無法執行,從而使頁面出現異常。

    2)http:172.0.0.1/test.php?id=1 and 1=1\

      sql語句為:select * from table where id=1 and 1=1,返回正常的頁面,沒有任何差異。

    3)http:172.0.0.1/test.php?id=1 and 1=2

      sql語句為:select * from table where id=1 and 1=2,語句執行正常,但無法查詢資料。返回的資料和原始頁面有差異。

    以上三個條件都滿足的,則程式可能存在注入異常。當然判斷注點的三個步驟不能是我想的,我也是個初學者,都是別人總結好的,只要記住就行。

三、sql注入實踐

  首先需要搭建學習sql注入的網站,我選則的是dvwa,在網上搜一下,就能搜到,安裝方法講的很清楚,我就不羅嗦了。

  登入以後,需要將dvwa的安全等級調到low級別。

  

  1、找到SQL Injection,我們安找上學的,判斷它有沒有注入漏洞。

     輸入1,提交後,返回了正確的資料

    

     輸入1',結果返回:

      You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1''' at line 1
    看到這裡,就高興了,在這裡存在sql注入漏洞。
  2、我們嘗試一下,看能不能獲取到表中的所有資料,試一下,輸入1 or 1=1,結果只得到了一個數據

    

    接下來,把id 當做一個字串試一下,輸入1' or '1' = '1,結果查詢到了表中的所有資料。

    

    要注意的是輸入的引數是字元型還是數字型,數字型不需要單引號閉合,而字元型需要字元型需要單引號來閉合。