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) |