當(dāng)前位置:首頁 > IT技術(shù) > 數(shù)據(jù)庫 > 正文

SQL注入中information_schema的作用
2021-10-22 10:10:31

?在MySQL數(shù)據(jù)庫的注入中,如果你有仔細(xì)看過SQL注入語句的話,你可能就會發(fā)現(xiàn),在獲取數(shù)據(jù)庫名、表名和字段的時候,注入語句中information_schema這個數(shù)據(jù)庫出現(xiàn)得很頻繁,那么有沒有想過為什么會需要用到這個數(shù)據(jù)庫呢? 這個數(shù)據(jù)庫又是什么?它里面保存了什么?

?? ?? information_schema數(shù)據(jù)庫是MySQL自帶的,MySQL 5以下沒有這個數(shù)據(jù)庫,它提供了訪問數(shù)據(jù)庫元數(shù)據(jù)的方式。什么是元數(shù)據(jù)呢?元數(shù)據(jù)是關(guān)于數(shù)據(jù)的數(shù)據(jù),如數(shù)據(jù)庫名或表名,列的數(shù)據(jù)類型,或訪問權(quán)限等。也就是說information_schema中保存著關(guān)于MySQL服務(wù)器所維護(hù)的所有其他數(shù)據(jù)庫的信息。如數(shù)據(jù)庫名,數(shù)據(jù)庫的表,表欄的數(shù)據(jù)類型與訪問權(quán)限等。在INFORMATION_SCHEMA中,有數(shù)個只讀表。

????? 在phpmyadmin中,在左側(cè)點(diǎn)擊information_schema數(shù)據(jù)庫。

?

?

?顯示了該數(shù)據(jù)庫中的所有表,由于表數(shù)量太多,只截了一部分,可以拉動右邊的滾動條查看所有表。

?

也可以執(zhí)行如下SQL語句來查看該庫中的所有表:

?? ???show tables;

需要注意的是,要在information_schema這個數(shù)據(jù)庫中執(zhí)行該SQL語句。如何進(jìn)入information_schema數(shù)據(jù)庫執(zhí)行SQL語句,請參考前面進(jìn)入sqli數(shù)據(jù)庫執(zhí)行SQL語句的步驟。

????? 這上面顯示的表,它們實(shí)際上是視圖,而不是基本表,所以你在數(shù)據(jù)庫的數(shù)據(jù)保存目錄,會看不到這個數(shù)據(jù)庫的實(shí)體文件。數(shù)據(jù)庫的數(shù)據(jù)保存在 C:wampinmysqlmysql5.6.17data 目錄,在這個目錄下一共有如下4個目錄:

?

?

?想要查看數(shù)據(jù)庫的數(shù)據(jù)保存目錄,可以執(zhí)行select @@datadir

?

??每一個目錄對應(yīng)數(shù)據(jù)庫中的一個數(shù)據(jù)庫,在數(shù)據(jù)庫中執(zhí)行show databases;的時候,可以看到存在5個數(shù)據(jù)庫,正是少了information_schema這個數(shù)據(jù)庫。

?

??然后在彈出來的列表中點(diǎn)擊MySQL,再選擇MySQL控制臺。?會彈出一個命令行窗口,這就是mysql客戶端,此時要求輸入密碼,由于root的密碼為空,直接回車即可

?

??進(jìn)入information_schema 數(shù)據(jù)庫,命令為:use information_schema;?。一定要注意后面記得加分號,分號表示一個語句結(jié)束,如果沒有檢測到你輸入分號,它會認(rèn)為你一個語句還沒結(jié)束,直到碰到分號后,才開始執(zhí)行語句。

?

?首先執(zhí)行show databases;查看所有的數(shù)據(jù)庫,然后再執(zhí)行select schema_name from schemata;。

?

?desc 可以用來看表結(jié)構(gòu)。看下tables的表結(jié)構(gòu),執(zhí)行desc tables;

?

?注意上圖中標(biāo)記的那2條記錄,每一條記錄中,他們分別記錄一個表名和一個這個表所屬的庫名。其中TABLE_NAME保存的是表名,而TABLE_SCHEMA保存的是這個表名所在的數(shù)據(jù)庫。我們可以查詢一條記錄看看,在查詢前,先看看有多少條記錄,避免記錄太多查看不方便,執(zhí)行select count(*) from tables;?

?

