SQL注入原理之不安全的數據庫配置

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章