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

article/2025/10/12 6:24:36

数据是信息系统最重要的组成部分之一。组织使用数据库驱动的 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.sys1234 作为密码。对数据库执行的语句将是

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 注入攻击。

http://chatgpt.dhexx.cn/article/c7D6wCc3.shtml

相关文章

sql注入详解

目录 前言? ? 一、漏洞原因分析 二、漏洞危害 三、sql注入防范 四、如何挖掘sql注入漏洞 五、常见的注入手法 联合查询(union注入) 报错注入 基于布尔的盲注 基于时间的盲注 HTTP头注入 宽字节注入 堆叠查询 二阶注入 六、sql注入getshell的几种方式 前言 结…

SQL注入教程

目录 基础sql语法基础注释sql注入漏洞产生的条件 sql注入的分类基于从服务器收到的响应基于数据库种类基于如何处理输入的SQL查询(数据类型)参数位置注入方法注入流程 万能密码ACCESS注入流程判断方法注入实战 MSSQL注入流程默认数据库函数注入过程 MySql注入&#xff08;重头戏…

SQL注入基本教程

注&#xff1a;只是自己学习记录&#xff0c;若有不对的地方请指出&#xff0c;文章有过一次修改&#xff0c;修改了关于order by函数的知识点 个人小站 SQL注入基本教程 数据库的结构注释符SQL注入简单教程 数据库的结构 学习SQL注入首先要知道数据库的结构 数据库由三个部分…

Sql注入的入门教程

Sql注入比较常见的漏洞之一&#xff0c;例用程序员的漏洞来进行无账号的登陆&#xff0c;篡改数据库。任何客户端可控&#xff0c;传参数到服务端的变量&#xff0c;和数据库交互&#xff0c;都有可能存在sql注入 原理 用户通过构造sql语句来模仿服务器发向服务器的语句&…

ImageJ 插入插件和基本教程

文章目录 前言一、ImageJ的下载二、ImageJ的安装三、给ImageJ添加自定义插件四、ImageJ闪退怎么办 前言 该软件是一个使用Java语音编写的图像处理和分析软件。ImageJ基于插件架构体系设计&#xff0c;可以通过编写插件对其功能进行扩展 一、ImageJ的下载 这款软件是完完全全免…

FIJI (ImageJ) 图像处理合集

1.更改伪彩颜色 ImageJ可以打开CAI格式&#xff0c;尼康的2084的原始格式等等。 将图片直接拖拽到imageJ软件上。 会弹出一个窗口 这个窗口就是告诉我们&#xff1a;关于这个图像的原始格式是否需要进行设置。通常使用默认的&#xff0c;点击Ok。 就可以打开这个图像 如果打…

ImageJ -介绍与安装

写在开头 ImageJ&#xff0c;一款免费却又极其强大的图像处理软件。百科 但很不幸的是&#xff0c;这款软件对于电脑小白而言&#xff0c;可能并不容易上手。 看一下这个软件的界面就知道了。 反正我第一打开的时候就直接想关掉&#xff0c;这些个 icon 根本不知道干嘛的好吧…

JS操作图片的利器:Jimp VS GM

前段时间&#xff0c;笔者有一个项目需求&#xff0c;需要在一张图片上面添加文件&#xff0c;并另存为一张新的图片。刚开始的时候&#xff0c;笔者使用的是大名鼎鼎的jimp。 。 其功能能满足我的要求&#xff0c;而且其license是MIT&#xff0c;不依赖于第三方的可执行程序…

imgageJ开发【Java】

一&#xff0e;ImageJ简介 ImageJ是一款由NIH&#xff08;National Institutes of Health,美国国家卫生研究院&#xff09;发起&#xff0c;可用于Windows,Mac,OSX和Linux等操作系统的图像处理开元软件&#xff0c;ImageJ小巧&#xff0c;只有5MB左右&#xff0c;界面简洁&…

ImageIO类的使用

重点内容 (一) How to read an image from file or URL&#xff1f; 从本地文本读取图片 File sourceimage new File("c:\\mypic.jpg"); Image image ImageIO.read(sourceimage); 从网络上获取图片 URL url new URL("http://www.mkyong.com/image/mypic…

安装Image J 插件

1.下载imageJ&#xff0c;网址&#xff1a;https://imagej.net/Fiji/Downloads 2.解压 3.安装插件 &#xff08;1&#xff09;https://imagej.nih.gov/ij/plugins/index.html这个网址下载你需要的插件。打开toolsets或者tools。 ![在这里插入图片描述](https://img-blog.csd…

ImageJ工具使用简介

ImageJ工具使用简介 在以前的博文中也介绍过看Raw图的方法&#xff0c;自己平常也使用windows上的一些插值工具来看raw图&#xff0c;最近发现了一个宝贝----ImageJ&#xff0c;最让我惊喜的是它可以完美的在Windows以及Ubuntu中使用&#xff0c;避免了我抓取Raw图之后拷贝到w…

JavaSE小项目(小游戏)

JavaSE编写的小游戏 源码下载地址&#xff1a;https://github.com/ygsama/SmallGame 游戏名(难度) 满天星&#xff08;★☆☆☆☆&#xff09; 球球&#xff08;★☆☆☆☆&#xff09; 打字游戏&#xff08;★☆☆☆☆&#xff09; 汤姆猫&#xff08;★★☆☆☆&#x…

JAVA小项目(6)javaSE

1 记帐本 1.1 使用技能点&#xff1a; 分支、循环、String的拼接 1.2 功能和效果 1.3 项目架构 public class Test {public static void main(String[] args) {while(true){System.out.println("-------欢迎使用记账系统--------");System.out.println("1.收…

java项目源码分享——适合新手练手的java项目

源码下载&#xff08;实例一&#xff09;&#xff1a;jsp开发完整的博研图书馆后台管理系统&#xff0c;不使用框架开发的&#xff0c;太完美了 源码下载&#xff08;实例二&#xff09;&#xff1a;javaWeb图书馆管理系统源码mysql版本 源码下载&#xff08;实例三&#xff09…

java小项目 ATM机(简易版)

目录 说明 项目介绍 功能介绍 结构图 各模块代码 登录界面 服务选择界面 存取款界面 修改密码模块 转账模块 总代码 说明 简单做了一个java的ATM机项目、本项目只能作为一个简单的运行程序。因为没有学到数据库&#xff0c;文件等内容&#xff0c;没有存储功能&…

适合新手练习的 java 小项目

适合新手练习的 java 小项目 智能电话本 视频连接在下方↓ 包括源码也在下面 不要问我为什么推荐这个&#xff0c;因为我也只是一个新手&#xff0c;这个项目是纯命令行的&#xff0c; 不需要数据库和网页编程知识&#xff0c;做起来很简单&#xff0c;可以帮助新手巩固基础…

JavaWeb新手小项目以及源码

此项目主要实现的功能有&#xff1a; jsp连接数据库、MD5加密、验证码验证、Ajax、文件的上传与下载、session登录验证等。 先来几张截图&#xff1a; 一、首先写登录页面 login.jsp <% page language"java" import"java.util.*" pageEncoding&qu…

java小项目水果摊

介绍 刚学完java 集合和IO流&#xff0c;想做了一个简单的小项目来练手&#xff0c;于是我就运用一些基础知识做了这个水果摊。水果摊的主要功能有&#xff1a; 进货查看水果列表购买水果查看购物车结账退出 都是一些简单的功能&#xff0c;下面就来展示代码&#xff1b; …