天天看點

mysql 資料庫類型檢查_建立資料庫類型判斷總結

0x00、常用資料庫

常見的資料庫Oracle、MySQL、SQL Server、Access、MSsql、mongodb等。

關系型資料庫通過外鍵關聯來建立表與表之間的關系,非關系型資料庫通常指資料以對象的形式存儲在資料庫中,而對象之間的關系通過每個對象自身的屬性來決定。

關系型資料庫:由二維表及其之間的聯系組成的一個資料組織。如:Oracle、DB2、MySql。

非關系型資料庫:非關系型資料庫産品是傳統關系型資料庫的功能閹割版本,通過減少用不到或很少用的功能,來大幅度提高産品性能。如:NoSql、Cloudant。

0x01、判斷sql注入資料庫類型方法

1.是否可以使用該資料庫特有的特定的函數來判斷。

2.是否可以使用輔助的符号來判斷,如注釋符号、多語句查詢符等。

3.是否可以編碼查詢。

4.是否可以利用報錯資訊。

5.是否存在資料庫某些特性輔助判斷。

6.是否存在資料庫獨有的表名,庫名。

7.通過一些建站和實戰的經驗。

0x02、基于特定函數的判斷

len和length

在mssql和mysql以及db2内,傳回長度值是調用len()函數;在oracle和INFORMIX則是通過length()來傳回長度值。

當你使用and len('a')=1的時候,傳回正常頁面時,可以推斷目前的資料庫類型可能是mssql,或mysql,或是db2。反之則可能會是oracle和informix。

@@version和version()

在mysql内,可以用@@version或是version()來傳回目前的版本資訊。但無法判斷是mysql還是mssql時,可以用version()函數來構造判斷。

version()>1 傳回與@@version>1 相同頁面時,則可能是mysql。如果出現提示version()錯誤時,則可能是mssql。

substring和substr

在mssql中可以調用substring。oracle則隻可調用substr。

0x03、基于輔助的符号判斷

“/*”是MySQL中的注釋符,傳回錯誤說明該注入點不是MySQL,繼續送出如下查詢字元:

“--”是Oracle和MSSQL支援的注釋符,如果傳回正常,則說明為這兩種資料庫類型之一。繼續送出如下查詢字元:

“;”是子句查詢辨別符,Oracle不支援多行查詢,是以如果傳回錯誤,則說明很可能是Oracle資料庫。

有時利用--和# 這兩個注釋符号也可以大緻的确認資料庫類型,因為MSSQL是--,而MYSQL是#,ACCESS不支援注釋。

HTTP://xxx.xxx.xxx/abc.asp?p=YY--  異常

HTTP://xxx.xxx.xxx/abc.asp?p=YY#   正常

那麼資料庫有可能就是MYSQL或者ACCESS。

在注入點後加(必須為注入點);--(一個分号,兩個橫線),例如:

http://xxxx/article/as.asp?id=1;--。如果傳回正常的話,說明資料庫是MSSQL。在MSSQL資料庫中;和--都是存在的,;用來分離兩個語句,而--就是注釋符,它後面語句都不執行。如果傳回錯誤,基本可以肯定是ACCESS資料庫了。

0x04、利用資料庫伺服器的系統變量進行區分

SQL-SERVER有user,db_name()等系統變量,利用這些系統值不僅可以判斷SQL-SERVER,而且還可以得到大量有用資訊。如:

HTTP://xxx.xxx.xxx/abc.asp?p=YY and user>0   出錯時報的錯可能就包含了MSSQL的資訊

如:Microsoft OLE DB Provider for SQL Server error '80040e07'

不僅可以判斷是否是SQL-SERVER,而還可以得到目前連接配接到資料庫的使用者名

0x05、基于顯示錯誤資訊判斷

在注入點後直接加上單引号,根據伺服器的報錯資訊來判斷資料庫。錯誤提示Microsoft JET Database Engine 錯誤 '80040e14',說明是通過JET引擎連接配接資料庫,則表明資料庫為ACCESS資料庫,如果是ODBC的話則說明是MSSQL資料庫。

0x06、利用系統表

ACCESS的系統表是msysobjects,且在WEB環境下沒有通路權限,而SQL-SERVER的系統表是sysobjects,在WEB環境下有通路權限。對于以下兩條語句:

①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from sysobjects)>0

②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from msysobjects)>0

若資料庫是SQL-SERVER,則第一條,abc.asp一定運作正常,第二條則異常;

若是ACCESS則兩條都會異常。

and exists (select count(*) from sysobjects)

and exists (select count(*) from msysobjects)

如果第一條傳回正常,就是MSSQL資料庫,如果兩條都不正常,那就是ACCESS資料庫了。

第一句意思是查詢sysobjects表裡記錄數大于,傳回正常的,說明大于0且存在sysobjects這個表,因為這個表隻有MSSQL資料庫才有,是以可以判斷為MSSQL資料庫。傳回錯誤則表示不是。

第二句送出是不會傳回正常頁面的,就算是ACCESS資料庫也不會傳回正常。因為預設情況下我們沒有權限查詢這個表裡的資料。WEB會提示我們“記錄無法讀取;'msysobjects'沒有讀取權限”,如果傳回的是這個錯誤資訊的話,那就證明是ACCESS資料庫了

以上參數都是int的時候,如果是字元型的話首先在參數後面加上單引号,然後再在查詢語句後加上;--

以下列舉了一些資料庫的特征,歡迎補充

SQLSERVER:

ID=1 and (select count (*) from sysobjects)>0傳回正常

ID=1 and (select count (*) from msysobjects)>0傳回異常

ID=1 and left(version(),1)= 5%23ID=1 and exists(select id fromsysobjects)

ID=1 and length(user)>0ID=1 CHAR(97) + CHAR(110) + CHAR(100) + CHAR(32) + CHAR(49) + CHAR(61) + CHAR(49)

ACCESS:

ID=1 and (select count (*) from sysobjects)>0傳回異常

ID=1 and (select count (*) from msysobjects)>0傳回異常

MYSQL:

id=2 and version()>0傳回正常

id=2 and length(user())>0id=2 CHAR(97, 110, 100, 32, 49, 61, 49)

ORACLE:

ID=1 and '1'||'1'='11

ID=1 and 0<>(select count(*) from dual)

ID=1 CHR(97) || CHR(110) || CHR(100) || CHR(32) || CHR(49) || CHR(61) || CHR(49)

0x07、根據經驗來判斷

asp中小型網站一般是Access做資料庫,大型網站可能會用SQL Server;

ASP.NET的網站一般以SQL Server居多;

PHP的網站會用MySql;

JSP的網站會用SQL Server或Oracle!

0x08、參考連結

https://www.jianshu.com/p/e308d96e2ecd