您是否意识到 SQL 注入漏洞的威胁越来越大?2022 年第四季度,AppTrana 阻止了 1,111,548 次此类攻击。在短短三个月内阻止了超过一百万次 SQL 注入攻击,很明显 Web 应用程序正处于围攻之中。
现在如何保持领先地位并保护您的业务?这是了解此OWASP 前 10 大漏洞以及如何防止 SQL 注入攻击的指南。什么是数据库和SQL?数据库是一组描述的表,可以从中访问或存储数据。数据库应用程序需要前端和数据库之间的通信媒介。这就是 SQL 发挥作用的地方。
SQL注入代表什么?
攻击者使用 Web 应用程序中的输入字段在服务器上运行任意查询(注入)。因此,攻击过程称为 SQL 注入或 SQLi 攻击。
他们可以访问不打算显示的信息。这些注入攻击被 OWASP Top 10 归类为“高影响严重性”。
是什么导致 SQLi?
SQLi 的根本原因通常是未能正确清理用户输入。当应用程序允许用户在未经适当验证的情况下输入 SQL 语句时,攻击者可以使用其他命令制作 SQL 查询。它会导致未经授权的访问、数据修改或其他恶意行为。
例如,攻击者可以通过编写始终返回 true 的 SQL 查询来使用 SQL 注入来绕过身份验证机制。它允许他们在没有有效用户名和密码的情况下登录。或者他们可以使用 SQL 注入来修改存储在数据库中的数据、窃取敏感数据或执行其他恶意操作。
SQL注入如何工作?
下面是一个示例来说明 SQL 注入的工作原理:
假设我们有一个带有 SQL 数据库的网站来存储用户信息。该网站有一个登录表单,用户可以在其中输入用户名和密码。该网站的代码可能如下所示:
$password = $_POST['密码'];
$sql = “SELECT * FROM users WHERE username='$username' AND password='$password'”;
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
// 用户已成功登录
} else {
// 无效的用户名或密码
}
在这段代码中,用户的输入被直接插入到 SQL 语句中。如果用户输入用户名,如 admin'–,则 SQL 语句变为:
SELECT * FROM users WHERE username='admin'–' AND password=”
双破折号(–)是SQL中的注释符,表示忽略后面的所有内容。这允许攻击者绕过密码检查并以管理员身份登录。
攻击使用常见的 SQL 注入命令尝试 SQLi 的不同变体,以查看数据库执行了哪些命令。
基于此,他们不断执行 SQLi 攻击以访问所需的信息。他们可能会在收集到他们需要的东西后停止,或者继续回来执行他们的命令,直到这些漏洞存在。
SQL 注入攻击的类型有哪些?
基于错误的 SQL 注入
基于错误的 SQL 注入是一种攻击,恶意用户使用恶意 SQL 查询来获得某种错误或确认他们的输入存在问题。
它通常是关于数据库语法中的规则。然后他们可以使用这些信息从数据库中提取信息,例如密码或个人银行账户。
如何检测基于错误的 SQL 注入?
攻击者可以执行的 SQL 命令类型非常多,而且它们都非常难以预测。
以下是一些示例:单引号、双引号或 SQL 运算符,如 AND、OR 和 NOT
例如:
错误消息向攻击者致意:“你的 SQL 语法有错误;查看与您的 MySQL 服务器版本对应的手册,了解在 ''VALUE'' 附近使用的正确语法。
错误消息为他提供了重要信息,例如:
- 数据库用作MySQL
- 语法错误是双引号
- 导致错误的地方在参数的末尾
基于联合的 SQL 注入
在这种类型的 SQL 注入中,攻击者试图在“UNION”运算符的帮助下利用漏洞。
UNION 运算符用于组合 2 个表或同时执行 2 个选择查询。在联合运算符中,它们会删除我们尝试同时执行的重复行或列。
基于联合的 SQL 注入示例
假设我们有一个 Web 应用程序,它接受用户的输入并构建如下 SQL 查询:
用户输入没有经过适当的过滤,因此攻击者可以注入他们自己的 SQL 代码。例如,他们可以输入以下值作为他们的名字:
这将导致执行以下 SQL 查询:
注入字符串末尾的 — 是一个注释符号,它注释掉了原始查询的其余部分。因此,生成的查询将等效于:
UNION SELECT password, NULL, NULL FROM 用户
此查询将返回一个包含用户名、电子邮件和电话号码的表,以及一个包含用户表中所有密码的表。然后,攻击者可以使用此信息进一步破坏系统。
SQL 盲注
Blind SQLi 是一种 SQL 注入攻击,攻击者利用 Web 应用程序中的漏洞从数据库中提取敏感信息,而无法直接查看数据。这种类型的攻击称为“盲”攻击,因为攻击者看不到实际的数据库内容。而是依赖于应用程序的响应来推断信息。
SQL 盲注攻击主要有两种类型:
1. 基于布尔的 SQLi
2. 基于时间的 SQLi
基于布尔的 SQLi
在这种类型的 SQL 注入攻击中,攻击者发送一系列 SQL 查询,根据注入的代码是否成功执行来评估 true 或 false。然后,攻击者可以使用应用程序的响应,通过构建复杂的查询来探测特定信息,从而推断出有关数据库的信息。
基于布尔的 SQLi 示例:使用基于布尔的 SQLi 删除用户数据库
它是如何工作的:一个常见的在线商店的 SQL 数据库查询可能是这样的:
因此,在线商店中的产品 URL 可以是
http://www.exampleshop.com/items/items.asp?itemid=999 或 1=1。
SQL查询可以是
一永远等于一。这只是一个基本的数学事实,无论您身在何处都适用。SQL 查询返回数据库中的所有产品名称和描述,即使是那些您无权访问的产品。
基于时间的 SQLi
这种攻击涉及注入一个旨在导致应用程序响应延迟的查询。通过测量应用程序响应查询所需的时间,攻击者可以确定查询是否成功。当攻击者没有来自应用程序的答案(错误/输出),因为输入验证已被清理时,此技术很有用。
基于时间的 SQL 注入示例
例如,假设 Web 应用程序上有一个登录表单,它使用 SQL 查询来检查用户的凭据是否有效。查询可能看起来像这样:
要执行盲目 SQLi 攻击,攻击者可以注入如下查询:
如果条件“1=1”为真,此查询将使应用程序休眠 10 秒。攻击者可以通过测量应用程序响应此查询所花费的时间来确定条件是真还是假。
如果响应需要 10 秒,则攻击者知道条件为真,应用程序容易受到盲目 SQLi 的攻击。如果响应是立即的,攻击者就知道条件是错误的。一旦攻击者确认盲 SQLi 是可能的,他们就可以开始注入更复杂的查询以从数据库中提取敏感信息。
SQL 注入是如何由机器人驱动的?
- 自动扫描:机器人可以被编程为自动扫描许多网站,寻找可以被 SQL 注入攻击利用的漏洞。一旦识别出易受攻击的网站,机器人就可以尝试使用一组预定义的 SQL 注入有效负载来利用该漏洞。
- 暴力攻击:机器人也可用于对 Web 表单(例如登录页面或搜索框)进行暴力攻击,以尝试将 SQL 代码注入应用程序。机器人可以使用不同的技术(例如字典攻击或模糊测试)来生成不同的有效负载并将它们提交给应用程序以找到易受攻击的入口点。
- 自动利用:一旦确定易受攻击的入口点,机器人就可以自动注入恶意 SQL 代码并从数据库中提取数据。
僵尸程序可以使用不同的技术,例如 SQL 盲注或基于错误的 SQL 注入,从数据库中提取敏感数据。总的来说,机器人可用于自动化识别和大规模利用 SQL 注入漏洞的过程。它使攻击者更容易破坏许多网站并提取敏感数据。这就是为什么实施适当的安全措施以防止 SQL 注入攻击很重要的原因。
注入攻击的影响是什么?
- 窃取敏感数据:攻击者可以使用 SQL 注入从数据库中提取敏感数据,例如用户名、密码、信用卡号或个人信息。
- 修改或删除数据:攻击者可以使用SQL注入修改或删除数据库中的数据,从而导致数据丢失或损坏。
- 控制系统:攻击者可以使用 SQL 注入获得管理访问权限,从而允许他们执行进一步的攻击、安装恶意软件或将系统用于恶意目的。
SQL 注入攻击的潜在成本甚至更高。经济损失可能是直接的经济损失,例如遭受攻击后恢复系统和数据的成本。间接损失包括因业务运营中断而造成的收入损失。此外,企业还可能因注入攻击导致的数据泄露而面临经济处罚或法律诉讼。这尤其会损害处理敏感信息的企业,例如金融机构或医疗保健提供者。
此外,声誉受损可能是长期的且难以恢复,从而对公司未来的增长和盈利能力产生负面影响。常见的 SQL 注入攻击会导致知识丢失或拒绝访问。然而,多年来,黑客将这些攻击与不充分的身份验证、DNS 劫持、XSS 和DDoS 攻击相结合,造成了巨大的经济损失和绝对主机接管。停机会导致收入损失和客户失望,进一步损害企业声誉。
历史上最臭名昭著的 SQLi 攻击
- Heartland Payment Systems: 2010 年 3 月,Albert Gonzalez 被判处 20 年徒刑。他将自己的代码安装到 Heartland Payment Systems 的信用卡服务器中,并窃取了 1.3 亿个信用卡号码。该公司的攻击成本约为 1200 万美元。
- 索尼 PlayStation 网络黑客攻击: 2011 年,索尼 PlayStation 网络 (PSN) 遭到黑客攻击,导致 7700 万用户的个人信息丢失。据报道,这次黑客攻击是 SQL 注入攻击的结果。攻击者能够访问敏感信息,例如用户姓名、地址和信用卡号。
- Yahoo Hack: 2012 年 7 月,雅虎语音用户的 453,000 个电子邮件地址和密码被泄露。凭据以未加密的方式存储。黑客通过执行 SQL 注入攻击窃取了数据。
- Target 数据泄露: 2013 年,Target Corporation 成为大规模数据泄露的受害者,影响了 4000 万客户。专家声称服务器受到了 SQL 注入攻击。
- Drupal SQL 注入: 2014 年 10 月,Drupal 宣布其高度易受攻击。缺乏用户输入清理导致 SQL 注入漏洞。从 7.0 到 7.31 的 Drupal 核心版本容易受到攻击。
- Kaseye 勒索软件攻击: 2021 年 7 月,一个名为 REvil 的臭名昭著的组织影响了 Kaseya 管理的 1500 多家企业。黑客远程利用了 Kaseya VSA 服务器的 SQL 漏洞。
- WooCommerce 未经身份验证的 SQL 注入: 2021 年 7 月,WooCommerce 披露其多个功能插件和软件版本存在 SQL 注入漏洞;他们注意到在那段时间发生了几次安全攻击。
如何防范SQL注入攻击?
连续扫描和渗透测试
持续的 Web 应用程序扫描涉及定期运行自动漏洞扫描工具,以识别和评估系统中的任何潜在漏洞。渗透测试,也称为“笔测试”,涉及模拟对系统的攻击以识别和利用漏洞。通过定期执行这些测试,组织可以在攻击者利用它们之前快速识别并解决任何漏洞。开发人员可以遵循最佳实践指南并使用带有参数化输入的准备好的语句来防止 SQL 注入攻击。
限制权限
限制权限是防止SQL注入攻击影响的另一个重要措施。这涉及限制用户和应用程序对数据库及其组件的访问和权限。这样做会限制潜在的攻击面,并使攻击者更难利用漏洞。限制权限的一种方法是使用最小权限原则。它涉及仅向用户和应用程序提供执行其任务所需的最低访问权限和权限。这可以通过为不同的角色和职责创建单独的用户帐户来完成。并且还通过限制这些帐户对特定数据库对象和操作的权限。另一种限制权限的方法是使用安全框架,例如基于角色的访问控制 (RBAC)。它允许您定义用户角色并分配特定权限。简而言之,限制权限可以减少潜在的攻击面,并使攻击者更难利用漏洞。
使用查询参数
动态查询给安全专业人员带来了很多麻烦。他们必须处理每个应用程序中的可变漏洞,这些漏洞只会随着更新和更改而变得更加严重。建议准备参数化查询。查询参数是 SQL 查询中的占位符,其中填充了来自用户输入或其他来源的值。使用查询参数,您可以将用户输入与 SQL 查询分开,使攻击者更难注入恶意代码。
以下是使用查询参数的 SQL 查询示例:
$password = $_POST['密码'];
$query = “SELECT * FROM users WHERE username = :username AND password = :password”;
$stmt = $pdo->准备($query);
$stmt = bindParam(':用户名', $用户名);
$stmt->bindParam(':密码', $密码);
$stmt->执行();
在此示例中,使用查询参数 :username 和 :password 将 SQL 查询与用户输入分开。然后将这些参数的值分别传递给 bindParam() 函数,该函数在执行查询之前将值绑定到参数。这些查询简单、易于编写,并且只有在 SQL 代码中的每个参数都被明确定义时才会通过。这样,您的信息会随武器一起提供,以区分代码和信息输入。
使用 Web 应用程序防火墙
大多数组织都会遇到过时的代码、缺乏用于测试和进行更改的资源、不了解应用程序安全性以及应用程序中的频繁更新等问题。对于这些,Web 应用程序保护是最好的解决方案。可以部署托管 Web 应用程序防火墙 (WAF) 以立即缓解此类 攻击。 它可以在恶意流量到达 Web 应用程序之前检测并阻止它。WAF 可以配置为检测和阻止已知的 SQL 注入负载。
WAF 可以分析传入流量的行为并查找指示 SQL 注入攻击的模式。例如,它可以查找在短时间内重复提交 SQL 代码的尝试或异常活动。它包含自定义策略以阻止不符合应用程序安全策略的流量。这样,您就不必手动查找漏洞并在事后修复问题。即使代码更改很小,引入注入问题也很常见。因为此类更改可能不会在开发周期中经过全面的安全审查流程。当无法及时修复检测到的漏洞代码时, 部署后 可以使用WAF进行虚拟补丁。