Web安全中SQL注入的具体绕过技巧有哪些?能举例说明吗?
摘要:SQL注入绕过技术通过混淆、编码和语法替换等方式突破安全防护。主要方法包括:1)关键字混淆(大小写混合/内联注释);2)空白符替代(使用注释或控制字符);3)字符编码(URL/十六进制编码);4)语法替换(LIKE替代等值比较);5)特殊攻击(宽字节注入)。防御关键在于识别WAF与SQL解析器的差异,攻击者通过变形使恶意载荷既能绕过检测又可被执行。测试时需系统尝试各种技巧,并善用自动化工具提
在Web安全领域,SQL注入的攻防是一场持续的技术博弈。当基础的注入方法被防御机制(如WAF、输入过滤器)阻挡时,攻击者会采用各种精妙的技巧来绕过这些限制。
下面这个表格汇总了主要的绕过技巧及其核心思路,可以让你快速建立起整体认知。
|
绕过类别 |
核心思路 |
典型方法举例 |
|---|---|---|
|
关键字混淆 |
干扰WAF或过滤器对恶意关键词(如 |
大小写混合、内联注释、双写关键字、注释分割关键词。 |
|
空白符替代 |
当空格被过滤时,使用其他字符或符号充当分隔符。 |
使用注释 |
|
字符编码 |
对载荷进行编码,绕过基于字符串匹配的过滤。 |
URL编码、十六进制编码、Unicode编码、使用 |
|
语法替换 |
使用功能相同但写法不同的SQL语法或函数。 |
用 |
|
特殊攻击 |
利用特定环境配置(如字符集)实现绕过。 |
宽字节注入、HTTP参数污染。 |
💡 关键技巧详解与举例
了解大类后,我们通过一些具体场景和例子来加深理解。
1. 混淆与分割关键字
这是应对简单黑名单过滤的有效方法。
-
大小写混合:如果过滤器只检测小写的
select,可以尝试SeLeCt。 -
内联注释:在MySQL中,
/*!SELECT*/会被正常执行。这常被用来分割关键字,例如UNI/*!12345ON*/ SEL/*!12345ECT*/,其中的数字可以指定MySQL版本限制。 -
双写关键字:如果过滤器是将
union替换为空字符串,那么输入ununionion在经过替换后,剩下的部分正好是union,从而绕过检查。
2. 替代空白符与逗号
在盲注等场景中,绕过对空格和逗号的限制至关重要。
-
空白符替代:除了常用的
/**/,还可以使用制表符 (%09)、换行符 (%0a) 等。此外,利用括号也可以避免使用空格,例如?id=1 and(1=1)。 -
绕过逗号:对于
SUBSTR(str, 1, 1)这样的函数,可以使用SUBSTR(str FROM 1 FOR 1)的语法来避免逗号。对于LIMIT 0,1,则可以改写为LIMIT 1 OFFSET 0。
3. 编码与特殊字符
-
十六进制编码:当引号被过滤时,可以将字符串转换为十六进制。例如,查询
users表时,可以将"users"替换为0x7573657273,这样查询条件可写为table_name=0x7573657273,避免了使用引号。 -
宽字节注入:这种技巧主要针对使用
addslashes等函数对单引号进行转义(将'转为\'),且数据库连接使用GBK等宽字符集的情况。通过输入%df%27,%df会和转义符号\`(编码为%5c)结合成一个汉字“運”,从而使单引号%27`逃逸出来,造成注入。
🛡️ 实战思维:如何系统性地测试绕过方法
面对一道存在过滤的SQL注入题,可以遵循以下思路:
-
信息收集:首先判断注入类型(数字型/字符型)和存在的过滤规则。通过提交简单的
'、and 1=1、union select等 payload,观察服务器的返回错误信息或拦截提示,初步了解过滤器拦截了哪些关键词和字符。 -
模糊测试:系统地尝试各种绕过技巧。可以从简单的空格替代(如
/**/)和大小写变换开始,如果不行,再逐步尝试内联注释、编码等方式。 -
逐步构造:成功绕过对关键字的检测后,还需要处理语法细节。例如,如果
union select被成功绕过,但逗号被过滤,那么在联合查询中就需要使用JOIN语法或者FROM...FOR语法来替代。 -
自动化工具:
sqlmap这类工具内置了很多绕过脚本(tamper script),例如space2comment.py(空格替换为注释)、charencode.py(字符编码)等,可以在手动测试有思路后,利用工具提高效率。
💎 总结
SQL注入的绕过技术多种多样,其核心在于利用WAF/过滤器与应用后端SQL解析器之间的差异。防御方通常采用正则表达式进行模式匹配,而攻击者则通过变形、分割、编码等方式,使得恶意载荷在防御方看来是“正常”的,却能顺利被数据库解析执行
更多推荐
所有评论(0)