数据是信息系统最重要的组成部分之一。组织使用数据库驱动的 Web 应用程序从客户那里获取数据。SQL是结构化查询语言的首字母缩写。它用于检索和操作数据库中的数据。
什么是 SQL 注入?
SQL 注入是一种攻击动态 SQL 语句以注释掉语句的某些部分或附加始终为真的条件的攻击。它利用设计不佳的 Web 应用程序中的设计缺陷来利用 SQL 语句来执行恶意 SQL 代码。
在本教程中,您将学习 SQL 注入技术以及如何保护 Web 应用程序免受此类攻击。
- SQL 注入的工作原理
- 黑客活动:SQL 注入 Web 应用程序
- 其他 SQL 注入攻击类型
- SQL 注入自动化工具
- 如何防止 SQL 注入攻击
- 黑客活动:使用 Havji 进行 SQL 注入
SQL 注入的工作原理
可以使用 SQL 注入执行的攻击类型取决于数据库引擎的类型。该攻击适用于动态 SQL 语句。动态语句是在运行时使用来自 Web 表单或 URI 查询字符串的参数密码生成的语句。
让我们考虑一个带有登录表单的简单 Web 应用程序。HTML 表单的代码如下所示。
<form action=‘index.php’ method="post"><input type="email" name="email" required="required"/><input type="password" name="password"/><input type="checkbox" name="remember_me" value="Remember me"/><input type="submit" value="Submit"/></form>
这里,
- 上面的表单接受电子邮件地址和密码,然后将它们提交到名为 index.php的PHP文件。
- 它可以选择将登录会话存储在 cookie 中。我们从 remember_me 复选框推断出这一点。它使用 post 方法提交数据。这意味着这些值不会显示在 URL 中。
假设后端检查用户ID的语句如下
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
这里,
- 上面的语句直接使用 $_POST[] 数组的值,而没有对其进行清理。
- 密码使用 MD5 算法加密。
我们将使用 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 ('m@m.com',md5('abc'));
步骤 2) 单击构建模式
步骤 3)在右侧窗格中输入此代码
select * from users;
步骤 4)单击运行 SQL。您将看到以下结果
假设用户提供admin@admin.sys和1234 作为密码。对数据库执行的语句将是
SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');
可以通过注释掉密码部分并附加一个始终为真的条件来利用上述代码。假设攻击者在电子邮件地址字段中提供以下输入。
xxx@xxx.xxx’ OR 1 = 1 LIMIT 1 — ‘ ]
xxx 为密码。
生成的动态语句如下。
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 — ' ] AND password = md5('1234');
这里,
- xxx@xxx.xxx以单引号结尾,完成字符串引号
- OR 1 = 1 LIMIT 1 是一个始终为真的条件,并将返回的结果限制为仅一条记录。
- — ' AND ... 是删除密码部分的 SQL 注释。
复制上面的SQL语句,粘贴到SQL FiddleRun SQL文本框中,如下图
黑客活动:SQL 注入 Web 应用程序
我们在Login | Personal Contacts Manager 上有一个简单的 Web 应用程序,它很容易受到 SQL 注入攻击,仅用于演示目的。上面的 HTML 表单代码取自登录页面。该应用程序提供基本的安全性,例如清理电子邮件字段。这意味着我们上面的代码不能用来绕过登录。
为了解决这个问题,我们可以利用密码字段。下图显示了您必须遵循的步骤
假设攻击者提供以下输入
- 第 1 步:输入 xxx@xxx.xxx 作为电子邮件地址
- 第 2 步:输入 xxx') OR 1 = 1 — ]
- 点击提交按钮
- 您将被定向到仪表板
生成的SQL语句如下
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 — ]');
下图说明了语句已生成。
这里,
- 该语句智能地假设使用了 md5 加密
- 完成单引号和右括号
- 将条件附加到将始终为真的语句
通常,成功的 SQL 注入攻击会尝试使用多种不同的技术(例如上面演示的技术)来执行成功的攻击。
其他 SQL 注入攻击类型
SQL 注入比仅仅通过登录算法造成的危害更大。一些攻击包括
- 删除数据
- 更新数据
- 插入数据
- 在服务器上执行可以下载和安装木马等恶意程序的命令
- 将信用卡详细信息、电子邮件和密码等有价值的数据导出到攻击者的远程服务器
- 获取用户登录详细信息等
上面的列表并不详尽;它只是让您了解什么是 SQL 注入
SQL 注入自动化工具
在上面的示例中,我们使用了基于我们丰富的 SQL 知识的手动攻击技术。有一些自动化工具可以帮助您在尽可能短的时间内更有效地执行攻击。这些工具包括
- SQLMap - sqlmap: automatic SQL injection and database takeover tool
- JSQL 注入 - jsql | Kali Linux Tools
如何防止 SQL 注入攻击
组织可以采用以下策略来保护自己免受 SQL 注入攻击。
- 用户输入永远不应该被信任——在用于动态 SQL 语句之前,必须始终对其进行清理。
- 存储过程——这些可以封装 SQL 语句并将所有输入视为参数。
- 准备好的语句——准备好的语句通过首先创建 SQL 语句然后将所有提交的用户数据作为参数来工作。这对 SQL 语句的语法没有影响。
- 正则表达式——这些可用于检测潜在的有害代码并在执行 SQL 语句之前将其删除。
- 数据库连接用户访问权限——只有必要的访问权限才应授予用于连接数据库的帐户。这有助于减少 SQL 语句可以在服务器上执行的操作。
- 错误消息——这些不应透露敏感信息以及发生错误的确切位置。简单的自定义错误消息,例如“抱歉,我们遇到了技术错误。已联系技术团队。请稍后重试”可以用来代替显示导致错误的 SQL 语句。
黑客活动:使用 Havij 进行 SQL 注入
在这个实际场景中,我们将使用 Havij Advanced SQL Injection 程序来扫描网站的漏洞。
注意:由于其性质,您的防病毒程序可能会对其进行标记。您应该将其添加到排除列表或暂停您的防病毒软件。
下图显示了 Havij 的主窗口
上述工具可用于评估网站/应用程序的漏洞。
概括
- SQL 注入是一种利用不良 SQL 语句的攻击类型
- SQL 注入可用于绕过登录算法,检索、插入、更新和删除数据。
- SQL注入工具包括SQLMap、SQLPing、SQLSmack等。
- 编写 SQL 语句时一个好的安全策略可以帮助减少 SQL 注入攻击。