sql注入是在系統開發的過程當中程序員編程不規範,咱們能夠經過把SQL語句插入到WEB表單中進行查詢字符串,最終達成欺騙服務器執行惡意的SQL命令。對於如今的網站SQL注入愈來愈嚴重,而在滲透測試過程當中也是常常遇到的。據不徹底統計,國內的網站用ASP+Access或SQLServer的佔70%以上,PHP+MySQ佔L20%,其餘的不足10%。javascript
SQL的注入類型有如下5種:java
Boolean-based blind SQL injection(布爾型注入) Error-based SQL injection(報錯型注入) UNION query SQL injection(可聯合查詢注入) Stacked queries SQL injection(可多語句查詢注入) Time-based blind SQL injection(基於時間延遲注入)
對於sql注入,咱們首先應該判斷出網站使用何種數據庫,這樣能夠進行下一步的注入,這樣能夠達到事半功倍的效果。那麼咱們是如何判讀sql注入的數據庫類型呢?python
常見的數據庫Oracle、MySQL、SQL Server、Access、MSsql、mongodb等mysql
關係型數據庫經過外鍵關聯來創建表與表之間的關係,非關係型數據庫一般指數據以對象的形式存儲在數據庫中,而對象之間的關係經過每一個對象自身的屬性來決定.程序員
關係型數據庫:由二維表及其之間的聯繫組成的一個數據組織。如:Oracle、DB二、MySqlsql
非關係型數據庫:非關係型數據庫產品是傳統關係型數據庫的功能閹割版本,經過減小用不到或不多用的功能,來大幅度提升產品性能。如:NoSql、Cloudantmongodb
1.是否可使用特定的函數來判斷,該數據庫特有的數據庫
2.是否可使用輔助的符號來判斷,如註釋符號、多語句查詢符等等編程
3.是否能夠編碼查詢服務器
4.是否顯能夠利用錯信息
5.是否存在數據庫某些特性輔助判斷
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
「/*」是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的時候,若是是字符型的話首先在參數後面加上單引號,而後再在查詢語句後加上;--
在注入點後直接加上單引號,根據服務器的報錯信息來判斷數據庫。錯誤提示Microsoft JET Database Engine 錯誤 '80040e14',說明是經過JET引擎鏈接數據庫,則代表數據庫爲ACCESS數據庫,若是是ODBC的話則說明是MSSQL數據庫。
根據以上方法能夠在sql注入中判斷出咱們注入的數據庫類型,繼而能夠對應相應的注入方法進行注入。以上只是簡單的方法,之後又新方法會繼續補充。