什么是 SQL 注入? 如何防止 SQLi 攻击
已发表: 2023-09-15Web 应用程序日复一日地为我们的在线体验提供动力。 我们使用网络应用程序进行联系、互动、购物和观看有趣的猫咪视频。 它们提供重要的业务服务并保存敏感数据,但我们使用的东西越多,它就越容易受到攻击。
针对利用结构化查询语言 (SQL) 漏洞的应用程序,需要警惕的一种网络攻击是常见且危险的 SQL 注入。
什么是SQL注入?
SQL 注入 (SQLi) 是网络攻击者用来利用 Web 应用程序中的漏洞的有害代码注入技术。 他们利用这些弱点,通过向数据库查询添加一串恶意代码来获得未经授权的访问。
SQL 注入攻击会导致不当的数据访问、操纵、身份盗窃、财务损失、声誉损害和法律后果。 开发人员和组织必须了解其风险并实施全面的安全措施。 Web 应用程序防火墙 (WAF) 软件和数字取证软件等工具旨在防范 SQL 注入攻击。 企业还可以依靠全面的网站安全套件来保护他们的应用程序。
阅读此 SQL 注入备忘单,了解 SQL 攻击是如何执行的,并提供示例、它们的变体以及如何防止此类攻击。
为什么 SQL 注入攻击很危险?
SQL 注入多年来一直位列开放全球应用程序安全项目 (OWASP) 的 Web 应用程序安全风险前 10 名。 仅在 2022 年,OWASP 就在他们测试的应用程序中发现了 274,000 多次某种形式的注入; SQL 注入和跨站脚本 (XSS) 是最常见的。
攻击者可以使用 SQl 注入来导致:
- 由于修改或删除数据库中的信息而导致Web 应用程序出现错误。
- 如果黑客未经授权访问数据库中存储的敏感数据(例如个人信息、财务记录或密码),则数据泄露。
- 通过访问使用相同共享数据库的其他未经授权的系统来破坏系统。 这使得攻击者能够将攻击升级到同一网络上的其他系统或执行分布式拒绝服务 (DDoS)。
这些破坏性行为对企业造成不可挽回的损害。 这些犯罪行为损害了隐私和数据完整性,导致客户信任和商业声誉丧失。 这也给公司处理善后工作增加了财务负担。
现实生活中的 SQL 注入攻击示例
自 SQL 注入首次出现以来已有二十多年了。 二十年后,它仍然臭名昭著,以下著名的 SQL 注入事件就证明了这一点。
- Heartland Payments Systems:2008 年,Heartland Payments Systems 遭受了历史上最大的数据泄露事件之一,通过 SQLi 攻击暴露了超过 1.3 亿信用卡和借记卡详细信息。 Heartland 支付了数百万美元的罚款。
- 雅虎:2012 年,一次 SQL 注入攻击泄露了近 500 万雅虎用户的帐户详细信息,包括电子邮件地址和密码。
- Freepik:2020 年,黑客在针对 Freepik 和 Flaticon 网站的 SQL 注入攻击中窃取了 830 万 Freepik 和 Flaticon 用户的电子邮件和密码。
- WooCommerce:流行的 WordPress 插件修复了一个 SQL 注入漏洞,该漏洞使 500 万个网站面临数据被盗的风险。
- BillQuick:网络犯罪分子利用流行计费平台中的盲目 SQL 漏洞来传播勒索软件。
- MOVEit:2023 年 5 月,Cl0p 勒索软件团伙利用托管文件传输软件工具 MOVEit 中的 SQL 注入漏洞,影响了 1000 多个组织和至少 6000 万人,成为当年迄今为止最大规模的数据泄露事件。
SQL注入攻击是如何运作的?
让我们看一下现代 Web 应用程序中使用的数据库和 SQL 查询的基础知识。 这将帮助我们更好地理解 SQL 注入的内部工作原理。
所有网站都使用关系数据库(也称为 SQL 数据库)来存储有关其用户和应用程序的数据。 它可以是用户信息、登录凭据、付款信息或有关公司的任何其他信息。 以电子商务网站为例。 它将产品数据、用户帐户、订单数据和支付信息存储在数据库中。
然后,网站从这些数据库中获取数据并提供特定于用户的内容或服务。 这个过程的发生要归功于 SQL,一种用于管理数据库的标准化编程语言。 每当您需要从应用程序获取某些内容(例如您的购买历史记录)时,您实际上是在使用 SQL 查询(指示数据库执行特定操作的命令)向数据库发出请求。
为了使 Web 交互变得无缝,许多网站允许用户输入数据来进行 SQL 查询。 这可以包括搜索词、用户名或付款详细信息等内容。
考虑电子商务网站的示例。 使用“订单”表 (o) 和“产品”表 (p) 显示数据库中的订单历史记录的简单 SQL 查询如下:
SELECT o.order_id、o.order_date、p.product_name、p.price
FROM 订单 o
连接产品 p ON o.product_id = p.product_id
其中o.user_id = 12345;
此 SQL 代码从订单表中选取订单 ID 和日期,并从网站数据库中用户 ID 12345 的产品表中选取产品名称和价格。 通常,ID 将基于用户的输入。 当输入没有得到正确的检查和控制时就会出现问题。 攻击者利用该漏洞进行SQL注入攻击。
以下是它通常的展开方式。
- 识别易受攻击的输入字段:攻击者首先在 Web 应用程序上查找可能注入恶意代码的输入字段。 他们提交不同的值并查看应用程序如何响应。 找出是否。 如果应用程序未正确验证或清理用户输入,应用程序会将其输入作为 SQL 代码进行处理。 该潜在漏洞用于代码注入。
- 通过用户输入进行代码注入:在了解应用程序如何处理输入后,攻击者构建一个有效负载,这是一段利用该漏洞的恶意 SQL 代码。 这包括添加 SQL 控制字符,如单引号 (')、双引号 (“) 或等号 (=) 来更改 SQL 查询结构。 将这些控制字符与常见的 SQL 命令(如 SELECT 和 FROM)一起使用,可以让攻击者从数据库服务器访问或检索数据。
然后,他们提交特制的输入以及合法的请求,欺骗应用程序将可疑代码视为查询的合法部分。 - 执行:数据库在不知道攻击的情况下处理查询并执行注入的代码,就好像它是合法请求一样。
- 漏洞利用:根据攻击者的意图,注入的 SQL 代码可能会检索敏感数据、修改或删除信息,甚至授予未经授权的访问权限。 这会危及应用程序的安全性,可能会暴露敏感信息。
SQL注入示例
考虑一个 Web 应用程序,它使用 URL 参数根据产品 ID 获取产品详细信息,如下所示:
http://example.com/products?id=1
攻击者可能会尝试注入恶意 SQL 代码以导致错误并检索如下信息: http://example.com/products?id=1' OR 1=1; –
如果应用程序无法充分验证和清理用户输入,则可以按如下方式操作 SQL 查询:
从产品中选择 * WHERE OR 1=1; - - ';
在本例中,原始查询旨在检索 ID 为 1 的产品,但攻击者的输入修改了查询以返回所有产品,因为添加了 1=1 和附加的双连字符 (- -)。 它使原始的结束单引号无效,并导致显示所有产品详细信息或显示攻击者可以利用的错误消息。
33%
2022 年,80% 的 Web 应用程序关键漏洞是由 SQL 注入造成的。
资料来源:Statista
SQL 漏洞的广泛流行以及 Web 应用程序数据库及其所有关键业务数据的吸引力使得 SQL 注入成为最持久的网络攻击之一。
来源: Spiceworks
SQL注入攻击的类型
根据攻击者检索信息或与数据库交互的方式,SQL 注入攻击主要分为三种类型:
- 经典或带内 SQLi
- 盲目或推理 SQLi
- 带外 SQLi
1. 经典或带内 SQLi
带内是最常见的 SQL 注入攻击类型。 经典黑客使用相同的通信通道(带内)注入恶意 SQL 代码并检索结果。 带内 SQLi 的两个主要变体是:
基于联合的带内 SQLi
此攻击利用 UNION SQL 运算符,用于组合两个或多个 SELECT 语句结果中的数据。 通过这样做,攻击者可以从他们无法直接访问的表中检索数据。
基于错误的带内 SQLi
在这种技术中,攻击者故意触发 SQL 查询中的错误,以利用数据库返回的错误消息。 这些错误可以揭示有关数据库结构、表名、列名,有时甚至是数据本身的有价值的信息。 基于错误的 SQLi 也可以作为带外 SQLi 执行。
2. 推理(盲)SQLi
在盲目的 SQLi 中,攻击者无法直接看到攻击的结果。 相反,他们通过观察响应其查询的应用程序行为或错误消息来推断信息。 这种类型的攻击非常耗时,因为黑客必须进行一系列 SQL 查询才能找到可利用的潜在漏洞。 盲 SQLi 的两种变体是:
基于时间的盲 SQLi
在这里,攻击者提出的查询使数据库在做出反应之前延迟其响应。 他们通过关注响应时间来推断有关数据库的信息。
布尔盲 SQLi
对于布尔盲 SQLi,攻击者利用应用程序响应 SQL 查询中的真或假条件的方式。 根据 Web 应用程序的响应,即使没有返回数据库中的数据,它们也会推断有关数据库的信息。
3. 带外 SQLi
带外 SQLi 攻击会导致应用程序将数据发送到黑客控制的远程端点。 此类攻击要求 SQL 服务器具有某些功能,例如能够发起超文本传输协议 (HTTP) 请求等外部网络请求。
如何防止 SQL 注入攻击:备忘单
防止 SQL 注入需要采用多层方法,包括安全编码实践和持续监控。 下面是一份备忘单,其中包含可帮助您免受 SQL 注入攻击的基本步骤。
使用准备好的语句
针对 SQL 注入攻击的主要防御措施是使用参数化查询准备语句。 准备好的语句确保用户输入被视为数据而不是可执行代码。
开发人员预先将用于查询的 SQL 代码编译为带有占位符的模板,用于用户输入的值。 在查询执行时,准备好的语句绑定实际值而不是占位符。 这会阻止恶意代码的执行。
准备好的语句优于动态 SQL 语句。 它们在执行期间编写 SQL 查询,这削弱了它们抵御注入攻击的能力。
流行编程语言中的准备语句:
以下是在流行的数据库编程中使用准备好的语句(参数化查询)的特定于语言的建议:
- Java 企业版 (EE):使用 java.sql 包中的PreparedStatement类。 使用setString 、 setInt等方法绑定参数。
- Python (SQLite3) :在查询中使用占位符 ( ? )。 使用元组或列表绑定参数。
- PHP:使用PHP 数据对象 (PDO)扩展。 使用带有占位符 (:) 的准备好的语句。 使用bindValue或bindParam绑定参数。
- .NET :使用MySqlCommand对象。 使用Parameters.AddWithValue绑定参数。
另一种预防 SQL 注入的方法是使用存储过程或一组可以反复使用的预编译 SQL 代码。
练习输入验证
输入验证涉及在处理之前检查用户输入以确保其满足特定标准。 允许列表(也称为白名单)是输入验证的一个关键方面。 在这里,仅接受预定义的安全值或模式作为 SQL 查询的一部分。 任何不符合设定条件的输入都会被拒绝。 这可以有效防止恶意或意外输入进入系统。
使用对象关系映射库
对象关系映射 (ORM) 库对于使用关系数据库的开发人员来说是很有价值的工具。 它们允许开发人员使用他们选择的编程语言与数据库进行交互,从而减少编写原始 SQL 查询的需要。 ORM 库提供针对 SQL 注入攻击的内置保护。
对开发人员和 IT 团队进行安全编码实践培训。 确保定期进行安全审核和渗透测试以发现漏洞。
提示:使用安全代码培训工具帮助您的程序员和开发人员更快地学习安全编码。
执行最小权限原则
最小权限原则只给予数据库用户完成其工作所需的最小权限。 遵循这一原则可以减少潜在 SQL 注入攻击或任何网络攻击的影响。 另外,对数据库应用严格的访问控制。
部署 Web 应用程序防火墙 (WAF)
WAF 监视应用程序的传入网络流量,并根据众所周知的攻击签名列表阻止潜在的恶意流量。
前 5 个 Web 应用程序防火墙 (WAF) 工具:
- Azure Web 应用程序防火墙
- AWS 网络应用防火墙
- Imperva Web 应用程序防火墙 (WAF)
- Cloudflare 频谱
- 赛门铁克 Web 应用程序防火墙和反向代理
*以上是 G2 2023 年夏季网格报告中的五种领先 WAF 解决方案。
WAF 使用预定义的规则来检测传入流量中的可疑模式和异常,例如 SQL 关键字和恶意负载。 它清理和验证用户输入并阻止或过滤掉有害请求。 这有助于阻止危险的 SQL 查询进入系统。
现代 WAF 使用机器学习来适应新的攻击方法。
其他防止SQL注入攻击的安全工具
除了 WAF 之外,其他几个安全平台也可以阻止 SQL 注入攻击。
- 漏洞扫描器寻找 Web 应用程序中已知和未知的漏洞。
- 静态应用程序安全测试(SAST)工具和静态代码分析软件无需实际执行代码即可发现安全漏洞。
- 动态应用程序安全测试软件模拟对正在运行的应用程序的攻击并识别弱点。
- 入侵检测和防御系统以及数字取证软件实时调查应用程序的异常情况和攻击。
守护您的数据堡垒
SQL注入攻击对Web应用程序安全构成严重威胁。 如果攻击成功,公司将面临失去宝贵数据、用户隐私和良好声誉的风险。
虽然没有任何单一解决方案能够保证针对 SQL 注入的绝对安全,但结合我们在此讨论的预防措施可以显着减少攻击的机会。 Web 开发人员和数据库管理员应采取严格的防御措施并强化其 Web 应用程序以防止潜在的利用。
想要一个全面的解决方案来保护您的网站吗? 探索网络安全软件及其如何帮助抵御导致数据泄露的网络攻击。