SQL注入攻击:注释符号(# --)详解与防范 网络安全必读


SQL 注入中的注释使用

SQL 语言允许使用注释,就像其他编程语言一样。注释通常用于记录查询中的某些部分或忽略查询的一部分。

在 SQL 注入攻击中,注释符号常常被用来绕过某些查询条件,或隐藏注入代码的部分内容。

常见的注释符号

在 MySQL 中,注释符号主要有两种形式:

  1. 单行注释:
    使用 -- 作为注释符号。注意,两个破折号后面必须有一个空格,才能正确开始注释。例如:

    mysql> SELECT username FROM logins; -- 从 logins 表中选择用户名
    

    这里 -- 后面跟着空格,表示从该位置开始注释,查询后部分不会被执行。

  2. 另一种单行注释:
    使用 # 符号,效果与 -- 相同。这是另一种常见的注释形式:

    mysql> SELECT * FROM logins WHERE username = 'admin'; # 你可以在这里添加任何内容,AND password = 'something'
    
URL 编码中的注释

在浏览器的 URL 中,如果要使用 # 作为注释符号,浏览器通常将其视为锚点(fragment identifier),而不是 URL 的一部分。为了在 URL 中正确传递注释符号,必须使用 URL 编码。

  • # 符号在 URL 中需要编码为 %23,例如:

    http://example.com/?username=admin%23password
    

    这样,URL 中的 # 符号不会被浏览器处理为锚点,而会被作为查询的一部分传递到服务器,服务器会将其视为注释,忽略后面的部分。

SQL 注释的实际应用

在 SQL 查询中,注释可以用于忽略部分查询语句。例如,以下查询将密码条件 AND password = 'something' 注释掉:

SELECT * FROM logins WHERE username = 'admin'; -- AND password = 'something'

在这种情况下,查询将仅返回 username = 'admin' 的记录,忽略密码条件。

提示注意:
  • 在 URL 中使用 # 注释: 如果您在浏览器中输入有效的负载,# 符号通常会被视为 URL 标签的一部分,并不会作为 URL 查询的一部分传递。为此,您可以使用 %23 来 URL 编码 # 符号。
  • 注意:在 SQL 中,仅使用两个破折号不足以开始注释。因此,它们后面必须有一个空格,因此注释以 (-- ) 开头,末尾有一个空格。这有时被 URL 编码为 (–+),因为 URL 中的空格被编码为 (+)。为了清楚起见,我们将在末尾 (-- -) 添加另一个 (-),以显示空格字符的使用。

通过这种方式,服务器在执行 SQL 查询时,将忽略注释符号后面的部分。例如,在注释掉 AND password = 'something' 后,查询结果将只返回与用户名匹配的记录,而不会考虑密码条件。


案例1:

SELECT * FROM logins WHERE username='admin'-- ' AND password = 'something';

从语法高亮中我们可以看到,用户名现在是admin,查询的其余部分现在被忽略为注释。此外,通过这种方式,我们可以确保查询没有任何语法问题。

admin’-- 让我们尝试在登录页面上使用这些,并使用用户名和任何内容作为密码登录:

如我们所见,我们能够绕过身份验证,因为新修改的查询会检查用户名,而不需要其他条件。

案例2:

上述查询确保用户的 ID 始终大于 1,这将阻止任何人以管理员身份登录。此外,我们还看到密码在查询中使用之前已进行哈希处理。这将阻止我们通过密码字段进行注入,因为输入已更改为哈希值。

让我们尝试使用有效的凭据登录admin / p@ssw0rd以查看响应。

括号有效失败

正如预期的那样,尽管我们提供了有效的凭据,但登录仍然失败,因为管理员的 ID 等于 1。因此,让我们尝试使用另一个用户的凭据登录,例如tom

tom_login

以 id 不等于 1 的用户身份登录成功。那么,我们如何以管理员身份登录?从上一节关于注释的内容中我们知道,我们可以使用它们来注释掉查询的其余部分。因此,让我们尝试使用作为admin'-- 用户名。

括号错误

由于语法错误,登录失败,因为闭合的括号与开的括号不匹配。要成功执行查询,我们必须添加一个闭合的括号。让我们尝试使用用户名admin')-- 来闭合并注释掉其余部分。

括号成功

查询成功,我们以管理员身份登录。我们输入的最终查询结果是:

SELECT * FROM logins where (username='admin')

-- - 注释案例详解

在SQL注入语句中,最后的 -- - 是用来注释掉后续的SQL代码,常用于绕过验证或者破坏查询逻辑。

SQL注释的解释

在SQL中,-- 是单行注释的标记,它表示从 -- 开始的部分到行末都将被忽略。这意味着攻击者可以通过在SQL查询中插入 -- 来注释掉查询中的其余部分,使得数据库只执行攻击者希望的部分。

解析注入语句:admin' or '1'='1'-- -

假设这是在一个登录页面的SQL查询中输入的用户名字段:

SELECT * FROM users WHERE username = 'admin' or '1'='1'-- -' AND password = 'password';

1. admin'
  • 这个部分是注入的用户名,它首先关闭了查询中原本用来包围用户名的单引号 '
2. or '1'='1'
  • 这是攻击者用来绕过验证的部分。'1'='1' 始终为真,所以这个条件会使得查询结果总是返回有效的记录,即使密码不正确也能登录。
3. -- -
  • -- 是SQL注释符号,后面的所有内容都会被忽略。
  • -- 后的 - 是多余的符号,一些数据库系统要求 -- 后面有空格或符号以确保它是一个有效的注释标记。所以,这里的 - 是冗余的,但它仍然有效,不会影响注释的作用。
结果

最终,SQL查询会被数据库执行为:

SELECT * FROM users WHERE username = 'admin' or '1'='1'-- -' AND password = 'password';

由于 -- 后面的部分被注释掉,查询实际上只会执行:

SELECT * FROM users WHERE username = 'admin' or '1'='1';
  • or '1'='1' 始终为真,因此查询会返回数据库中符合条件的任何记录(通常是第一个记录)。
  • 密码的部分被注释掉,查询中的 AND password = 'password' 被忽略了,因此不再用于验证密码。
总结
  • -- 用于注释SQL查询中的后续内容。
  • -- - 在这个语句中,-- 是有效的注释符号,而 - 只是一个多余的字符,不影响注释功能,仍然会注释掉剩余的查询部分。
  • 攻击者利用 -- 注释符号可以绕过密码验证,只要 OR 1=1 这一条件为真,查询就会成功执行。

网络安全学习资源分享:

给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

因篇幅有限,仅展示部分资料,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,请看下方扫描即可前往获取

👉1.成长路线图&学习规划👈

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

在这里插入图片描述
在这里插入图片描述

👉2.网安入门到进阶视频教程👈

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。(全套教程扫描领取哈)
在这里插入图片描述
在这里插入图片描述

👉3.SRC&黑客文档👈

大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录

SRC技术文籍:
在这里插入图片描述
黑客资料由于是敏感资源,这里不能直接展示哦! (全套教程扫描领取哈)

👉4.护网行动资料👈

其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!
在这里插入图片描述

👉5.黑客必读书单👈

在这里插入图片描述

👉6.网络安全岗面试题合集👈

当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。
在这里插入图片描述

所有资料共282G,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,可以扫描下方二维码或链接免费领取~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值