65.9K
CodeProject 正在变化。 阅读更多。
Home

SQL 注入知识

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.73/5 (21投票s)

2011年6月6日

CPOL

5分钟阅读

viewsIcon

43877

本文解释了SQL注入攻击、缓解策略以及测试时需要考虑的因素。

概述

SQL注入是一种利用SQL语句、欺骗数据库客户端数据的技术。攻击者试图欺骗应用程序(桌面和Web应用程序)中使用的SQL语句,以获取攻击者无权访问的数据库的全部或预期详细信息。为了获得这种未经授权的访问,攻击者试图在SQL命令行语句中输入错误或欺骗性的字符串输入,以查看或操纵受限数据。通过SQL注入攻击,攻击者不一定打算查看或操纵数据,但他们可能打算执行盲操作,例如创建用户、授予/撤销不同用户的权限等。

攻击是如何执行的

有许多SQL注入技术可用,它们因攻击者而异;然而,它们利用的功能或故障是相同的。它们通过Web URL或生成的错误消息来发现SQL查询中的漏洞。通常,开发人员使用由字符串组成的动态SQL语句,这些字符串被连接起来,或者查询参数直接与输入关键字一起指定。

例如

Select * from MyLoginAccounts whereloginname='arpit' 
         and loginID='123' and permission='admin'

当存在上述SQL语句时,存在被利用的很大可能性,因为开发人员将值直接传递到SQL语句中,如果黑客试图操纵上述语句以造成SQL注入攻击,则可以破解和操纵这些值,以提供包括密码和数据库权限在内的所有登录详细信息。因此,攻击者试图如下操纵上述SQL语句字符串:

Select * from MyLoginAccounts where loginname='arpit' or 
        '1'='1'—and loginID='123' and permission='admin'

通过传递另一个总是为真的参数,例如“or '1'='1'”,用户试图捕获系统中的所有记录。此外,为了阻止系统执行其他条件,攻击者使用“--”使后面的关键字看起来像注释语句。

这样,当攻击者将有缺陷的字符串传递给数据库查询时,无论原始查询如何,它都会向攻击者返回所有记录。因此,即使攻击者不是合法用户,他/她也可以访问数据库中的敏感信息。

攻击类别

1. 一阶攻击

在这种攻击中,攻击者输入恶意SQL字符串并尝试立即运行它以获取所需的信息。在这种攻击中,攻击者可能会在现有的SQL查询中添加一个子查询或联合语句,以非法购买信息。在这里,攻击者会以某种方式调整现有查询,以便在执行时,它只执行查询的预期部分;也就是说,在这种情况下,是添加的子查询或联合语句。

2. 二阶攻击

在这种攻击中,攻击者试图控制持久存储系统(如行),并在其上执行恶意活动。在这里,攻击者试图创建数据库对象,如表、受限视图,甚至登录帐户,这些帐户可以进一步用于执行危险攻击,如检索数据库模式、登录帐户详细信息、客户敏感信息等。

3. 横向注入

在这种攻击中,攻击者可以操纵隐式函数。例如,通过更改环境变量NLS_Date_FormatNLS_Numeric_Characters的值来操纵函数“To_Char()”。当字母“d”与字符串连接时,SQL默认调用内置函数To_Char。现在,当To_Char函数遇到连接到字符串的“d”时,它会将其转换为NLS_Date_Format指定的格式。攻击者所做的是更改环境变量NLS_Date_Format的值为您想要的,这反过来有助于进行横向攻击,因为攻击者注入NLS_Date_Format中的恶意值将被执行,而不是原始变量“d”。

如何避免SQL注入攻击

  1. 开发人员应仅通过PL/SQL API公开数据库。用户权限应仔细设置,以便客户端无法直接访问表和视图。
  2. 执行权限应**仅**授予有权执行DDL和DML操作的用户。
  3. 如果没有必要提升权限,程序应以调用者的权限执行。必须包含AUTHID CURRENT_USER子句才能执行以调用者权限执行的程序,以进一步避免SQL注入。
  4. 适当地选择权限,例如AUTHID CURRENT_USERAUTHID DEFINER
  5. 限制用户输入,例如使用受限的输入语言将用户限制在指定的网页,当参数将用作数字时不要指定VARCHAR2参数,如果您只需要正整数,则使用natural而不是数字。
  6. 开发人员应使用编译时固定的SQL语句文本。
  7. 如果不需要动态SQL,则应首选静态SQL,因为它减少了SQL注入的漏洞,并且其成功编译会创建模式对象依赖项,有助于提高整体性能。
  8. 所有输入值在放入代码执行数据库事务之前都应进行验证。

缓解策略

1. 使用绑定参数

使用SQL命令参数,而不是直接将文本值传递给输入字段。这将消除攻击,并有助于提高性能。

2. 避免使用连接输入的动态SQL

尽量避免连接输入,因为这会吸引攻击者,从而导致攻击。

3. 过滤和清理输入

创建查询过滤器,只传递预期的值,并过滤掉可能导致或吸引攻击的值。例如,DBMS_ASSERT包包含一些函数,可用于清理用户输入,并有助于防范使用连接输入值构建的动态SQL应用程序中的SQL注入。

4. 减少攻击面

对授予用户的权限与需求进行彻底分析。如果发现权限过多,则撤销这些权限,并只允许预期的权限。

测试SQL注入

  1. SQL错误消息应简洁,不应暴露任何元数据信息,如列表、视图名称等。
  2. 实现静态和动态测试方法,如代码走查、检查、同行评审等。
  3. 在连接到数据库的输入字段中提供随机输入,并观察错误输入生成的错误和错误消息。(模糊测试。)
  4. 执行静态代码分析。
  5. 单独测试每个输入参数,并在执行此操作时,将所有其他参数保留不变,并使用有效数据作为其参数。
© . All rights reserved.