
MySQL作为广泛使用的数据库管理系统,其SQL注入防御机制的研究与实践显得尤为重要
然而,攻击者往往会利用各种技巧绕过安全防护,特别是针对关键字过滤的绕过技巧
本文将深入探讨MySQL绕过关键字过滤的各种方法,旨在为安全研究人员和开发人员提供有力的防御参考
一、引言 SQL注入攻击的核心在于通过输入恶意的SQL代码,操控后端数据库执行未经授权的操作
为了防范此类攻击,许多Web应用会对用户输入进行关键字过滤,如空格、逗号、引号、union、select等常见SQL关键字
然而,这些过滤措施并非不可绕过,攻击者往往会利用数据库的特性、编码转换、注释符等多种手段来规避过滤规则
二、空格绕过技巧 空格是SQL语句中的常见字符,用于分隔关键字和参数
当空格被过滤时,攻击者可以采用多种替代方法
1.注释符替代:使用//或`/!这里的根据mysql版本的内容 不注释- /等注释符来替代空格
例如,select/ / from/ /users`可以绕过空格过滤
2.括号替代:在MySQL中,括号用于包围子查询,且括号两端可以没有多余的空格
因此,可以使用括号来绕过空格过滤,如`select(user())from dual where(1=1)and(2=2)`
3.控制字符替代:利用URL编码中的控制字符,如`%20`(空格)、`%09`(制表符)、`%0a`(换行符)等,也可以绕过空格过滤
4.浮点数替代:在某些情况下,可以通过将整数转换为浮点数来绕过空格过滤,如`select - from users where id=8E0 union select1,2,3`
三、逗号绕过技巧 逗号在SQL语句中用于分隔多个参数或列名
当逗号被过滤时,攻击者可以采用以下技巧来规避
1.使用JOIN:通过JOIN子句连接多个子查询,可以绕过逗号过滤
例如,`union select - from (select 1)a join (select2)b`等价于`union select1,2`
2.使用FROM TO:对于需要逗号的函数,如`substr()`和`mid()`,可以使用`from to`语法来替代
例如,`select substr(database() from1 for1)`等价于`select mid(database(),1,1)`
但请注意,`substring()`函数通常不受此限制
3.利用数据库特性:在某些数据库版本中,可以利用数据库的特性来绕过逗号过滤
例如,在某些MySQL版本中,可以使用`limit offset`语法来替代`limit m,n`语法
四、引号绕过技巧 引号在SQL语句中用于包围字符串或别名
当引号被过滤时,攻击者可以采用以下技巧
1.十六进制编码:将字符串转换为十六进制编码,可以绕过引号过滤
例如,`users`的十六进制编码为`7573657273`,因此`select column_name from information_schema.tables where table_name=users`可以变为`select column_name from information_schema.tables where table_name=0x7573657273`
2.使用反引号:在MySQL中,反引号用于包围数据库、表或列名
当普通引号被过滤时,可以尝试使用反引号来替代
但请注意,反引号通常不能用于包围字符串字面量
五、关键字绕过技巧 对于被过滤的SQL关键字,如`union`、`select`、`where`等,攻击者可以采用以下技巧来规避
1.大小写混合:数据库对SQL关键字的大小写通常不敏感,因此可以通过混合大小写来绕过关键字过滤
例如,`UNION SELECT`可以变为`uNiOn SeLeCt`
2.双写或内联注释:在某些情况下,可以通过双写关键字或使用内联注释来绕过过滤规则
例如,`UNIunionONSeLselectECT`或`/!UnIoN/SeLeCT`
3.使用等价函数:对于被过滤的函数,可以尝试使用其等价函数来替代
例如,`hex()`、`bin()`可以等价于`ascii()`;`sleep()`可以等价于`benchmark()`;`concat_ws()`可以等价于`group_concat()`等
4.利用数据库错误:在某些情况下,可以通过触发数据库错误来泄露敏感信息,从而绕过关键字过滤
例如,使用`extractvalue()`或`updatexml()`函数触发XML解析错误,可以泄露数据库版本或表结构等信息
六、其他绕过技巧 除了上述针对特定字符或关键字的绕过技巧外,还有一些通用的绕过方法
1.URL编码:将恶意SQL代码进行URL编码,可以绕过部分Web应用的输入验证机制
例如,`or1=1`可以编码为`%6f%72%20%31%3d%31`
2.二次编码:在某些情况下,可以通过对恶意SQL代码进行二次编码来绕过过滤规则
这通常需要Web应用后端存在解码漏洞或不当处理
3.利用逻辑运算符:通过逻辑运算符(如AND、OR、XOR、NOT等)的组合使用,可以构造出复杂的SQL注入攻击载荷,从而绕过简单的关键字过滤
4.利用数据库特性:不同版本的数据库管理系统可能存在不同的特性或漏洞,攻击者可以利用这些特性或漏洞来构造特定的SQL注入攻击载荷
七、防御措施 为了有效防范SQL注入攻击及其绕过技巧,Web应用开发者应采取以下防御措施: 1.输入验证与过滤:对用户输入进行严格验证和过滤,特别是针对特殊字符和关键字
但请注意,单纯的输入过滤并非万无一失,应结合其他防御措施共同使用
2.使用预编译语句:通过预编译语句(如Prepared Statements)将SQL代码与数据参数分离,从而有效防止SQL注入攻击
3.最小化数据库权限:为Web应用分配最小化的数据库权限,限制其对数据库的访问和操作范围
4.定期安全审计与漏洞扫描:定期对Web应用进行安全审计和漏洞扫描,及时发现并修复潜在的安全漏洞
5.采用Web应用防火墙(WAF):部署WAF可以有效拦截和防御SQL注入攻击等Web安全威胁
八、结论 MySQL绕过关键字过滤的技巧多种多样,但并非不可防范
通过采取严格的输入验证与过滤、使用预编译语句、最小化数据库权限、定期安全审计与漏洞扫描以及部署WAF等防御措施,可以有效降低SQL注入攻击的风险
同时,安全研究人员和开发人员应持续关注新的绕过技巧和防御方法的发展动态,不断提升Web应用的安全性
从MySQL语句学习数据查询技巧
MySQL技巧:巧妙绕过关键字过滤的实战策略
MySQL事件命名规范指南
MySQL8.0手工安装全攻略
MySQL实操:高效分表策略解析
Windows下MySQL启动失败解决方案
Javase与MySQL:是否包含关系揭秘
从MySQL语句学习数据查询技巧
MySQL事件命名规范指南
MySQL8.0手工安装全攻略
MySQL实操:高效分表策略解析
Windows下MySQL启动失败解决方案
Javase与MySQL:是否包含关系揭秘
MySQL操作技巧:如何轻松更改查询结果的字体颜色
Spring Boot实战:轻松写入MySQL数据库
MySQL多字段唯一键设置指南
MySQL创建唯一索引指南
MySQL.ini配置缺失wait参数解析
揭秘:MySQL之母关卡答案全解析