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)
发布了25 篇原创文章 · 获赞 23 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Secur17y/article/details/101549701