SQL注入的一般过程

article/2025/9/16 21:53:29

SQL注入的一般过程

  • 概述
  • SQL注入的步骤
  • 一道例题
  • 总结

概述

  SQL注入是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。SQL注入大致可以分为两类:数字型注入和字符型注入。

SQL注入的步骤

  这里介绍下SQL注入的基本流程,需要明确的是在实际注入中,我们都是无法看到具体的后端代码的,也就是无法知晓具体的SQL拼接过程。一般SQL注入分为以下7个步骤,目的是通过一步一步的注入来猜测出查询语句和数据库结构,最终暴露出数据库中表的信息,实际操作中大家可以根据需要来进行取舍。

1、判断注入类型,数字型还是字符型:
  首先,我们需要确定目标是数字型还是字符型注入漏洞,以便我们进一步进行其它注入操作。如下面的php代码片段所示,第一行代码代表数字型的sql拼接,其中的变量在sql查询语句拼接时并没有用引号括起来;第二行代码是字符型,其中的变量使用了引号进行拼接。

# 数字型
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
# 字符型
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";

  下面介绍如何进行判断,如下代码所示,首先我们假设注入类型为数字型,分别输入如下的语句。如果被测试对象是数字型,那么第一行测试语句会返回user_id为1的查询结果,而第二行语句由于条件and 1=2不成立,所以查询结果为空。如果被测试对象为字符型的话,将下面语句拼接到sql中,由于user_id的值都不匹配,所以应该是都不返回任何结果,但是注意如果user_id本身是int类型,实际查询过程中是会返回结果的,这可能是因为对输入的字符进行了截断并转换了类型,造成1 and 1=2在字符类型中会返回user_id为1的查询结果。当然如果第二个语句返回了结果,我们也可以以此判断出该注入类型是字符型。

1 and 1=1
1 and 1=2

  对于字符型注入判断,我们也可以这样进行操作,如下面的两条注入语句所示,如果是在数字型注入中,由于变量没有加引号,所以拼接后sql语法错误,直接报错,这和不回显信息是有区别。因此如果下面的语句注入后提示sql语法错误,那么我们可以直接判断测试对象为数字型注入。而对于字符型注入,第一行语句输入后和原本的引号前后完全闭合,且逻辑成立,所以回显出user_id为1的数据;第二行语句输入后,前后引号也完全闭合,但逻辑不成立,所以返回结果为空。

1' and '1'='1
1' and '1'='2

  最后展示一下直接在MySql数据库中的操作,大家可以更加直观的感受下结果。
mysql

2、猜解sql查询语句中的字段数
  在这一步中,我们尝试去猜测出查询语句中的字段个数,如下注入语句所示,假设为字符型注入,先利用1'实现引号闭环,再利用or 1=1这样可以暴露出表中所有的数据,最后利用order by num#去看是否报错来明确查询语句中的字段数,其中#号用于截断sql查询语句。

1' or 1=1 order by 1 #
1' or 1=1 order by 2 #
......
......

  当然也可以采用1' or 1=1 union select 1, 2, 3 #的方式,sql查询截图示意如下。
union

3、确定字段的显示顺序
  这里我们直接使用union就行,如下截图和代码所示,这里我们故意扰乱了first_name和last_name的两个位置,查询出来结果中的1,2会指明数据字段在查询语句中的位置。

1' union select 1, 2 #

union

4、获取当前数据库
  通过前面的字段数确定以及显示顺序确定,我们就可以结合union操作来获取数据库中的信息了。如下代码和截图所示,展示了获取数据库名的操作,根据前面已经获取到的字段数以及位置关系,假设有两个字段,那么下面的查询语句将会把数据库的名称放在第二个字段中。

1' union select 1, database() #

database

5、获取数据库中的表
  在获取到当前数据库名后,我们可以进一步获取其中表的信息。如下代码和截图所示,展示了获取数据库中表的信息,information_schema是MySql自带的信息数据库,用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等,其中的表实际上都是视图。information_schema的tables表记录了数据库中表的信息,指定table_schema的名称即可显示对应数据库中表的信息。

1' union select 1, group_concat(table_name) from information_schema.tables where table_schema=database() #

tables

6.获取表中的字段名
  进一步获取其中的字段名,假设要获取的表为users,如下面的代码和截图所示。information_schema的columns表存储了表中列的信息,也就是表中字段信息,指定table_name表名,即可获取到对应表的字段信息。

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

columns

