[ 首页 ] [ 渗透测试 ] [ 黑客接单 ] [ 黑客技术 ] [ 黑客论坛 ] [ 黑客松 ]



标题 : SQL 注入攻击:它是如何工作的以及 4 项预防措施
作者: Evil octal
日期 : 2023-07-17

什么是 SQL 注入攻击?

9.5 分钟阅读

SQL注入是一种网络攻击,它将恶意代码插入到SQL语句中,从而操纵该语句的执行,从而获得对敏感数据的未经授权的访问或执行恶意操作。

它利用应用程序输入验证过程中的漏洞,允许攻击者执行任意 SQL 命令并操纵数据库。这可能会导致数据被盗、修改或破坏,从而可能对组织造成重大损害。

这是有关网络安全攻击的系列文章的一部分。

在本文中:

  • SQL 注入攻击如何运作?
  • SQL 注入攻击示例
    • Java SQL注入
    • C# SQL注入
  • SQL注入攻击防护与预防
    • 准备好的报表
    • 存储过程
    • 最小特权原则
    • 允许列表输入验证

SQL 注入攻击如何运作?

SQL 注入攻击通过利用应用程序输入验证过程中的漏洞进行攻击。它通常是这样工作的:

  • 攻击者制作恶意输入,例如通过 Web 表单或 URL 参数。
  • 应用程序接受此输入并将其作为数据库 SQL 查询的一部分执行。
  • 如果应用程序没有正确验证或清理输入,攻击者就可以操纵查询来执行意外的操作。
  • 攻击者可以使用受操纵的查询来访问敏感数据、修改数据或删除数据,具体取决于应用程序在数据库上拥有的权限级别。

例如,考虑一个搜索表单,它接受用户的输入并执行 SQL 查询以根据用户的搜索条件从数据库中检索数据。如果应用程序未正确验证或清理用户的输入,攻击者可能会输入恶意输入来操纵 SQL 查询并允许他们访问敏感数据或修改数据库。

SQL 注入攻击示例

Java SQL注入

考虑以下 Java 代码片段,该代码片段容易受到 SQL 注入攻击:

String query = “SELECT * FROM users WHERE username='” + request.getParameter(“用户名”) + “‘ AND 密码='” + request.getParameter(“password”) + “‘”;

ResultSet resultSet = statements.executeQuery(query);

如果攻击者输入以下内容作为用户名参数:

‘ 或 ‘1’=’1

结果查询将如下所示:

SELECT * FROM 用户,其中用户名=” OR ‘1’=’1′ AND 密码=”

攻击者已成功绕过身份验证,并将能够访问敏感信息。

代码的安全版本将使用参数化查询和PreparedStatements:

字符串查询=“SELECT * FROM users WHERE username=? AND password=?”;

准备语句准备语句 = 连接.准备语句(查询);

preparedStatement.setString(1, request.getParameter(“用户名”));

preparedStatement.setString(2, request.getParameter(“密码”));

ResultSet resultSet = preparedStatement.executeQuery();

在此示例中,用户输入作为单独的参数传递并被正确转义,从而防止执行任何恶意代码。

C# SQL注入

以下是构造并执行 SQL 查询以根据指定条件搜索项目的 C# 代码示例:

使用 (SqlConnection 连接 = new SqlConnection(connectionString))

{

    连接.Open();

    字符串搜索术语=“苹果”;

    string sql = “从产品中选择 * WHERE ProductName LIKE @SearchTerm”;

    使用 (SqlCommand 命令 = new SqlCommand(sql, 连接))

    {

        command.Parameters.AddWithValue(“@SearchTerm”, “%” + searchTerm + “%”);

        使用 (SqlDataReader reader = command.ExecuteReader())

        {

            while (读者.Read())

            {

                Console.WriteLine(reader[“产品名称”] + ” | ” + reader[“描述”] + ” | ” + reader[“价格”]);

            }

        }

    }

}

