Web学习_SQL注入_联合查询注入

news2024/12/24 3:10:09

UNION 操作符用于合并两个或多个 SELECT 语句的结果集, UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句 中的列名,并且UNION 内部的 SELECT 语句必须拥有相同数量的 列。 联合查询注入就是利用union操作符,将攻击者希望查询的语句注入 到正常select语句之后,并返回输出结果。 SQL注入的一般流程为:

1. SQL注入点探测。探测SQL注入点是关键的一步,通过适当的分 析应用程序,可以判断什么地方存在SQL注入点。通常只要带有 输入提交的动态网页,并且动态网页访问数据库,就可能存在 SQL注入漏洞。如果程序员信息安全意识不强,采用动态构造 SQL语句访问数据库,并且对用户的输入未进行有效性验证,则 存在SQL注入漏洞的可能性很大。一般通过页面的报错信息来确 定是否存在SQL注入漏洞。

2. 收集后台数据库信息。不同数据库的注入方法、函数都不尽相 同,因此在注入之前,我们先要判断一下数据库的类型。判断数 据库类型的方法很多,可以输入特殊字符,如单引号,让程序返 回错误信息,我们根据错误信息提示进行判断;还可以使用特定 函数来判断,比如输入"select version()",程序返回正常,说明 version()函数被数据库识别并执行,而version()函数是MySQL特 有的函数,因此可以推断后台数据库为MySQL。

3. 猜解数据库字段。数据库中的表和字段命名一般都是有规律的。 通过构造特殊SQL语句在数据库中依次猜解出表名、字段名、字 段数、用户名和密码。

4. 查找Web后台管理入口。WEB后台管理通常不对普通用户开 放,要找到后台管理的登录网址,可以利用Web目录扫描工具 (如:wwwscan、AWVS)快速搜索到可能的登录地址,然后 逐一尝试,便可以找到后台管理平台的登录网址。

5. 入侵和破坏。一般后台管理具有较高权限和较多的功能,使用前 面已破译的用户名、密码成功登录后台管理平台后,就可以任意 进行破坏,比如上传木马、篡改网页、修改和窃取信息等,还可 以进一步提权,入侵Web服务器和数据库服务器。

判断漏洞是否存在

 根据客户端返回的结果来判断提交的测试语句是否成功被数据库引擎执行,如果测试语句被执行了,说明存在注入漏洞。 一般利用单引号(')或者双引号(")来判断是否存在漏洞,如果出 现SQL语句错误说明有很大的可能会存在漏洞。

比如,访问dvwa靶场: http://127.0.0.1/dvwa/vulnerabilities/sqli/? id=1&Submit=Submit#,此时URL实际向服务器传递了值为1的变量id,此时服务器就会从users表中把满足user_id=1这个条件的行(记 录)的first_name, last_name查询出来:

后端 (phpstudy\PHPTutorial\WWW\DVWA\vulnerabilities\sqli\source\lo w.php)向数据库获取数据的SQL语句为:

SELECT first_name, last_name FROM users WHERE user_id = '$id';

 

再SQL-Font里显示为:

这里我们加了一个   ‘,http://www.dvwa.test/vulnerabilities/sqli/?id=1'&Submit=Submit#

SQL语句就变为了

SELECT first_name, last_name FROM users WHERE user_id = '$id'';

可以看到多了一个单引号,因为单引号不匹配,则会报错。如果能 引起数据库的报错,说明用户是可以对查询语句进行修改的,说明存在漏洞。

判断注入类型

判断注入类型是数字型还是字符型,这涉及到在注入的过程中是否需要添加单引号,可以使用and( 逻辑与)进行判断,,当条件表 达式两边都为真才是真,有一边为假则是假

1 and 1=1

1 and 1=2

如果输入1 and 1=1和1 and 1=2页面的查询结果都返回相同的内容,说明不是数字型注入。既然不是数字型,那就有很大的可能是字符型注入了。

如果是字符型则需要对单引号(')进行闭合,因为MySQL中的引号 都是成双成对出现的。

思考:为什么从以上方法中可以判断出注入的类型呢?

首先回到数字型注入和字符型注入的定义,当用户输入上方的判断语句时,

如果是数字型注入,则SQL语句变成了

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;

如果是字符型注入,则变成了

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';

数据库会把用户输入的内容当成了一体进行查询,大家可以将以上四条语句拿到数据库里执行,前两条语句会返回不一样的内容,后 两条语句会返回相同的内容。

 思考:为什么后两条语句同样是用and,但是输出的内容是相同的?

这个涉及到了MySQL的隐式类型转换。隐式转换隐式转换是自动调用的, 用于实现自动将某种类型的数据转换为另外一种类型的数 据。上面的例子中,user_id是int型,传入的'1 and 1=1'是字符串, 会触发隐式类型转换:

'1 and 1=1'==>1

'2admin' ==>2

'admin'==>0

'33admin'==>33 

所以两条语句都通过转换变为了1。

判断表中列数

 为了方便后续获取数据,需要先知道查询的表中显示的字段数,可以使用order by来进行判断。ORDER BY*语句用于根据指定的列对结果集进行排序。

用法:order by 列名或者order by 列编号。

特性:当order by的数字大于当前的列数时候就会报错,SQL注入利用这个特性来判断列数。

这里我们猜3,发现抱错

 这里我们猜对了列数

图中URL的%23为井号(#)进行了url编码,是为了将SQL语句中多余的单引号注释掉,GET型注入可以使用#号的url编码%23或者--+进行注释

 SELECT first_name, last_name FROM users WHERE user_id = '1' order by 2#';

 确定显示位

 显示位:在一个网站的正常页面,服务端执行SQL语句查询数据库 中的数据,客户端将数据展示在页面中,这个展示数据的位置就叫显示位。

这里我们输入

http://127.0.0.1/test/vulnerabilities/sqli/? id=1'+union+select+1%2C2%23&Submit=Submit#

但我们一般都要把1改为-1,

在实战中,一般不查询union左边的内容,这是因为程序在展示 数据的时候通常只会取结果集的第一行数据,所以,只要让第一行查询的结果是空集,即union左边的select子句查询结果为 空,那么union右边的查询结果自然就成为了第一行,打印在网页上了。所以让union左边查询不到,可以将其改为负数或者改 为比较大的数字。

 获取数据

 以DVWA靶场为例,演示如何获取数据库中的数据

获取数据库名、版本

1' union select version(),database()#

获取数据库表名

-1' union select 1,table_name from information_schema.tables where table_schema='dvwa'#

很多网站只显示1条结果,为了能够输出所有结果,可以使用 group_concat()函数,将多行合并成一行:

-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'#-1' union select 1,table_name from information_schema.tables where table_schema='dvwa' limit 0,1

#group_concat()函数被过滤时,可以使用limit n,1 来逐个输出查询内容

 

 这里的数据库名、表名等的字符串表示,需要用单引号、双引号包裹住,或者可以使用对应的十六进制的形式。

获取某个表中的字段名 

-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='guestbook'#

 

获取字段中的记录 

-1' union select 1,group_concat(comment_id,comment,name) from guestbook#

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【QT5】<总览五> QT多线程、TCP/UDP

文章目录 前言 一、QThread多线程 二、QT中的TCP编程 1. TCP简介 2. 服务端程序编写 3. 客户端程序编写 4. 服务端与客户端测试 三、QT中的UDP编程 1. UDP简介 2. UDP单播与广播程序 前言 承接【QT5】<总览四> QT常见绘图、图表及动画。若存在…

[Vue-常见错误]浏览器显示Uncaught runtime errors

文章目录 错误描述正确写法具体如下 错误描述 当前端代码发生错误时,浏览器中出现以下错误提示。 正确写法 显然这不是我们所期望的,在vue.config.js中配置如下设置关闭Uncaught runtime errors显示 devServer: {client: {overlay: false}具体如下 …

Java核心: 类加载器

这一节我们来学习Java的类加载器,以及常用的类加载器实现URLClassLoader。 1. Java类加载器 类加载器用于将字节码读取并创建Class对象。我们知道JVM本身是用C写的,一开始执行的时候由C程序来加载并引导字节码的运行,这些由C编写的加载字节…

图神经网络(GNN)的原理及应用

什么是图神经网络 (GNN)? 图神经网络 (GNN) 是一种神经网络架构和深度学习方法,可以帮助用户分析图,使他们能够根据图的节点和边描述的数据进行预测。 图形表示数据点(也称为节点&…

ENSP校园网设计实验

前言 哈喽,我是ICT大龙。本次更新了使用ENSP仿真软件设计校园网实验。时间比较着急,可能会有错误,欢迎大家指出。 获取本次工程文件方式在文章结束部分。 拓扑设计 拓扑介绍---A校区 如图,XYZ大学校园网设计分为3部分&#xff0…

硬盘坏了数据能恢复吗 硬盘数据恢复一般多少钱

在数字化时代,我们的生活和工作离不开电脑和硬盘。然而,硬盘故障是一个常见的问题,可能会导致我们的数据丢失。当我们的硬盘坏了,还能恢复丢失的数据吗?今天我们就一起来探讨关于硬盘坏了数据能恢复吗,硬盘…

请求 响应

在web的前后端分离开发过程中,前端发送请求给后端,后端接收请求,响应数据给前端 请求 前端发送数据进行请求 简单参数 原始方式 在原始的web程序中,获取请求参数,需要通过HttpServletRequest 对象手动获取。 代码…

如何在本地和远程删除 Git 分支

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,目前是武汉城市开发者社区主理人 擅长.net、C、python开发, 如果遇…

在线按模板批量生成文本工具

具体请前往:在线按模板批量生成文本工具

【手推公式】如何求SDE的解(附录B)

【手推公式】如何求SDE的解(附录B) 核心思路:不直接求VE和VP的SDE的解xt,而是求xt的期望和方差,从而写出x0到xt的条件分布形式(附录B) 论文:Score-Based Generative Modeling throug…

2024年人工智能与云计算国际会议(ICAICC 2024)

2024 International Conference on Artificial Intelligence and Cloud Computing 【1】大会信息 大会时间:2024-07-19 大会地点:中国长沙 截稿时间:2024-07-05(以官网为准) 审稿通知:投稿后2-3日内通知 会议官网&am…

Pico4 MR Unity零基础开发之开启MR透视

一、新建场景:SeethroughScene 1、新建场景。 二、添加 XR 摄像机进行设置 1、在 Hierarchy 窗口中,右击默认添加的 Main Camera,然后点击 Delete 将其删除。 2、点击 > XR > XR Origin (VR),将 XR Origin 添加至场景 3、…

股票数据集2-纳斯达克NASDAQ 100 分析

1. 数据清洗 用邻近均值的方法,去掉Non_Padding中的NaN数据 这里没用df.fillna(), 因为其只有前向(ffill )和 后向 (bfill) 插值,不适合大量连续的NaN pd转换为np,写一个函数, 返回np数组的空值,lambda的匿名函数返回y轴空值的索…

CSAPP Lab01——Data Lab完成思路

陪你把想念的酸拥抱成温暖 陪你把彷徨写出情节来 未来多漫长再漫长还有期待 陪伴你 一直到 故事给说完 ——陪你度过漫长岁月 完整代码见:CSAPP/datalab-handout at main SnowLegend-star/CSAPP (github.com) 01 bitXor 这道题是用~和&计算x^y。 异或是两个…

mongodb总概

一、mongodb概述 mongodb是最流行的nosql数据库,由C语言编写。其功能非常丰富,包括: 面向集合文档的存储:适合存储Bson(json的扩展)形式的数据;格式自由,数据格式不固定,生产环境下修改结构都可以不影响程序运行;强大的查询语句…

著名AI人工智能社会学家唐兴通谈数字社会学网络社会学主要矛盾与数字空间社会网络社会的基本议题与全球海外最新热点与关注社会结构社会分工数字财富数字游民数字经济

如果人工智能解决了一切,人类会做什么? 这个问题的背后是人工智能时代的社会主要矛盾会是什么?那么整个社会的大的分工体系就会围绕主要矛盾开展。 《人工智能社会主要矛盾》 在农业社会,主要矛盾是人口增长和土地资源之间的关…

atcoder abc357

A Sanitize Hands 问题&#xff1a; 思路&#xff1a;前缀和&#xff0c;暴力&#xff0c;你想咋做就咋做 代码&#xff1a; #include <iostream>using namespace std;const int N 2e5 10;int n, m; int a[N];int main() {cin >> n >> m;for(int i 1…

【日常记录】【JS】中文转拼音的库 pinyin-pro

文章目录 1、介绍2、pinyin-pro 基本使用3、参考链接 1、介绍 pinyin-pro 是一个专业的 JavaScript 中文转拼音的库&#xff0c;具备多音字识别准确、体积轻量、性能优异、功能丰富等特点。 常用的案例 搜索功能增强&#xff1a;在输入框输入汉字时&#xff0c;可以转化为拼音输…

英特尔:AI落地,未来已来

引言 随着AI技术的发展和大模型的普及&#xff0c;人工智能正在逐渐渗透到我们的日常生活中。2023年5月底&#xff0c;我参加了台北的英特尔技术展&#xff0c;深入了解了英特尔在AI个人电脑领域的最新进展。本文将详细介绍英特尔的新一代移动处理器Lunar Lake&#xff0c;以及…

【C51】C51单片机实现的 抽奖机 设计与编程指南

文章目录 前言&#xff1a;1. 实现效果2. 准备工作3. 编写代码总结&#xff1a; 前言&#xff1a; 在本文中&#xff0c;我们将介绍如何使用C51单片机来实现一个简单的抽奖机。这个项目不仅能够展示C51单片机的基本应用&#xff0c;还能让我们了解如何通过编程来控制硬件&…