Web渗透-MySql-Sql注入:联合查询注入

SQL注入(SQL Injection)是一种网络攻击技术,攻击者通过将恶意的SQL代码插入到应用程序的输入字段,从而欺骗应用程序执行未经授权的操作。这种攻击方式可以导致严重的安全问题,包括:

数据泄露:攻击者可以未经授权地访问和检索数据库中的敏感数据。
数据篡改:攻击者可以修改、删除或添加数据库中的数据。
身份冒充:攻击者可以冒充其他用户,包括管理员,从而获得更高的权限。
拒绝服务:通过破坏数据库或使其负载过重,使得数据库无法正常提供服务。

SQL注入的常见类型

联合查询注入(Union-based Injection):利用UNION语句将恶意查询与合法查询合并。

首先来说明一下联合查询:

联合查询(Union Query)是一种SQL操作,用于将多个SQL查询的结果组合在一起。联合查询使用UNION关键字连接两个或多个SELECT语句的结果集;每个查询的结果集必须具有相同数量的列,并且对应列的数据类型必须兼容。

假设有两个表usersmember,他们都有一些相同的列,例如idname

user:
+----+----------+----------------------------------+-------+
| id | username | password                         | level |
+----+----------+----------------------------------+-------+
|  1 | admin    | e10adc3949ba59abbe56e057f20f883e |     1 |
|  2 | pikachu  | 670b14728ad9902aecba32e22fa4f6bd |     2 |
|  3 | test     | e99a18c428cb38d5f260853678922e03 |     3 |
+----+----------+----------------------------------+-------+
​
​
member:
+----+----------+----------------------------------+
| id | username | pw                               |
+----+----------+----------------------------------+
|  1 | vince    | e10adc3949ba59abbe56e057f20f883e |
|  2 | allen    | e10adc3949ba59abbe56e057f20f883e |
|  3 | kobe     | e10adc3949ba59abbe56e057f20f883e |
|  4 | grady    | e10adc3949ba59abbe56e057f20f883e |
|  5 | kevin    | e10adc3949ba59abbe56e057f20f883e |
|  6 | lucy     | e10adc3949ba59abbe56e057f20f883e |
|  7 | lili     | e10adc3949ba59abbe56e057f20f883e |
+----+----------+----------------------------------+

此时,我们希望查询所有用户的idusername,就可以使用联合查询;

select id,username from users union select id,username from member;

这个查询将返回所有usersmemberidname,并且会去除重复的记录(如果有的话),此时查询的结果为:

联合查询是一种强大的SQL工具,允许你将多个查询的结果集组合在一起,形成一个综合结果集;联合查询注入中,攻击者利用这一特性,将自己的查询结果与原查询结果联合,从而窃取或篡改数据。

此时我们以pikachu靶场中的sql注入漏洞(字符型注入)为例子讲述联合查询注入的利用;

首先需要知道一个用户名,此处以kobe用户名为例子;

