SQL 注入

2025年6月18日 | 阅读 7 分钟

SQL注入 (SQLi) 是一种恶意软件攻击,攻击者通过向应用程序注入恶意代码,从而读取或修改数据库。借助此方法,攻击者可以更改数据库内容并控制系统。

SQL注入是一种代码渗透技术,可能会导致我们的数据库丢失。它是最常用的网络黑客技术之一,通过网页输入将恶意代码放入SQL语句中。在许多情况下,攻击者控制服务器的完全访问或数据,这可能严重损害网络应用程序。

它是网络应用程序最具破坏性的弱点,可能影响企业或网站。它攻击SQL查询,并通过客户端网站的输入字段将恶意代码插入查询中。这类攻击者通常针对用户输入并且不检查数据库中输入类型的应用程序。

SQL注入通常发生在我们要求用户输入他们的用户名/用户ID时。用户没有提供姓名或ID,而是给了我们一个SQL语句,我们会在不知不觉中在数据库中运行它。

SQL Injection

真实世界的例子

为了理解SQL注入,我们举一个真实发生的事件。

Talk Talk 2015年数据泄露事件

Talk Talk 数据泄露事件发生于2015年,攻击者攻击了英国的Talk Talk数据库。他们窃取了160,000人的详细信息,包括银行详细信息和电话号码。

该事件的调查由ICO进行,他们揭示了Talk Talk存在多处安全漏洞。攻击者发现了这些薄弱的安全环节并访问了客户详细信息。这影响了Talk Talk的业务和声誉。

SQL注入示例

我们有一个基于员工记录的应用程序。员工只能通过输入唯一的私人员工ID查看自己的记录。我们有一个字段,例如EMPLOYEE_IDPASSWORD来输入详细信息。

假设员工输入以下EMPLOYEE_ID和PASSWORD

EMPLOYEE_ID: 236893238

密码: mypassword

它将转换为

上面的SQL代码是有效的,并将从EMPLOYEE表中返回EMPLOYEE_ID行。

SQL注入攻击

假设恶意用户输入以下内容

EMPLOYEE_ID: '''' OR 1=1

密码: '''' OR 1=1

它将转换为

这个查询在逻辑上总是为真,所以1=1将返回所有满足此条件的记录。所有员工数据都将被泄露;现在,恶意用户可以查看所有记录,删除记录或修改员工记录。

基于批处理SQL语句的SQL注入

许多数据库都支持批处理SQL语句。它是由分号分隔的两个或更多SQL语句的组合。

如果攻击者输入以下语句

此SQL语句将首先从Employee表中返回所有行,然后删除Employee_Add表。

SQL注入的类型

SQL注入攻击有许多类型,不同的方法对不同的应用程序进行不同的攻击。

SQL Injection

基于错误的SQL注入:当应用程序未能正确处理错误时,攻击者会进行此类攻击。他们利用这些错误消息将恶意代码推入数据库结构中。

盲注SQL注入:在这些类型的攻击中,攻击者不会直接注入代码。他们首先观察应用程序行为、响应或时间的变化。

带外SQL注入:在带外SQL注入中,恶意代码不会直接推送。它可以通过不同的通信通道注入,例如DNS或HTTP请求。这些类型的攻击比其他攻击更具破坏性。

二次SQL注入:在这些类型的攻击中,攻击者将代码注入数据库内部,但不会立即产生影响。当用户或管理员在某个地方使用此代码时,就会产生问题。

SQL注入的危害

SQL Injection

数据泄露:攻击者可以从数据库中读取敏感的个人信息,如信用卡号、PIN码和商业数据。

数据操纵:攻击者可以修改或删除有用数据,这可能导致业务损失。

身份验证:攻击者通过使用总是为真的条件("100 OR 1=1")来获取身份验证的访问权限。这可以访问私人用户数据。

服务器过载:SQL注入会增加服务器的负载,从而降低性能。

如何检测SQL注入?

SQL Injection

创建SQL注入攻击并不难,即使是最好、最善意的开发人员也会犯错误。因此,检测SQL注入是创建SQL注入攻击风险的重要组成部分。