?說明當(dāng)前所有數(shù)據(jù)庫中的表數(shù)量為142。查詢?nèi)我庖粭l記錄查看,我這里選擇最后一條記錄,SQL語句為:select * from tables limit 141,1G由于在客戶端中,默認(rèn)查詢結(jié)果顯示不友好,所以,可以把語句后面的分號改成G,他會讓一條記錄顯示一行,看起來不那么亂。G只支持在客戶端中用,在其他連接數(shù)據(jù)庫的軟件中,使用G會報(bào)錯。

?

??可以看到,最后一條記錄的TABLE_NAME是user,TABLE_SCHEMA為sqli。查看sqli數(shù)據(jù)庫中的表,SQL語句為:show tables from sqli;可以看到確實(shí)存在user表。

??? 既然information_schema的TABLES表中的TABLE_SCHEMTA字段是保存的數(shù)據(jù)庫名,而TABLE_NAME保存了表名,那么我們就可以使用TABLE_SCHEMTA字段作為查詢條件,查詢TABLE_NAME,即可得知所有指定數(shù)據(jù)庫中的所有表名。比如,我們想要通過information_schema數(shù)據(jù)庫來查詢sqli數(shù)據(jù)庫中所有的表,那么就可以使用如下SQL語句:

? ? ??select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA = 'sqli';

?? ?? 如果當(dāng)前庫為information_schema,則可以省略不寫,否則跨庫查詢的時候,需要帶上庫名。

? 通過修改TABLE_SCHEMA 的限制,可以查詢?nèi)我鈹?shù)據(jù)庫中的所有表名,網(wǎng)上的通過注入爆表名便是這個原理。

?? ?? 知道了表名,那么如何獲取表中的字段呢?要知道我們沒有表名的話,會把所有的數(shù)據(jù)查詢出來,而如果注入沒有回顯,不能進(jìn)行union查詢,那么想要獲取我們的標(biāo)目數(shù)據(jù),無疑效率極低。

????? 幸運(yùn)的是,在information_schema數(shù)據(jù)庫中,同樣存在一個表,它保存了整個數(shù)據(jù)中,所有的列名,這個表就是COLUMNS。同樣先查看該表結(jié)構(gòu)。

?

?

?這里面,與注入相關(guān)的存在3個字段,分別是TABLE_SCHEMA、TABLE_NAME以及COLUMN_NAME,不難猜到,如果在該表中查詢一條記錄,TABLE_SCHEMA保存了這條記錄保存的字段所屬的數(shù)據(jù)庫名,而TABLE_NAME保存的是該字段所屬表名,COLUMN_NAME則是一個列名記錄,查詢一條記錄驗(yàn)證一下,首先確定該表有多少條記錄,執(zhí)行select count(*) from columns;,得知一共有1662條記錄

?

??? 我們獲取最后一條記錄,執(zhí)行select * from columns limit 1661,1G

其中COLUMNS_NAME為ip,TABLE_NAME為user,TABLE_SCHEMA為sqli,這說明,在sqli這個數(shù)據(jù)中,user表存在一個ip的列,也就是我們常說的ip字段。

? ? ? 查看sqli的user表是否存在該字段,執(zhí)行SQL語句:show columns from sqli.user;

我們要通過information_schema數(shù)據(jù)庫的columns表查詢sqli數(shù)據(jù)庫中user表中所有的字段,可以執(zhí)行如下SQL語句:

? ? ??select column_name from information_schema.columns where TABLE_SCHEMA='sqli' and TABLE_NAME='user';

?

?

?

?

?

?

?

?查詢結(jié)果與show columns from sqli.user;?一致。

為什么網(wǎng)上的SQL注入語句中,數(shù)據(jù)庫名都是用的字符的16進(jìn)制值?

hex():將目標(biāo)字符串裝換成16進(jìn)制格式的數(shù)據(jù)
select hex(“dvwa”)
返回結(jié)果:70696B61636875
unhex():將16進(jìn)制格式的數(shù)據(jù)裝換成原字符串
語句:unhex(64767761)
解釋:返回結(jié)果:dvwa

left()/right() :從規(guī)定字符串的左邊/右邊開始截取字符串
LEFT(s,n) 、RIGHT(s,n)
從字符串s左/右邊開始截取n位字符串

?

?

本文摘自 :https://www.cnblogs.com/

開通會員,享受整站包年服務(wù)立即開通 >