此时可以看到回显正常,并且输出回显了uidemail等数据,说明我们可以尝试测试一下此处是否存在sql注入漏洞;最简单的方式:我们可以在上述输入的kobe后加上一个单引号(’)或双引号("),如果页面回显报错信息则表示此处存在sql注入漏洞;

回显结果明显为Mysql的sql语句报错,表明此处存在sql注入漏洞:

报错原因:我们将此处提交的数据放入靶场的程序源码中的查询语句中进行解释;

这个时候将我们输入的数据kobe'带入$name变量中:此时sql语句则会产生语法错误进而报错。

select id,email from member where username='kobe''   #报错

按照常规的步骤,接着我们就应该判断该注入点类型,但是由于此处的输入为username,那么此时就无需再进行判断了,此处的注入类型为字符型;

①字符型注入判断依据:

kobe' and 1=1 --+ 回显正常
kobe' and 1=2 --+ 无回显

为了方便理解,此时我们将上述语句带入源码中的sql语句中:

select id,email from member where username='kobe' and 1=1 --+'   回显正常
select id,email from member where username='kobe' and 1=2 --+'   无回显

②若是注入类型为整型,语句为:

数字 and 1=1 回显正常
数字 and 1=2 无回显

接着可以进行列数判断(查询得到的数据列数,后面进行联合查询时需要用到),判断列数需要使用order by子句,ORDER BY 子句在 MySQL 中用于对查询结果按照列进行排序,ORDER BY 子句后跟上对应数字则表示对对应列进行排序,如order by 3 则表示对第3列进行排序,如果指定的列数过大,大于查询结果的列数,则语句会报错。

kobe' order by 3 --+  #报错,说明查询到的数据小于3列
kobe' order by 2 --+  #正常回显,表明查询到的数据为2列

接着就可以使用联合查询进行注入,联合查询数字1和数字2,进行回显位置的查看;

name=kobe' and 1=2 union select 1,2 --+

查询数据库名

接着我们就可以自行选择一个回显位置进行查询,如果此时我想在数字2的位置查询出当前的数据库名,那么语句就可以这样写:

kobe' and 1=2 union select 1,database() --+

DATABASE() 函数在 MySQL 中用于返回当前使用的数据库的名称;此时我们可以得知此时该网站所对应的数据库库名为pikachu;数据库名查询出来后就可以接着查询该数据库中的表、列(此时我们并不知道该数据库中有哪些表,表中有哪些列)最后脱取数据,所以此时我们需要获取该数据库中所有表的表名,具体语句:

kobe' and 1=2 union select 1,table_name from information_schema.tables where table_schema="pikachu" --+

获取到的结果:

information_schema是 MySQL 中的一个虚拟数据库,它包含有关数据库元数据的信息; 提供了一种方式来查询关于数据库、表、列、索引、权限等的详细信息;而INFORMATION_SCHEMA数据库中的tables表在包含了有关数据库中所有表的信息,table_name为存储表名的段,table_schematables表中存储数据库名的段。

查询数据表名

表名查询完毕后则可以继续查询表中的列名,此处我们以users表为例子进行演示,具体例子;

kobe' and 1=2 union select 1,column_name from information_schema.columns where table_schema="pikachu" and table_name="users" --+

information_schema数据库中的COLUMNS 表在 MySQL 中包含了有关数据库中所有列的信息,column_nameCOLUMNS 表中存取所有表的列名的列;where后指定要获取列名的表,查询的结果为:

获取数据

获得表名和列名后,就可以导出表中的数据了,具体的语句:

kobe' and 1=2 union select 1,group_concat(username,"-",password) from users --+

kobe':这是注入的开始,kobe' 可能是一个用户输入的部分,这里故意闭合了前面的引号,目的是结束原始的SQL语句。

and 1=2:这是一个总是返回 false 的条件。通过添加这个条件,可以确保原始查询的结果集为空。

union select 1,group_concat(username,"-",password) from users:UNION 操作符用于合并两个查询的结果集。

select 1, group_concat(username, "-", password) from users 是攻击者的恶意查询部分。

  • group_concat(username, "-", password)usernamepassword 列连接起来,并用 - 分隔,返回一个字符串列表,GROUP_CONCAT() 是 MySQL 中的一个聚合函数,用于将多行的值连接成一个字符串。这个函数通常用于在查询结果中合并多行的数据,并将它们以指定的分隔符连接起来。这个查询将试图从 users 表中获取所有用户名和密码,并以 - 分隔。

--+:

  • -- 是SQL注释符号,后面的部分(包括 +)将被忽略,这样可以确保剩余的SQL代码不会影响注入的查询。

此时数据(账号、密码)导出情况:

此时密码为密文,需要通过一些解密方法进行解密。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/657209.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HCIP-Datacom-ARST自选题库__BGP多选【22道题】

1.BGP认证可以防止非法路由器与BGP路由器建立邻居,BGP认证可以分为MD5认证和Keychain认证,请问以下哪些BGP报文会携带BCGP Keychain认证信息?(报头携带) open Update Notication Keepalive 2.传统的BGP-4只能管理IPv4单播路由信息,MP-B…

数据库(10)——图形化界面工具DataGrip

以后关于数据库的图片演示就使用DataGrip了 : ) 创建数据库和表 在连接上数据库之后,可以选择Schema创建一个新的数据库。 点击OK后,就已经创建了一个空的表。 要在数据库中建立一张新的表,右键数据库,点击new table 要给新表添…

【软考】下篇 第19章 大数据架构设计理论与实践

目录 大数据处理系统架构特征Lambda架构Lambda架构介绍Lambda架构实现Lambda架构优缺点Lambda架构与其他架构模式对比 Kappa架构Kappa架构介绍Kappa架构实现Kappa架构优缺点 常见Kappa架构变形(Kappa、混合分析系统)Kappa架构混合分析系统的Kappa架构 La…

数组长度属性的安排与深度学习中的数据类型探索

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、数组长度属性的理解与应用 1. 数组形状信息的获取 2. 数组形状的变换 3. 数组类型的指…

关于本人VIP付费文章说明

郑重声明:我写博客只是为了记录分享经验 自从上次写完数据结构系列后我就一直没有登陆,目前也没打算继续开新内容。今天偶然发现我之前写的文章被设为vip文章,要vip解锁才能看,我很确定当初我发布的时候选择的是公开,…

SpirngMVC框架学习笔记(一):SpringMVC基本介绍

1 SpringMVC 特点&概述 SpringMVC 从易用性,效率上 比曾经流行的 Struts2 更好 SpringMVC 是 WEB 层框架,接管了 Web 层组件, 比如控制器, 视图, 视图解析, 返回给用户的数据格式, 同时支持 MVC 的开发模式/开发架构SpringMVC 通过注解,…

【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路

目录 一、污点(Taint) 1.1污点介绍 1.2污点的组成格式 1.3当前 taint effect 支持如下三个选项: 1.4污点的增删改查 1.4.1验证污点的作用——NoExecute 1.4.2验证污点的作用——NoSchedule 1.4.3 验证污点的作用——PreferNoSchedule 1.5污点的配置与管理…

单链表的相关题目

1.删除链表中给定值val的所有结点 public void removeall(int key) {//由于是删除链表中所有和key值相同的结点,所以可以设置两个ListNode类型的数据,一个在前面,一个在后面.//直到前面的走到链表的最后,这样完成了遍历.//先判断一下这个链表是否为空if(headnull){System.out.…

脑图工具 在学习系统架构中的使用

系统,有人把它比作一个黑盒,有人比作一个树洞。呃,其实二者都隐含的表达了一个意思,盘根错节,一言难尽,欲说还休,说了又像是隔靴搔痒,感觉没说透。 学习,理解和展示一个…

边缘计算网关的用途及其使用方法-天拓四方

在数字化日益深入的今天,边缘计算网关作为一种重要的设备,正在越来越多地被应用于各种场景中。它不仅能够提升数据处理的速度和效率,还能在降低网络延迟的同时确保数据的安全性。本文将详细介绍边缘计算网关的用途及其使用方法,帮…

MFC里的工具栏按钮图标如何使用外部图片?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

Revit——(2)模型的编辑、轴网和标高

目录 一、关闭缩小的隐藏窗口 二、标高(可创建平面,其他标高线复制即可) 三、轴网 周围的四个圈和三角表示四个里面,可以移动,不要删除 一、关闭缩小的隐藏窗口 二、标高(可创建平面,其他标…

[书生·浦语大模型实战营]——在茴香豆 Web 版中创建自己领域的知识问答助手

茴香豆是一个基于LLM的领域知识助手,可以用于解答群聊中的问题。接下来是创建过程。 1.打开茴香豆Web版,创建自己的领域库。 地址:茴香豆Web版 这里类似于注册账号,你输入知识库的名称以及密码,然后它就会创建一个知识…

Collection(一)[集合体系]

说明&#xff1a;Collection代表单列集合&#xff0c;每个元素&#xff08;数据&#xff09;只包含一个值。 Collection集合体系&#xff1a; Collection<E> 接口 (一&#xff09;List<E> 接口 说明&#xff1a;添加的元素是有序、可重复、有索引。 1. ArrayLi…

Ai终点站,全系统商业闭环矩阵打造,帮电商、实体降70%成本,12款Ai联合深度实战

说白了&#xff0c;你之前5个人的团队&#xff0c;当团队人数不变的情况下&#xff0c;借助于ChatGPT和各种软件的结合&#xff0c;赋能电商直播带货&#xff0c;可以让之前一年销售额2.000万变成2.500万或者是3.000万&#xff0c;这就是这套课程的核心作用: 【1】系统课程从1…

SpringCloud之SSO单点登录-基于Gateway和OAuth2的跨系统统一认证和鉴权详解

单点登录&#xff08;SSO&#xff09;是一种身份验证过程&#xff0c;允许用户通过一次登录访问多个系统。本文将深入解析单点登录的原理&#xff0c;并详细介绍如何在Spring Cloud环境中实现单点登录。通过具体的架构图和代码示例&#xff0c;我们将展示SSO的工作机制和优势&a…

Excel单元格格式无法修改的原因与解决方法

Excel单元格格式无法更改可能由多种原因造成。以下是一些可能的原因及相应的解决方法&#xff1a; 单元格或工作表被保护&#xff1a; 如果单元格或工作表被设置为只读或保护状态&#xff0c;您将无法更改其中的格式。解决方法&#xff1a;取消单元格或工作表的保护。在Excel中…

【接口测试_04课_Jsonpath断言、接口关联及加密处理】

一、Jasonpath的应用 JsonPath工具网站&#xff1a;JSONPath解析器 - 一个工具箱 - 好用的在线工具都在这里&#xff01; 1、JSONPath的手写与获取 手写JSONPath 1、 $ &#xff08;英文美元符号&#xff09;代表外层的{} . &#xff08;英文句号&#xff09;表示当前…

分频器对相位噪声影响

本文我们将分析输入时钟被N分频之后的输出时钟的相位噪声如何变化。首先理想分频器的意思是我们假设分频器不会引入附加相位噪声&#xff0c;并且输入和输出时钟之间没有延时。我们假设每一个输出边沿的位置都完美的与输入边沿相对齐&#xff0c;这样便于分析。由于每N个输入时…

Java内存空间

Java内存空间划分 Java虚拟机在执行Java程序的过程中会把他管理的内存划分为若干个不同的数据区域&#xff0c;如图所示1.7和1.8两个版本的Java内存空间划分。 JDK1.7: JDK1.8: 线程私有&#xff1a; 程序计数器虚拟机栈本地方法栈 线程共享 &#xff1a; 堆方法区直接内…