SQL 注入教程:通过示例学习

什么是 SQL 注入?
SQL注入攻击是一种通过篡改动态SQL语句来攻击恶意代码的攻击手段,它会注释掉语句中的某些部分,或者添加一个始终为真的条件。这种攻击利用设计不佳的Web应用程序的缺陷,通过篡改SQL语句来执行恶意代码。
数据是信息系统最重要的组成部分之一。企业使用基于数据库的 Web 应用程序来获取客户数据。SQL 是 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>
这里,
- 上述表单接受电子邮件地址和密码,然后将其提交给…… PHP 名为index.php的文件。
- 它可以选择将登录会话存储在 cookie 中。我们从“记住我”复选框推断出这一点。它使用 POST 方法提交数据。这意味着这些值不会显示在页面上。 URL.
假设后端用于检查用户 ID 的语句如下。
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
这里,
- 上述语句直接使用了 $_POST[] 数组的值,而没有对其进行清理。
- 密码使用 MD5 算法进行哈希处理。
我们将用 SQL 注入攻击来举例说明。 SQL Fiddle。 打开 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 = 1LIMIT 1 是一个始终为真的条件,并将返回的结果限制为仅有一条记录。- — 'AND…是消除密码部分的SQL注释。
复制以上 SQL 语句并粘贴到此处。 SQL Fiddle 按照下图所示,在 SQL 文本框中运行 SQL 语句。
黑客活动:SQL 注入 Web 应用程序
我们有一个简单的 Web 应用程序 http://www.techpanda.org/ 这段代码仅用于演示目的,存在 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注入攻击的危害远不止绕过登录算法。一些常见的攻击包括:
- 删除数据
- 更新数据
- 插入数据
- 在服务器上执行命令,下载并安装木马等恶意程序
- 将信用卡详细信息、电子邮件和密码等有价值的数据导出到攻击者的远程服务器
- 获取用户登录详细信息等。
- 基于cookie的SQL注入
- 基于错误的 SQL 注入
- 盲SQL注入
以上列表并不完整,只是让您了解 SQL 注入可以造成哪些后果。
SQL 注入的自动化工具
在上面的例子中,我们运用了基于自身丰富 SQL 知识的手动攻击技术。其实有一些自动化工具可以帮助您更高效、更快速地执行攻击。这些工具包括:
- SQLMap – http://sqlmap.org/
- jSQL注入 – https://www.kali.org/tools/jsql/
如何防止 SQL 注入攻击
组织可以采用以下策略来保护自己免受 SQL 注入攻击。
- 用户输入永远不应被信任。 – 在动态 SQL 语句中使用之前,必须先对其进行清理。
- 储存程序 – 这些可以封装 SQL 语句并将所有输入视为参数。
- 准备好的陈述 预处理语句的工作原理是先创建 SQL 语句,然后将所有提交的用户数据作为参数处理。这不会影响 SQL 语句的语法。
- 常用表达 – 这些方法可用于检测潜在的有害代码,并在执行 SQL 语句之前将其删除。
- 数据库连接用户访问权限 – 仅应向用于以下用途的帐户授予必要的访问权限: 连接到数据库. 这有助于减少 SQL 语句在服务器上执行的操作。
- 错误消息 这些信息不应泄露敏感信息或错误发生的具体位置。可以使用简单的自定义错误消息,例如“抱歉,我们遇到了技术问题。我们已联系技术团队。请稍后再试”,而不是显示导致错误的 SQL 语句。
黑客活动:使用 Havij 进行 SQL 注入
在这个实际场景中,我们使用 Havij 高级 SQL 注入程序来扫描网站是否存在漏洞。
注意:Havij 是一个过时且无人维护的网站。 Windows 工具——上面的 SQLMap 是当前的开源标准。
注意:由于其性质,您的防病毒程序可能会将其标记为病毒。您应该将其添加到排除列表中或暂停防病毒程序。 防病毒程序.
下图显示了 Havij 的主窗口。
上述工具可用于评估网站或应用程序的漏洞。








