1、默認的用戶
數據庫帶有很多默認的用戶安裝內容。SQL Server使用聲名狼藉的“SA”作爲數據庫系統管理員賬戶,MySQL使用“root”和“Anonymous”用戶賬戶,Oracle則在創建數據庫時通常默認會創建SYS、SYSTEM、DBSNMP和OUTLN賬戶,當然這並非全部的賬戶。
應用開發人員在編寫程序代碼是,通常使用某個內置的權限賬戶來連接數據庫,而不是根據程序需要老創建特徵用戶賬戶。
2、附加內容
攻擊者在利用SQL注入漏洞時,通常會嘗試訪問數據庫的元數據。元數據是指數據庫內部包含的數據,比如數據庫或表的名稱、列的數據類型或訪問權限。優勢也適用數據字典和系統目錄等其他項來表示這些信息。
MySQL服務器(5.0及之後的版本)的元數據位於Information_schema虛擬數據庫中,可通過show databases和show tables命令訪問。所有MySQL用戶均有權訪問該數據庫中的表,但只能查看錶中那些與該用戶訪問權限相對應的行。
SQL Server的原理與MySQL類似,可通過Information_schema或系統表(sysobjects、sysindexkeys、sysindexes、syscolumns、systypes等)及系統存儲過程來訪問元數據。SQL Server 2005引入了一些名爲“sys.*”的目錄視圖,並限制用戶只能訪問擁有相應訪問權限的對象。所有的SQl Server用戶均有權限訪問數據庫中的表並可以查看錶中的所有行,而不管用戶是否對錶或所查詢的數據擁有相應的訪問權限。
Oracle提供了恨過全局內置視圖來訪問Oracle的元數據(ALL_TABLES、ALL_TAB_COLUMNS等)。這些視圖列出了當前用戶可訪問的屬性和對象。此外,以USER_開頭的視圖只顯示當前用戶擁有的對象(列如,更加受限的元數據視圖);以DBA_開頭的視圖顯示數據庫中所有對象。DBA_元數據函數需要有數據庫管理員DBA權限。
語句示例
Oracle語句,列舉當前用戶可訪問的所有表
SELECT OWNER,TABLE_NAME FROM ALL_TABLES ORDER BY TABLE_NAME;
MySQL語句,列舉當前用戶可訪問的所有表和數據庫
SELECT table_schema, table_name FROM information_schema.tables;
MS SQL語句,使用系統表列舉所有可訪問的表
SELECT name FROM sysobjects WHERE xtype = 'U';
MS SQL語句,使用目錄視圖列舉所有可訪問的表
SELECT name FROM sys.tables;
3、通過SQL方言推理識別數據庫平臺
平臺 | 連接符 | 行註釋 | 唯一的默認表、變量或函數 | int轉char函數 |
---|---|---|---|---|
MS SQL Server | ‘A’+‘B’ | – | @@PACK_RECEIVED | char(0x41) |
Oracle | ‘A’||'B’ concat(‘A’,‘B’) |
– | BITAND(1, 1) | chr(65) |
MySQL | ‘A’ 'B’ concat(‘A’,‘B’) |
# – |
CONNECTION_ID() | char(0x41) |
Access | “A”&“B” | N/A | msysobjects | chr(65) |
PostgreSQL | ‘A’||‘B’ | – | getpgusername() | chr(65) |
DB2 | ‘a’ concat ‘b’ | – | sysibm.systables | chr(65) |