12月 14th, 2021

SQL 注入,也称为 SQLI,是一种常见的攻击媒介,它使用恶意 SQL 代码进行后端数据库操作来访问不打算显示的信息。此信息可能包括任意数量的项目,包括敏感的公司数据、用户列表或私人客户详细信息。

SQL 注入对业务的影响是深远的。一次成功的攻击可能会导致未经授权查看用户列表、删除整个表,在某些情况下,攻击者可能会获得对数据库的管理权限,所有这些都会对企业造成极大危害。

在计算 SQLi 的潜在成本时,重要的是要考虑到电话号码、地址和信用卡详细信息等个人信息被盗时客户信任度的损失。

虽然此向量可用于攻击任何 SQL 数据库,但网站是最常见的目标。

什么是 SQL 查询

SQL 是一种标准化语言,用于访问和操作数据库,为每个用户构建可定制的数据视图。SQL 查询用于执行命令,例如数据检索、更新和记录删除。不同的 SQL 元素执行这些任务,例如,基于用户提供的参数使用 SELECT 语句检索数据的查询。

典型的 eStore 的 SQL 数据库查询可能如下所示:

选择项目名称,项目描述

发件人

WHERE ItemNumber = ItemNumber

从中,Web 应用程序构建一个字符串查询,该查询作为单个 SQL 语句发送到数据库:

sql_query=”

选择项目名称,项目描述

发件人

WHERE ItemNumber = ” & Request.QueryString(“ItemID”)

用户提供的输入 http://www.estore.com/items/items.asp?itemid=999 然后可以生成以下 SQL 查询:

选择项目名称,项目描述

发件人

WHERE ItemNumber = 999

从语法中可以看出,此查询提供了物料编号 999 的名称和描述。

SQL 注入的类型

SQL 注入通常分为三类:带内 SQLi(经典)、推理 SQLi(盲)和带外 SQLi。您可以根据 SQL 注入类型用于访问后端数据的方法及其潜在损害进行分类。

带内 SQLi

攻击者使用相同的通信渠道发起攻击并收集结果。带内 SQLi 的简单性和效率使其成为最常见的 SQLi 攻击类型之一。此方法有两个子变体:

基于错误的 SQLi — 攻击者执行导致数据库产生错误消息的操作。攻击者可能会使用这些错误消息提供的数据来收集有关数据库结构的信息。

基于联合的 SQLi——该技术利用了 UNION SQL 运算符,它融合了数据库生成的多个选择语句以获得单个 HTTP 响应。此响应可能包含攻击者可以利用的数据。

推理(盲)SQLi

攻击者将数据负载发送到服务器并观察服务器的响应和行为以了解有关其结构的更多信息。这种方法被称为盲SQLi,因为数据没有从网站数据库传输给攻击者,因此攻击者无法在带内看到有关攻击的信息。

SQL 盲注依赖于服务器的响应和行为模式,因此它们通常执行速度较慢,但​​可能同样有害。SQL 盲注可以分为以下几类:

布尔值——攻击者向数据库发送 SQL 查询,提示应用程序返回结果。结果将根据查询是真还是假而有所不同。根据结果​​,HTTP 响应中的信息将修改或保持不变。然后,攻击者可以确定消息生成的结果是真还是假。

基于时间——攻击者向数据库发送 SQL 查询,这使数据库等待(以秒为单位的一段时间)才能做出反应。攻击者可以从数据库响应的时间中看出查询是真还是假。根据结果​​,将立即或在等待一段时间后生成 HTTP 响应。因此,攻击者可以确定他们使用的消息是返回 true 还是 false,而无需依赖数据库中的数据。

带外 SQLi

只有在 Web 应用程序使用的数据库服务器上启用了某些功能时,攻击者才能执行这种形式的攻击。这种形式的攻击主要用作带内和推理 SQLi 技术的替代方法。

当攻击者无法使用同一通道发起攻击并收集信息时,或者当服务器太慢或不稳定而无法执行这些操作时,会执行带外 SQLi。这些技术依赖于服务器创建 DNS 或 HTTP 请求以将数据传输给攻击者的能力。

SQL注入示例

希望执行 SQL 注入的攻击者操纵标准 SQL 查询来利用数据库中未经验证的输入漏洞。可以通过多种方式执行此攻击向量,此处将展示其中几种方式,以便您大致了解 SQLI 的工作原理。

例如,上述用于提取特定产品信息的输入可以更改为 http://www.estore.com/items/items.asp?itemid=999 或 1=1。

结果,相应的 SQL 查询如下所示:

选择项目名称,项目描述

来自项目

WHERE ItemNumber = 999 OR 1=1

并且由于语句 1 = 1 始终为真,因此查询将返回数据库中的所有产品名称和描述,甚至那些您可能没有资格访问的产品名称和描述。

攻击者还能够利用错误过滤的字符来更改 SQL 命令,包括使用分号分隔两个字段。

比如这个输入 http://www.estore.com/items/iteams.asp?itemid=999; DROP TABLE 用户 将生成以下 SQL 查询:

选择项目名称,项目描述

来自项目

WHERE ItemNumber = 999; 删除表用户

因此,可能会删除整个用户数据库。

另一种操作 SQL 查询的方法是使用 UNION SELECT 语句。这结合了两个不相关的 SELECT 查询以从不同的数据库表中检索数据。

例如,输入 http://www.estore.com/items/items.asp?itemid=999 UNION SELECT user-name, password FROM USERS 生成以下 SQL 查询:

选择项目名称,项目描述

来自项目

WHERE ItemID = ‘999’ UNION SELECT Username, Password FROM Users;

使用 UNION SELECT 语句,此查询将对项目 999 的名称和描述的请求与另一个为数据库中的每个用户提取名称和密码的请求组合在一起。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注