7、下载数据
  最后根据需要,我们获取表中的信息。这里需要注意的是,我们假设原来的注入语句中只有两个查询字段,所以这里select后也只能跟两个group_concat,想一次性看多余的信息,只能在一个group_concat中进行组合。

1' or 1=1 union select group_concat(user_id, first_name, last_name), group_concat(password) from users #

data

一道例题

  这里以2019年的极客大挑战的LoveSQL为例题进行讲解,远程环境可以在BUUCTF上获取。打开远程环境,网站的页面是这样的,给了些许提示表明是sql注入,所以接下来我们直接按照sql注入的一般过程看看。
index

1、确定注入类型
  该题目中有两个输入框,也就是说有两个可以拼接sql的地方,我们在其中任意一个地方进行注入即可。如下截图所示,1' or 1=1 #,这是按照字符型注入的规则输入的万能密码,也就是说后台数据库在查询时,该sql语句的逻辑一定成立。
1
  如下图所示,是尝试字符型注入后的结果,数字型的注入大家可以自己尝试一下,不会成功。
2
2、确定字段数和显示顺序
  在初步尝试登录成功后,回显了一个奇怪的字符串,看起来很像flag,经过各种尝试后发现并不是,所以接下来还是按照sql注入的步骤进行。我们注入1' union select 1, 2, 3 #,注入过程和效果如下图所示,发现Hello处显示了2,Your password is处显示了3,再经过其它测试发现查询的字段数只有3列。结合之前登录成功的界面,可以猜到第2列对应的是用户名,第3列对应的是密码。
3
4
3、获取数据库以及表信息
  这里我将sql注入的步骤融合了,经过前面的注入类型确定和字段数确定,接下来的步骤才是真正寻找信息的过程。如下代码和截图所示,展示了泄露出数据库表信息的过程。

# 注入语句
1' union select 1, 2, group_concat(table_name) from information_schema.tables where table_schema=database() #

5
  根据ctf独特的命名风格,我们猜测大概率flag在表l0ve1ysq1中,接下来是泄露出表字段信息,如下代码和截图所示。

# 注入语句
1' union select 1, 2, group_concat(column_name) from information_schema.columns where table_name="l0ve1ysq1" #

6
  最后看一下表中的数据到底是啥,可以发现flag在password字段中,由于数据太长,flag前半部分在右边无法全部截图。

# 注入语句
1' union select 1, 2, group_concat(password) from l0ve1ysq1 #

7
  当然进一步确定flag所在id后,可以这样打印出来。

# 注入语句
1' union select 1, 2, group_concat(password) from l0ve1ysq1 where id=16 #

7

总结

不忘初心,砥砺前行!


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

相关文章

细说——SQL注入

目录 SQL是什么?什么是SQL注入漏洞原理漏洞原因为什么会有SQL注入注⼊点可能存在的位置漏洞危害提交方法判断注入点判断字符型还是数字型sql注入绕过获取网站路径SQL 注入读写文件1. 数据库支持文件读写2. 当前用户具有文件权限3. 知道文件绝对路径 查询方式及报错盲…

什么是SQL注入

什么是sql注入? 既然你会来看这篇文章,说明你和写这篇文章时的我一样,是个安全小白。不管你是以何种原因想要了解“什么是sql注入”,我都希望这篇文章尽可能地会给你一点收获。 两个通俗的概念 SQL 注入就是指 web应用程序对用户…

SQL注入(一)—— sql手动注入实操

SQL SQL注入sql 注入的核心 SQL 手注的一般流程判断注入点 —— 第一步判断字段数 —— 第二步判断回显点 —— 第三步查询相关内容 —— 第四步判断库名判断表名判断列名查询具体信息 总结 SQL注入 SQL注入攻击是目前web应用网络攻击中最常见的手段之一,曾被冠以 “…

【SQL注入-01】SQL语句基础及SQL注入漏洞原理及分类

目录 1 SQL注入概述1.1 SQL注入简介1.2 SQL注入原理(掌握)1.3 SQL注入漏洞的危害(掌握) 2 SQL注入漏洞分类2.1 注入位置分类(掌握)2.2 注入数据类型分类(掌握)2.3 注入手法分类&…

SQL注入详解(全网最全,万字长文)

漏洞原因 一些概念: SQL:用于数据库中的标准数据查询语言。 web分为前端和后端,前端负责进行展示,后端负责处理来自前端的请求并提供前端展示的资源。 而数据库就是存储资源的地方。 而服务器获取数据的方法就是使用SQL语句进…

sql注入基础原理(超详细)

