首页 / 教程列表 / C#+ADO.NET数据库入门教程 / 什么是SQL注入攻击?

什么是SQL注入攻击?

1145 1 评论 更新于: 2021-10-20 读完约需 6 分钟

概述

在使用程序对数据进行交互时,对数据操作的安全性永远是最重要的事情,这里说的安全,既要考虑程序自身逻辑对数据操作的安全性,又要防止被人攻击的安全。

如果程序中未加防范,稍有不慎就会被攻击者利用导致严重后果,比如本文要分享的SQL注入攻击

什么是SQL注入攻击?

SQL注入是一种用于攻击数据驱动应用程序的代码注入技术,用于攻击数据驱动的应用程序,攻击者将恶意SQL语句插入到输入字段中执行(例如将数据库内容转储给攻击者),SQL注入必须利用应用程序软件中的安全漏洞。

无论是在桌面应用程序还是在Web应用程序中(后者居多),如果用户在应用程序中的输入没有被正确地验证和处理,攻击者可以使用SQL注入来获得对相关应用程序数据存储的访问。

SQL注入是最常见的网络黑客技术之一。

SQL注入攻击分类

攻击者通常使用SQL注入通过用户输入来渗透web应用程序。这包括用户名、用户id、姓名等的表单输入。

如果在接受这些输入之前没有对其进行验证和清理,或者大量使用参数化SQL语句,攻击者就可能通过该输入传递SQL语句,而这些SQL语句在数据库中是合法的且可以运行的。

在不同的情况下,会出现各种各样的SQL注入漏洞、攻击和技术。一些常见的SQL注入示例包括:

  • 检索隐藏数据:修改SQL查询以返回额外的结果
  • 破坏程序逻辑:更改查询以干扰应用程序的逻辑
  • UNION查询攻击:从不同的数据库表检索数据
  • 检查数据库:提取关于数据库的版本和结构的信息
  • 盲注:查询结果不能在应用程序的响应中返回,而是需要利用一些方法进行判断或者尝试

检索隐藏数据

比如,某网上商城有按不同产品类别展示的产品列表,当用户点击Phone这个分类时,浏览器将跳转到如下地址:

https://www.xxx.com/products?category=Phone

这将导致应用程序执行SQL查询,从数据库检索相关产品的详细信息:

SELECT * FROM products WHERE category = 'Phone' AND released = 1

这条SQL语句要求数据库执行如下步骤:

  • 从数据表products检索
  • 返回所有列(*)
  • 查询条件1:category=’Phone’
  • 查询条件2: released=1

其中,released=1在程序设计中用来隐藏那些还未发布的产品,比如released=0表示产品未发布。

现在,有攻击者捕获到了以上的产品列表链接,并构造SQL注入的请求链接:

https://www.xxx.com/products?category=Phone'--

程序的SQL查询语句将变成如下:

SELECT * FROM products WHERE category = 'Phone'--' AND released = 1

这里的关键是双破折号——(在SQL中是注释指示符),这意味着查询的其余部分被解释为注释。这有效地删除了查询的剩余部分,因此,查询条件不再包含AND released = 1,这意味着显示所有产品,包括未发布的产品。

更进一步,攻击者可以使应用程序显示任何类别中的所有产品,包括他们不知道的类别,请求地址如下:

https://www.xxx.com/products?category=Phone'+OR+1=1--

程序的SQL查询语句将变成如下:

SELECT * FROM products WHERE category = 'Phone' OR 1=1--' AND released = 1

修改后的查询将返回category='Phone1=1的所有数据。由于1=1始终为真,因上,查询将返回products数据表中所有记录。

破坏程序逻辑

假如有一个允许用户使用用户名和密码登录的应用程序。如果用户提交的用户名为admin,密码为password,应用程序将通过执行以下SQL查询检查凭据:

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

如果查询返回用户的详细信息,则登录成功。否则,将被登录失败。

在这里,攻击者可以像任何用户一样不带密码登录,只需使用SQL注释——从查询的WHERE子句中删除密码检查。例如,提交用户名admin'--和一个空密码将导致以下查询:

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

此查询返回用户名为admin的用户,但并未检查密码,因为密码被双破折号注释掉了。

UNION查询攻击

如果SQL查询的结果是在应用程序的响应中返回的,则攻击者可以利用SQL注入漏洞从数据库中的其他表检索数据。这是使用UNION关键字完成的,它允许你执行一个额外的SELECT查询并将结果附加到原始查询。

例如,如果应用程序执行以下查询,其中包含用户输入Phone

SELECT name, description FROM products WHERE category = 'Phone'

攻击者执行以下攻击输

' UNION SELECT username, password FROM users--

这将导致应用程序返回所有用户名和密码以及产品的名称和描述。

检查数据库攻击

在初步识别SQL注入漏洞之后,获取有关数据库本身的一些信息通常是有用的。这些信息通常可以为进一步攻击铺平道路。

你可以查询数据库的详细版本信息。完成此操作的方法取决于数据库类型,因此可以从任何有效的技术推断数据库类型。例如,在Oracle上可以执行:

SELECT * FROM v$version

还可以确定存在哪些数据库表,以及它们包含哪些列。例如,在大多数数据库上,可以执行以下查询来列出表:

SELECT * FROM information_schema.tables

盲注

许多SQL注入实例都是盲目的漏洞。这意味着应用程序不会返回SQL查询的结果或响应中任何数据库错误的详细信息。仍然可以利用盲性漏洞访问未经授权的数据,但所涉及的技术通常更复杂,执行起来也更困难。

盲注,就是在服务器没有错误回显的时候完成的注入攻击。服务器没有错误回显,对于攻击者来说缺少了非常重要的“调试信息”。

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

发表评论

登录用户才能发表评论, 请 登 录 或者 注册

热门评论(1)

刘棋 (2023-09-18)

讲得好!希望能够坚持下去

  • 感谢您的支持~~~

    Rector · 2023-09-18