首页 > 数据库 >SQL注入UNION攻击

SQL注入UNION攻击

时间:2023-05-05 23:33:49浏览次数:47  
标签:UNION 查询 -- SQL null 注入

1.SQL注入UNION攻击

当应用程序容易受到 SQL 注入的攻击并且查询结果在应用程序的响应中返回时,该UNION关键字可用于从数据库中的其他表中检索数据。这会导致 SQL 注入 UNION 攻击。

关键字UNION SELECT允许您执行一个或多个其他查询,并将结果追加到原始查询。例如:

SELECT a, b FROM table1 UNION SELECT c, d FROM table2

要使UNION查询正常工作,必须满足两个关键要求:

  • 各个查询必须返回相同数量的列。
  • 每列中的数据类型必须在各个查询之间兼容。

要执行 SQL 注入 UNION 攻击,您需要确保您的攻击满足这两个要求。这通常涉及弄清楚:

  • 从原始查询返回多少列?
  • 从原始查询返回的哪些列具有适合保存注入查询结果的数据类型?

2.确定 SQL 注入 UNION 攻击中所需的列数

执行 SQL 注入 UNION 攻击时,有两种有效的方法可以确定从原始查询返回的列数。

2.1 注入一系列子句并递增指定的列索引,直到发生错误。

例如:假设注入点是原始查询子句中的带引号的字符串,则应提交:ORDER BY WHERE

' order by 1--
' order by 2--
' order by 3--
etc

这一系列有效负载修改原始查询,以按结果集中的不同列对结果进行排序。子句中的列可以通过其索引指定,因此您无需知道任何列的名称。当指定的列索引超过结果集中的实际列数时,数据库将返回错误

应用程序实际上可能在其 HTTP 响应中返回数据库错误,或者它可能返回一般错误,或者只是不返回任何结果。如果可以检测到应用程序响应中的一些差异,则可以推断从查询返回的列数。

2.2 提交一系列有效负载,指定不同数量的空值
' union select null--
' union select null,null--
' union select null,null,null--
etc.

如果空值数与列数不匹配,数据库将返回错误

注意:

  • 在 Oracle 上,每个查询都必须使用该关键字并指定有效的表。Oracle 上有一个内置表,可用于此目的。因此,在 Oracle 上注入的查询需要如下所示:

    ' union select null from dual--
  • 所描述的有效负载使用双短划线注释序列在注入点之后注释掉原始查询的其余部分。在MySQL上,双破折号--序列后必须跟一个空格。或者,哈希字符#可用于标识注释。

3.在 SQL 注入 UNION 攻击中查找具有有用数据类型的列

执行 SQL 注入 UNION 攻击的原因是能够从注入的查询中检索结果。通常,要检索的有趣数据将采用字符串形式,因此需要在原始查询结果中找到数据类型为字符串数据或与字符串数据兼容的一个或多个列。

确定所需列数后,可以探测每列,通过提交一系列有效负载(依次将字符串值放入每列)来测试它是否可以保存字符串数据。

例如,如果查询返回四列,则应提交

' union select 'a',null,null,null--
' union select null,'a',null,null--
' union select null,null,'a',null--
' union select null,null,null,'a'--

如果列的数据类型与字符串数据不兼容,则注入的查询将导致数据库错误.

4.使用 SQL 注入 UNION 攻击检索相关数据

确定原始查询返回的列数并找到哪些列可以保存字符串数据后,就可以检索感兴趣的数据。

假设:

  • 原始查询返回两列,这两列都可以保存字符串数据。
  • 注入点是WHERE子句中的带引号的字符串。
  • 数据库包含一个调用的表users,其中包含列username和password 。

在这种情况下,您可以通过提交输入来检索表的内容:

' union select username,password from users--

当然,执行此攻击所需的关键信息是有一个users表,其中有两列名为 username和 password。如果没有此信息,您将只能尝试猜测表和列的名称。事实上,所有现代数据库都提供了检查数据库结构的方法,以确定它包含哪些表和列。

5.检索单个列中的多个值

在前面的示例中,假设查询仅返回单个列。

通过将值连接在一起,您可以轻松地在此单个列中检索多个值,理想情况下包括合适的分隔符以区分组合值。

