SQL注入-數據庫判斷


0x01、sql注入

sql注入是在系統開發的過程中程序員編程不規范,我們可以通過把SQL語句插入到WEB表單中進行查詢字符串,最終達成欺騙服務器執行惡意的SQL命令。對於現在的網站SQL注入越來越嚴重,而在滲透測試過程中也是經常遇到的。據不完全統計,國內的網站用ASP+Access或SQLServer的占70%以上,PHP+MySQ占L20%,其他的不足10%。

SQL的注入類型有以下5種:

Boolean-based blind SQL injection(布爾型注入) Error-based SQL injection(報錯型注入) UNION query SQL injection(可聯合查詢注入) Stacked queries SQL injection(可多語句查詢注入) Time-based blind SQL injection(基於時間延遲注入) 

對於sql注入,我們首先應該判斷出網站使用何種數據庫,這樣可以進行下一步的注入,這樣可以達到事半功倍的效果。那么我們是如何判讀sql注入的數據庫類型呢?

0x02、常用數據庫

常見的數據庫Oracle、MySQL、SQL Server、Access、MSsql、mongodb等

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

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

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

0x03、判斷sql注入數據庫類型方法

1.是否可以使用特定的函數來判斷,該數據庫特有的

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

3.是否可以編碼查詢

4.是否顯可以利用錯信息

5.是否存在數據庫某些特性輔助判斷

0x04、基於特定函數的判斷

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

0x05、基於輔助的符號判斷

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

“--”是Oracle和MSSQL支持的注釋符,如果返回正常,則說明為這兩種數據庫類型之一。繼續提交如下查詢字符:

“;”是子句查詢標識符,Oracle不支持多行查詢,因此如果返回錯誤,則說明很可能是Oracle數據庫。

在注入點后加(必須為注入點);--(一個分號,兩個橫線),例如:http://xxxx/article/as.asp?id=1;--。如果返回正常的話,說明數據庫是MSSQL。在MSSQL數據庫中;和--都是存在的,;用來分離兩個語句,而--就是注釋符,它后面語句都不執行。如果返回錯誤,基本可以肯定是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的時候,如果是字符型的話首先在參數后面加上單引號,然后再在查詢語句后加上;--

0x05、基於顯示錯誤信息判斷

在注入點后直接加上單引號,根據服務器的報錯信息來判斷數據庫。錯誤提示Microsoft JET Database Engine 錯誤 '80040e14',說明是通過JET引擎連接數據庫,則表明數據庫為ACCESS數據庫,如果是ODBC的話則說明是MSSQL數據庫。

 
 

0x06、總結

根據以上方法可以在sql注入中判斷出我們注入的數據庫類型,繼而可以對應相應的注入方法進行注入。以上只是簡單的方法,以后又新方法會繼續補充。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM