首页 > 数据库 >SQL注入

SQL注入

时间:2023-05-05 22:22:39浏览次数:45  
标签:-- 数据库 应用程序 查询 SQL 攻击者 注入

一、定义

SQL 注入 (SQLi) 是一个 Web 安全漏洞,允许攻击者干扰应用程序对其数据库进行的查询。它通常允许攻击者查看他们通常无法检索的数据。这可能包括属于其他用户的数据,或应用程序本身能够访问的任何其他数据。在许多情况下,攻击者可以修改或删除此数据,从而导致应用程序的内容或行为发生持续更改。

在某些情况下,攻击者可以升级 SQL 注入攻击以危害底层服务器或其他后端基础结构,或执行拒绝服务攻击。

二、SQL注入示例

SQL注入漏洞、攻击和技术种类繁多,出现在不同的情况下。一些常见的 SQL 注入示例包括:

  • 检索隐藏数据,您可以在其中修改 SQL 查询以返回其他结果。
  • 颠覆应用程序逻辑,您可以在其中更改查询以干扰应用程序的逻辑。
  • UNION 攻击,您可以在其中从不同的数据库表中检索数据。
  • 检查数据库,您可以在其中提取有关数据库版本和结构的信息。
  • 盲 SQL 注入,其中您控制的查询结果不会在应用程序的响应中返回。

1.检索隐藏数据

考虑一个显示不同类别产品的购物应用程序。当用户单击“礼品”类别时,其浏览器会请求 URL:

https://insecure-website.com/products?category=Gifts

这会导致应用程序进行 SQL 查询,以从数据库中检索相关产品的详细信息:

select * from products where category = 'Gifts' and released = 1

该应用程序不会针对 SQL 注入攻击实现任何防御措施,因此攻击者可以构建如下攻击:

https://insecure-website.com/products?category=Gifts'--

这将导致 SQL 查询:

select * from products where category = 'Gifts'--' and released = 1

这里的关键是双破折号序列是 SQL 中的注释指示符,这意味着查询的其余部分被解释为注释。这将有效地删除查询的其余部分。这意味着将显示所有产品,包括未发布的产品。--AND released = 1

更进一步,攻击者可以使应用程序显示任何类别中的所有产品,包括他们不知道的类别:

https://insecure-website.com/products?category=Gifts'+OR+1=1--

这将导致 SQL 查询:

select * from products where category = 'Gifts' OR 1=1--' AND released = 1

由于1=1始终为 true,因此查询将返回所有项。

2.颠覆程序应用逻辑

考虑一个允许用户使用用户名和密码登录的应用程序。如果用户提交用户名和密码,应用程序将通过执行以下 SQL 查询来检查凭据:wiener bluecheese

select * from users where username = 'wiener' and password = 'bluecheese'

如果查询返回用户的详细信息,则登录成功。否则,将被拒绝。

在这里,攻击者只需使用 SQL 注释序列从查询子句中删除密码检查,即可在没有密码的情况下以任何用户身份登录。

例如,提交用户名和空白密码会导致以下查询:--WHERE administrator'--

select * from users where username = 'administrator'--' and password = ''

此查询返回用户名为administrator的用户,并成功将攻击者登录到该用户。

3.从其他数据库表中检索数据

如果 SQL 查询的结果在应用程序的响应中返回,攻击者可以利用 SQL 注入漏洞从数据库中的其他表中检索数据。这是使用关键字UNION SELECT完成的,该关键字允许您执行其他查询并将结果追加到原始查询。

例如,如果应用程序执行以下包含用户输入“礼物”的查询:

select name,description from products where category = 'Gifts'

然后,攻击者可以提交输入:

' union select username,password from users--

这将导致应用程序返回所有用户名和密码以及产品的名称和描述。

4.检查数据库

在初步识别 SQL 注入漏洞后,获取有关数据库本身的一些信息通常很有用。这些信息通常可以为进一步利用铺平道路。

您可以查询数据库的版本详细信息。执行此操作的方式取决于数据库类型,因此您可以从任何有效的技术推断数据库类型。例如,在 Oracle 上,您可以执行:

select * from v$version

您还可以确定存在哪些数据库表以及它们包含哪些列。例如,在大多数数据库上,可以执行以下查询来列出表:

select * from information_schema.tables

5.盲SQL注入漏洞

许多 SQL 注入实例都是盲目漏洞。这意味着应用程序不会在其响应中返回 SQL 查询的结果或任何数据库错误的详细信息。盲漏洞仍然可以被利用来访问未经授权的数据,但所涉及的技术通常更复杂且难以执行。

根据漏洞的性质和所涉及的数据库,可以使用以下技术来利用盲SQL注入漏洞:

  • 您可以更改查询的逻辑,以根据单个条件的真实情况触发应用程序响应中的可检测差异。这可能涉及将新条件注入到某些布尔逻辑中,或有条件地触发错误,例如除以零。
  • 您可以在查询处理过程中有条件地触发时间延迟,从而允许您根据应用程序响应所需的时间推断条件的真实性。
  • 您可以使用 OAST 技术触发带外网络交互。这种技术非常强大,在其他技术不起作用的情况下有效。通常,您可以通过带外通道直接泄露数据,例如,将数据放入您控制的域的 DNS 查找中。

 

标签:--,数据库,应用程序,查询,SQL,攻击者,注入
From: https://www.cnblogs.com/alinSong/p/17375535.html

相关文章

  • 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 需要的效果是将同一库区下的仓库的仓库名合并到同一字段中在进行查询,就是下图的效果--将多个查询出的字段拼接到一个......
  • MySQL查出所有的主外键关系、级联关系,并记录起来,删除所有的外键关系,根据记录重新建立
    查出所有的主外键关系并记录起来可以通过查询information_schema数据库中的REFERENTIAL_CONSTRAINTS表来获取所有的主外键关系。以下是查询语句:`SELECTK.CONSTRAINT_NAME,--外键约束名K.TABLE_NAME,--子表外键所在表名K.COLUMN_NAME,--外键所在列名......
  • MySQL 8.0关闭binlog
    MySQL8.0关闭binlog默认开启binlog,即使在my.ini或my.cnf的[mysqld]部分没有log_bin或log_bin=mysql-binbinlog默认在Linux的/var/lib/mysql目录下,文件名为binlog.000001格式,在Windows的data目录下,文件名为binlog.000001格式相当于默认有log_bin=binlog参数如果需要关闭......
  • 【解决】mysql本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用
    在计算机管理中启动时,发现mysql报错:mysql本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。该问题的解决方式为:1找到Mysql的安装路径,看看有没有data文件夹,如果没有data文件夹,自己重新建一个;如果有的话,就把里面的内容全部清空,但保留该目录......