在此示例中,代码使用 SqlConnection 对象连接到数据库并打开连接。搜索项存储在变量 searchTerm 中。SQL 查询是使用 SqlCommand 类构造的,该类将 SQL 字符串和 SqlConnection 对象作为参数。 


该查询使用参数化查询,并使用Parameters 集合的AddWithValue 方法将搜索项添加到SqlCommand 对象中。该查询是使用 ExecuteReader 方法执行的,该方法返回一个 SqlDataReader 对象。然后,代码循环访问查询返回的行,并输出每件商品的产品名称、描述和价格。

SQL注入攻击防护与预防

虽然很难完全防止 SQL 注入攻击,但以下措施可以显着降低应用程序的风险。

准备好的报表

准备好的语句是一种防止 SQL 注入攻击的方法。它们允许程序员提前定义参数化查询,然后提供运行时查询中使用的数据。然后,数据库将数据与查询分离,这有助于防止任何恶意输入被解释为 SQL 命令的一部分。

与连接查询字符串和输入数据相比,这是一种更安全的执行动态 SQL 查询的方法,后者容易受到 SQL 注入攻击。通过使用准备好的语句,可以降低 SQL 注入的风险,因为输入数据被视为与 SQL 查询分开,并且数据库可以正确处理任何特殊字符或转义序列。

存储过程

存储过程是存储在数据库中的预编译的 SQL 语句集,可以作为单个可执行单元进行调用。当执行存储过程时,数据库首先编译该过程,然后执行编译后的代码。这意味着存储过程中的任何动态 SQL 语句仅在首次创建存储过程时解析和优化一次,而不是每次执行该过程时。

存储过程针对 SQL 注入提供了额外的安全层,因为存储过程中的 SQL 语句受到保护,不会被最终用户篡改。此外,存储过程可以强制执行一组特定的业务规则,从而降低执行恶意 SQL 语句的风险。

最小特权原则

最小权限原则是一个安全概念,规定应用程序应仅具有执行其预期功能所需的最低权限。在 SQL 注入攻击的背景下,这意味着在与数据库交互时限制应用程序的权限,以降低攻击者使用 SQL 注入执行恶意操作的风险。

应用程序应设计为只能访问它们所需的资源。例如,应用程序可以配置为执行 DML 语句但不执行 DDL 语句,或者以只读权限执行。这种受限权限可以帮助防止攻击者修改数据库结构或执行恶意 SQL 语句。

允许列表输入验证

白名单输入验证是一种通过检查输入数据以确保其有效和允许来防止 SQL 注入攻击的方法。此方法涉及定义一组可接受的输入(也称为“允许列表”),并且仅接受满足允许列表中的标准的数据。任何与允许列表不匹配的输入都会被拒绝。

例如,如果搜索字段仅允许字母数字字符和空格,则任何包含特殊字符或转义序列的输入都将被拒绝。这有助于防止恶意代码被解释为 SQL 语句的一部分,从而降低 SQL 注入的风险。

允许名单与拒绝名单

与拒绝列表输入验证相比,允许列表输入验证提供了更安全的输入验证方法,其中定义了不可接受的输入列表并接受所有其他输入。拒绝列表验证的问题在于,攻击者可以通过使用不在拒绝列表中的输入轻松绕过验证。

通过使用白名单输入验证,可以降低 SQL 注入的风险,因为应用程序不会处理与可接受值不匹配的恶意输入。这有助于防止攻击者将恶意代码插入 SQL 语句并执行未经授权的操作。

但是,重要的是要使允许列表保持最新且全面,以确保它涵盖所有可能的合法输入值,否则可能会导致误报结果或阻止处理合法输入。

使用 LvBug 预防 SQL 注入攻击

道德黑客的漏洞搜寻将发现许多用于提供 SQL 注入攻击的应用程序缺陷。LvBuG 攻击抵抗平台提供持续、主动的应用程序安全性,可以立即联系安全专家,他们从对抗的角度接近您的攻击面,从而在网络犯罪分子之前发现弱点。