为了检测SQL数据库中的恶意代码,我们使用以下一些技术:

手动检测测试:在此技术中,用户输入特殊类型的数据(例如 ' " ; -- /* */ OR 1=1)。如果应用程序行为异常,则数据库中可能存在恶意软件攻击。

自动化扫描工具:互联网上有许多开源自动化工具用于检测和利用SQL注入。

应用程序日志记录和监控:这是检测和预防SQL注入的基本技术。它有助于跟踪、分析和响应应用程序行为的变化,这些变化表明您的应用程序受到了攻击。

基于错误的检测:攻击后,如果应用程序显示意外或异常的错误消息,则表示数据库中存在SQL注入。

数据库监控:在数据库监控中,我们可以持续观察和分析数据库,以检测数据库的异常或未经授权的行为。

SQL注入的预防技术

SQL Injection

为了防止SQL注入,我们可以利用以下技术。

使用参数化查询

参数化查询也称为预处理语句。它是预防SQL注入的一种经济有效的方法。它通过将SQL代码与用户输入分开来工作。在这种技术中,我们不通过连接来构建SQL查询,而是使用占位符。

为了防止SQL注入,我们在MySQL中使用参数化查询作为一种安全的方式来运行带有用户输入的数据命令。将用户值直接放入数据库是危险且不安全的,因此我们可以使用占位符(如(?)),然后将实际值单独填充到数据库中。

示例

说明

在这个例子中,我们使用MySQL中的预处理语句来检查登录详细信息。我们将用户名和密码设置为变量,使用占位符(?)准备SQL查询,并用用户输入安全地执行。这种方法可以防止SQL注入。

输入验证和白名单

输入验证和白名单是那些在数据插入期间只接受有效和预期数据的技术。

在输入验证中,它在数据库中使用之前,检查并限制用户输入以匹配预期格式后才接受数据。

  • 用户名应只包含字母和数字。
  • 电子邮件必须与有效电子邮件地址的模式匹配。

白名单只允许已知、安全的值或格式,并拒绝其他所有内容。它只允许少量字符和模式,例如用于用户名或电子邮件地址字段的字母数字输入。

示例

说明

在上面的示例中,我们设置了一个顺序(asc)并按价格检索了产品。它没有在ORDER BY子句中使用变量,而是使用了一个名为@sort_order的变量。注释提醒您在运行查询之前应在应用程序中检查排序顺序(如“asc”或“desc”),以确保其安全。这有助于防止黑客注入有害的SQL代码。

使用对象关系映射(ORM)框架

ORM框架有助于防止SQL注入。它们可以自动生成安全和参数化的查询。在此技术中,开发人员使用对象、类和方法与数据库交互。ORM处理输入和查询的构建。

限制数据库权限

在限制数据库权限中,我们只在用户绝对需要执行其任务时才授予其访问权限。如果攻击者想要执行任何SQL注入攻击,它只会损坏连接到用户的数据库。当用户拥有完整的管理员访问权限时,攻击者可以删除表或访问敏感数据。但是如果访问权限受到限制,则会降低注入的风险。

使用Web应用程序防火墙(WAF)

防火墙是应用程序工具,通过监控和过滤网站上的传入流量来保护应用程序。它就像互联网和应用程序之间的保护盾。它会自动阻止恶意请求、跨站脚本和其他攻击。

它实时检查HTTP请求,检测可疑输入或模式,并阻止攻击方法和机器人。

它提供即时保护,无需更改代码。

结论

SQL注入是一种危险且常见的网络攻击,通过允许黑客访问、窃取或修改存储在数据库中的数据,从而损害网站和网络应用程序。它通常发生在用户输入未经过适当检查时,攻击者利用这一点将有害代码插入到系统中。这会导致严重的后果,如经济损失、数据泄露和公司声誉受损。我们可以通过多种方法检测恶意代码注入,例如手动测试、自动化扫描工具和基于错误的技术等。我们可以通过使用参数化查询、输入验证和白名单、对象关系映射(ORM)、限制数据库权限WAF等多种技术来防止注入攻击。


下一主题SQL 教程