Oracle 上,您可以提交输入:

' union select username || '~' || password from users--

这使用双管道序列||,该序列是 Oracle 上的字符串连接运算符。注入的查询将username 和 password字段的值连接在一起,用字符~分隔。

注意,不同的数据库使用不同的语法来执行字符串串联。有关更多详细信息,请参阅 SQL 注入备忘单

标签:UNION,查询,--,SQL,null,注入
From: https://www.cnblogs.com/alinSong/p/17375674.html

相关文章

  • MySQL----索引的创建、删除和查看
    1.索引作用  在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍。  例如,有3个未索引的表t1、t2、t3,分别只包含列c1、c2、c3,每个表分别含有1000行数据......
  • MySQL----数据库的安装、创建
    一、MySQL的安装。。。。。 二、MySQL实例的创建注意:停掉MySQL的服务(我的电脑---管理---服务) 如果实例一次创建不成功,第二次创建时会遇到如下错误:mysql安装出现errorNr.1045我们在windows下安装mysql时会出现Accessdeniedforuser'root'@localhost'(usingpassword:No)的问......
  • SQL注入
    一、定义SQL注入(SQLi)是一个Web安全漏洞,允许攻击者干扰应用程序对其数据库进行的查询。它通常允许攻击者查看他们通常无法检索的数据。这可能包括属于其他用户的数据,或应用程序本身能够访问的任何其他数据。在许多情况下,攻击者可以修改或删除此数据,从而导致应用程序的内容或......
  • yaml配置注入
    配置文件SpringBoot使用一个全局的配置文件,配置文件名称是固定的application.properties语法结构:key=valueapplication.yml语法结构:key:空格value配置文件的作用:修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了yaml注入配置文件yaml可......
  • linux安装tomcat,mysql
    环境:centos7.6ssh连接工具:tabby安装tomcat创建目录mkdir/opt/tomcat获取tomcat:1.自己百度下载2.我这里提供百度网盘链接:https://pan.baidu.com/s/1wgLq5W8PCKFkgl_2IPh41A提取码:2du6上传注意:根据自己的ssh连接工具,下面我以tabby工具为例。右上角点击SFTP,鼠标......
  • SQL 优化 20 连问
    作者:String、codehttps://blog.csdn.net/Lxl1418/article/details/126717598一、查询SQL尽量不要使用select*,而是具体字段1、反例SELECT*FROMuser2、正例SELECTid,username,telFROMuser3、理由节省资源、减少网络开销。可能用到覆盖索引,减少回表,提高查询效......
  • MySQL:如何实现主从复制?
    简介MySQL主从复制是一个异步的复制过程,底层是基于MySQL数据库自带的二进制日志功能。指一台或多台MySQL数据库(从库,slave)从另一台数据库(主库,master)进行日志的复制、日志解析,最终实现从库数据与主库数据保持一致。 原理1、master将改变记录到二进制日志中。2、slave将mast......
  • linux 安装二进制mysql
    https://www.mysql.com/https://dev.mysql.com/downloads/社区版本https://downloads.mysql.com/archives/community/下载linux-genericproductversion5.7.20operatingsystemlinux-GenericosVersionLinux-Generic(glibc2.12)(x86,64-bit)CompressedTARArchi......
  • mysql8.0 使用navicat报caching_sha2_password' cannot be loaded解决方法
    安装8.0版本的mysql后,使用navicat连接时,报caching_sha2_password'cannotbeloaded的异常。原因为:8.0版本的mysq用户密码加密方式为caching_sha2_password,navicat暂不支持,需要修改下mysql的加密方式。解决过程:#(不建议用root进行连接)#1.登陆mysqlmysql-uroot-p#2.查看......
  • 多个Sql字段拼接为一个字段,并判断是否为空,为空时赋默认值
    在这里记录一下怕后面自己忘了,直接看代码吧,这是我数据库需要查询的两张表--库区表select*fromReservoir--仓库表select*fromWarehouse 需要的效果是将同一库区下的仓库的仓库名合并到同一字段中在进行查询,就是下图的效果--将多个查询出的字段拼接到一个......