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

⚡ 智能摘要

SQL注入攻击是一种通过篡改动态SQL语句来绕过身份验证或泄露数据的攻击,它利用Web应用程序从未经处理的用户输入构建查询语句的漏洞。本页将介绍这种攻击的工作原理以及如何防范。

  • 💉 定义: SQL注入是指通过未经验证的输入字段将恶意SQL语句插入到查询语句中。
  • 🔓 影响: 攻击成功后,可以绕过登录,读取、修改或删除记录。
  • 🧪 计费示例: 一个始终为真的条件加上一条注释,就能将登录检查变成绕过。
  • 🛠️ 工具: SQLMap 和 jSQL 可自动检测和利用可注入参数。
  • 🛡️ 预防: 参数化查询、输入验证和最小权限账户缩小了差距。
  • 🤖 现代感十足: AI驱动的扫描器和防火墙可以标记出固定签名无法识别的注入模式。

SQL注入教程

什么是 SQL 注入?

SQL注入攻击是一种通过篡改动态SQL语句来攻击恶意代码的攻击手段,它会注释掉语句中的某些部分,或者添加一个始终为真的条件。这种攻击利用设计不佳的Web应用程序的缺陷,通过篡改SQL语句来执行恶意代码。

数据是信息系统最重要的组成部分之一。企业使用基于数据库的 Web 应用程序来获取客户数据。SQL 是 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 语句。

空的 SQL Fiddle 窗口已准备好用于架构和查询

步骤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”。您将看到以下结果。

SQL Fiddle 结果显示返回的单个用户记录

假设用户提供 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 按照下图所示,在 SQL 文本框中运行 SQL 语句。

SQL Fiddle 注入条件运行完毕后返回记录

黑客活动: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 -- ]');

下图说明了语句的生成方式。

注入的 SQL 语句生成方式详解

这里,

  • 该声明巧妙地假定使用了md5加密。
  • 完成单引号和右括号。
  • 在语句中添加一个始终为真的条件。

一般来说,一次成功的攻击会结合多种技术,例如上面所示的那些技术。

其他 SQL 注入攻击类型

SQL注入攻击的危害远不止绕过登录算法。一些常见的攻击包括:

  • 删除数据
  • 更新数据
  • 插入数据
  • 在服务器上执行命令,下载并安装木马等恶意程序
  • 将信用卡详细信息、电子邮件和密码等有价值的数据导出到攻击者的远程服务器
  • 获取用户登录详细信息等。
  • 基于cookie的SQL注入
  • 基于错误的 SQL 注入
  • 盲SQL注入

以上列表并不完整,只是让您了解 SQL 注入可以造成哪些后果。

SQL 注入的自动化工具

在上面的例子中,我们运用了基于自身丰富 SQL 知识的手动攻击技术。其实有一些自动化工具可以帮助您更高效、更快速地执行攻击。这些工具包括:

如何防止 SQL 注入攻击

组织可以采用以下策略来保护自己免受 SQL 注入攻击。

  • 用户输入永远不应被信任。 – 在动态 SQL 语句中使用之前,必须先对其进行清理。
  • 储存程序 – 这些可以封装 SQL 语句并将所有输入视为参数。
  • 准备好的陈述 预处理语句的工作原理是先创建 SQL 语句,然后将所有提交的用户数据作为参数处理。这不会影响 SQL 语句的语法。
  • 常用表达 – 这些方法可用于检测潜在的有害代码,并在执行 SQL 语句之前将其删除。
  • 数据库连接用户访问权限 – 仅应向用于以下用途的帐户授予必要的访问权限: 连接到数据库. 这有助于减少 SQL 语句在服务器上执行的操作。
  • 错误消息 这些信息不应泄露敏感信息或错误发生的具体位置。可以使用简单的自定义错误消息,例如“抱歉,我们遇到了技术问题。我们已联系技术团队。请稍后再试”,而不是显示导致错误的 SQL 语句。

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

在这个实际场景中,我们使用 Havij 高级 SQL 注入程序来扫描网站是否存在漏洞。

注意:Havij 是一个过时且无人维护的网站。 Windows 工具——上面的 SQLMap 是当前的开源标准。

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

下图显示了 Havij 的主窗口。

Havij SQL注入工具的主窗口

上述工具可用于评估网站或应用程序的漏洞。

常见问题

只有在获得网站所有者的书面许可后才能进行测试。根据美国《计算机欺诈和滥用法案》等法律,测试您不拥有的应用程序是违法的。漏洞赏金计划的范围界定了哪些行为是被允许的。

是的。在 OWASP Top 10:2025 中,SQL 注入攻击排名第 A05 位,测试仍然发现几乎所有应用程序都存在 SQL 注入漏洞。每年新增数千个 SQL 注入 CVE 漏洞,使其成为主要的 Web 安全风险之一。

MD5 是一种快速哈希算法,而非加密算法,攻击者可以利用彩虹表和 GPU 快速破解它。建议使用速度较慢但加盐的算法,例如 bcrypt 或 Argon2 来加密密码。

任何通过动态构建的 SQL 查询的数据库—— MySQL, PostgreSQL, Microsoft SQL Server, Oracle和 SQLite问题在于应用程序如何将用户输入连接成查询语句,而不是数据库引擎本身存在缺陷。

人工智能防火墙和扫描器能够学习正常的流量模式,然后实时标记异常输入,例如注入的条件或注释。机器学习模型可以捕获固定签名无法识别的混淆有效载荷。

AI 助手 GitHub 副驾驶 可以建议参数化查询和输入验证,但也会重现不安全模式。请将每条建议都视为草稿,并使用安全代码检查工具进行审查。

SQL注入攻击通过在服务器端查询中注入SQL语句来攻击数据库。跨站脚本攻击则通过注入脚本来攻击其他用户,这些脚本会在他们的浏览器中运行。前者会泄露数据,后者则会劫持用户会话。

ORM(对象关系映射器)默认使用参数化从代码对象构建查询,从而防止大多数 SQL 注入攻击。但它并非万无一失——原始查询和不安全的方法仍然会泄露信息,因此验证仍然至关重要。

总结一下这篇文章: