概述
在使用程序对数据进行交互时,对数据操作的安全性永远是最重要的事情,这里说的安全,既要考虑程序自身逻辑对数据操作的安全性,又要防止被人攻击的安全。
如果程序中未加防范,稍有不慎就会被攻击者利用导致严重后果,比如本文要分享的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='Phone
或1=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)
讲得好!希望能够坚持下去