【SQL知识】SQL注入中-- +和#的区别

目录

1. 基本概念对比

2. 实际 SQL 注入示例

(1)原始 SQL 语句

(2)使用 --+ 注释

(3)使用 # 注释

3. 关键区别图示

4. 如何选择?

5. 总结

1. 基本概念对比

特性 -- +(或 -- #(或 %23
注释类型 SQL 标准注释 MySQL 特有注释
是否需要空格 需要(+ 代替空格) 不需要
URL 编码 --%20(空格编码) %23
适用数据库 MySQL、Oracle、SQL Server、PostgreSQL 主要 MySQL
浏览器处理 无特殊含义 # 可能被当作 URL 锚点

2. 实际 SQL 注入示例

(1)原始 SQL 语句

SELECT * FROM users WHERE user='admin' AND password='123456';

攻击者希望绕过密码验证,构造 ' OR 1=1 -- +' OR 1=1 #


(2)使用 --+ 注释

SELECT * FROM users WHERE user='admin' OR 1=1 -- +' AND password='123456';

【SQL知识】SQL注入中-- +和#的区别_第1张图片

执行效果

  • -- + 后面的内容被注释掉,相当于:

    SELECT * FROM users WHERE user='admin' OR 1=1;

  • 返回所有用户数据(因为 1=1 恒真)。

适用场景

  • 适用于大多数数据库(MySQL、Oracle、SQL Server 等)。

  • + 在 URL 中会被解码为空格,避免空格被过滤。


(3)使用 # 注释

SELECT * FROM users WHERE user='admin' OR 1=1 #' AND password='123456';

【SQL知识】SQL注入中-- +和#的区别_第2张图片

执行效果

  • # 后面的内容被注释掉,相当于:

    SELECT * FROM users WHERE user='admin' OR 1=1;

  • 同样返回所有用户数据。

适用场景

  • 仅适用于 MySQL(其他数据库可能不支持 #)。

  • 在 URL 中需要编码为 %23,否则浏览器会忽略 # 后面的内容。


3. 关键区别图示

原始 SQL:
SELECT * FROM users WHERE id='1' AND password='xxx'
​
注入 `--+`:
SELECT * FROM users WHERE id='1' OR 1=1 -- +' AND password='xxx'
                       ↑有效查询↑       ↑被注释掉↑
​
注入 `#`:
SELECT * FROM users WHERE id='1' OR 1=1 #' AND password='xxx'
                       ↑有效查询↑      ↑被注释掉↑

4. 如何选择?

情况 推荐使用 原因
不确定数据库类型 -- +--%20 兼容性更好,适用于 MySQL、Oracle、SQL Server 等
MySQL 环境 #%23 更简洁,但需确保 # 不会被浏览器或 WAF 拦截
空格被过滤 -- ++代替空格) 避免直接使用空格,提高绕过成功率
-- 被拦截 #%23 备选方案,但仅限 MySQL

5. 总结

  • -- +:通用性强,适用于大多数数据库,+ 代替空格避免过滤。

  • #:仅适用于 MySQL,在 URL 中需编码为 %23

  • 实际渗透测试时:先尝试 -- +,如果被拦截再换 # 或其他注释方式(如 /* */)。

你可能感兴趣的:(SQL知识,web安全,漏洞挖掘,sql,数据库)