一、Sql注入简介 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。 二、Web 程序三层架构 三层架构(3-tier architecture) 通常意义上就…

数据库存储过程语法

mysql 5.0存储过程学习总结 一.创建存储过程 1.基本语法: create procedure sp_name() begin ……… end 2.参数传递 二.调用存储过程 1.基本语法:call sp_name() 注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递…

存储过程语法--变量

目录 实例演示 定义默认值并使用 定义赋值再使用 定义2变量,通过查询表内数据进行赋值并使用 定义变量declare 变量名 数据类型 [default 默认值];变量赋值方式一set 变量名 变量值;变量赋值方式二select 列名 into 变量名 from 表名 [where 条件]; 实例演示 定义…

mysql 5.0存储过程(包括语法,符号)

一.创建存储过程 1.基本语法: create procedure sp_name() begin ……… end 2.参数传递 二.调用存储过程 1.基本语法:call sp_name() 注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递 三.删除存储过程 1.基本语法&a…

Oracle存储过程语法学习

Oracle存储过程: 1.1 第一个存储过程 --创建存储过程 create or replace procedure proc1( p_para1 varchar2, p_para2 out varchar2, p_para3 in out varchar2 )as v_name varchar2(20); begin v_name : 张三; p_para3 : v_name; …

sql存储过程语法详解

一、定义变量 使用关键字declare申明变量: declare 变量名 变量类型 /*简单赋值*/declare a intset a5print a/*select赋值*/declare b nvarchar(10) select b stu_name from dbo.student where stu_id6 print b/*update赋值*/declare c nvarchar(10) upd…

MySQL常用操作之创建存储过程语法详解

MySQL常用操作之创建存储过程语法详解 前言简介语法创建结构变量结构入参变量和出参变量流程控制判断(IF 语句)判断(CASE 语句)循环(LOOP 语句)循环(WHILE 语句)循环(REPEAT 语句)再次循环(ITERATE 语句) 总结参考链接 前言 场景介绍 作为一名Java搬运工,实际开发中…

Oracle 存储过程语法

Oracle 存储过程语法 1. 创建表(测试数据准备) -- 创建用户表 create table TT_USER (USERID NUMBER(10),USERNAME VARCHAR2(255),PASSWORD VARCHAR2(255),SEX VARCHAR2(1) );INSERT INTO TT_USER VALUES (101, zhang, 111, 1); INSERT INTO TT…

mysql存储过程基本语法

本文来说下mysql存储过程基本语法 文章目录 基本语法使用实例变量的使用变量定义declare语句变量赋值用户变量 存储过程的参数in 输入参数out 输出参数inout输入输出参数 本文小结 基本语法 存储过程就是具有名字的一段代码,用来完成一个特定的功能。创建的存储过程…

Oracle存储过程基本语法

后来者居上,不是easy的事情 尤其技术类work,更加如此。都是have one 投入的过程的。尤其开发,还是属于技术壁垒挺高的行业。 创建基本的存储过程 1 CREATE OR REPLACE PROCEDURE MyProName IS 2 BEGIN 3 NULL; 4 END; 行1:CREATE OR REPL…

存储过程常见语法

存储过程常见语法 一、存储过程的概念: 1、存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行 2、存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数…

存储过程的语法讲解

在上一篇文章:别再说不知道什么是存储过程和存储函数了 中简单的介绍了存储过程和存储函数以及其使用。其实存储过程是可以进行编程的,所以可以和其他的编程语言一样使用变量、表达式以及控制结构进行编程,从而实现一些复杂和有用的功能。这篇…

子网掩码的作用

IP地址由网络和主机两部分标识组成 IP地址由“网络标识(网络地址)”和“主机标识(主机地址)”两部分组成。在局域网内相互间通信的网络必须具有相同网络地址,也叫相同的网段,在同一个网段内每个设备的主机…

子网掩码使用详解

一、子网掩码 IP地址是以网络号和主机号来标示网络上的主机的,我们把网络号相同的主机称之为本地网络,网络号不相同的主机称之为远程网络主机,本地网络中的主机可以直接相互通信;远程网络中的主机要相互通信必须通过本地网关&…

什么是子网掩码 子网掩码的作用是什么?

什么是子网掩码 子网掩码的作用是什么? 网络工作人员经常需要与ip和子网掩码等打交道,相信绝大数的朋友都知道IP的意思,但是还不理解子网掩码的意思,下面装机之家小编来为大家介绍下关于子网掩码的相关知识,希望能够对…