数据是信息系统最重要的组成部分之一。组织使用数据库驱动的 Web 应用程序从客户那里获取数据。SQL是结构化查询语言的首字母缩写。它用于检索和操作数据库中的数据。
SQL 注入是一种攻击动态 SQL 语句以注释掉语句的某些部分或附加始终为真的条件的攻击。它利用设计不佳的 Web 应用程序中的设计缺陷来利用 SQL 语句来执行恶意 SQL 代码。
在本教程中,您将学习 SQL 注入技术以及如何保护 Web 应用程序免受此类攻击。
可以使用 SQL 注入执行的攻击类型取决于数据库引擎的类型。该攻击适用于动态 SQL 语句。动态语句是在运行时使用来自 Web 表单或 URI 查询字符串的参数密码生成的语句。
让我们考虑一个带有登录表单的简单 Web 应用程序。HTML 表单的代码如下所示。
这里,
假设后端检查用户ID的语句如下
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
这里,
我们将使用 sqlfiddle 来说明 SQL 注入攻击。在 Web 浏览器中打开 URL http://sqlfiddle.com/ 。您将看到以下窗口。
注意:您必须编写 SQL 语句
步骤 1)在左侧窗格中输入此代码
CREATE TABLE `users` (
`id` INT NOT NULL AUTO_INCREMENT,
`email` VARCHAR(45) NULL,
`password` VARCHAR(45) NULL,
PRIMARY KEY (`id`));
insert into users (email,password) values ('[email protected]',md5('abc'));
步骤 2) 单击构建模式
步骤 3)在右侧窗格中输入此代码
select * from users;
步骤 4)单击运行 SQL。您将看到以下结果
假设用户提供[email protected]和1234 作为密码。对数据库执行的语句将是
SELECT * FROM users WHERE email = '[email protected]' AND password = md5('1234');
可以通过注释掉密码部分并附加一个始终为真的条件来利用上述代码。假设攻击者在电子邮件地址字段中提供以下输入。
[email protected]’ OR 1 = 1 LIMIT 1 — ‘ ]
xxx 为密码。
生成的动态语句如下。
SELECT * FROM users WHERE email = '[email protected]' OR 1 = 1 LIMIT 1 — ' ] AND password = md5('1234');
这里,
复制上面的SQL语句,粘贴到SQL FiddleRun SQL文本框中,如下图
我们在Login | Personal Contacts Manager 上有一个简单的 Web 应用程序,它很容易受到 SQL 注入攻击,仅用于演示目的。上面的 HTML 表单代码取自登录页面。该应用程序提供基本的安全性,例如清理电子邮件字段。这意味着我们上面的代码不能用来绕过登录。
为了解决这个问题,我们可以利用密码字段。下图显示了您必须遵循的步骤
假设攻击者提供以下输入
生成的SQL语句如下
SELECT * FROM users WHERE email = '[email protected]' AND password = md5('xxx') OR 1 = 1 — ]');
下图说明了语句已生成。
这里,
通常,成功的 SQL 注入攻击会尝试使用多种不同的技术(例如上面演示的技术)来执行成功的攻击。
SQL 注入比仅仅通过登录算法造成的危害更大。一些攻击包括
上面的列表并不详尽;它只是让您了解什么是 SQL 注入
在上面的示例中,我们使用了基于我们丰富的 SQL 知识的手动攻击技术。有一些自动化工具可以帮助您在尽可能短的时间内更有效地执行攻击。这些工具包括
组织可以采用以下策略来保护自己免受 SQL 注入攻击。
在这个实际场景中,我们将使用 Havij Advanced SQL Injection 程序来扫描网站的漏洞。
注意:由于其性质,您的防病毒程序可能会对其进行标记。您应该将其添加到排除列表或暂停您的防病毒软件。
下图显示了 Havij 的主窗口
上述工具可用于评估网站/应用程序的漏洞。