SQL注入:报错注入

SQL注入系列文章:
初识SQL注入-CSDN博客

SQL注入:联合查询的三个绕过技巧-CSDN博客

目录

什么是报错注入?

报错注入常用的3个函数

UpdateXML

ExtractValue

Floor

rand(随机数)

floor(向上取整)

count(统计)

group by(分组)


前面两篇和大家分享了SQL注入的基本知识和用法,还有联合查询的三个常用技巧。

那么在本篇中,我会和大家通过复习+练习的形式一起学习一下SQL注入中的报错注入,那么花不多少,我们开始ヾ(◍°∇°◍)ノ゙

什么是报错注入?

在SQL注入的过程中,如果网站的web服务器开启了错误回显,则会被攻击者提供极大的便利

比如说我们可以在sqli-labs的第一关中,闭合'但是不注释后面的其他数据,则前端页面就会直接报错且将报错信息直接展现在页面中

还有就是部分数据库执行出错时hiatus将参数内容添加到错误信息中,如UpdateXML、ExtractValue等函数的第二个参数必须是Xpath格式,当其格式非法时,错误信息中会包含参数的内容,这样我们就可以将需要获取的信息从错误信息中显示出来

报错注入常用的3个函数

  • extractvalue
  • updatexml
  • floor

那么下面就分别使用这三个函数来演示一下SQL的报错注入

UpdateXML

根据Mysql官网的介绍,UpdateXML和ExtractValue这两个都是XML函数,具体的描述如下:

姓名描述
ExtractValue()使用 XPath 表示法从 XML 字符串中提取值
UpdateXML()返回替换的 XML 片段

错误处理。 对于ExtractValue()和 UpdateXML(),使用的 XPath 定位器必须有效,并且要搜索的 XML 必须包含正确嵌套和闭合的元素。如果定位器无效,则会生成错误

传参格式:UpdateXML(xml_target, xpath_expr, new_xml)

xml_target此函数用新的 XML 片段 替换给定 XML 标记片段的单个部分new_xml,然后返回更改后的 XML。被替换的部分 xml_target匹配用户提供的 XPath 表达式xpath_expr 。

这里不需要懂得它的每个参数的具体含义,只需要知道它需要传入三个参数参数即可

从上面的介绍可以看出,UpdateXML函数的xpath,也就是第二个参数,必须要符合规范,否则就会报错,那么就可以利用这一点来进行报错注入:

我们来在sqli-labs的第一关尝试一下

payload:

?id=1%27 and updatexml(1,concat(0x7e,(select user()),0x7e),1)   --+

从报错信息中可以看到显示XPATH的语法错误了,然后后面就是我们注入出的数据库额度用户名

这里我们能够注入成功的原因就是将updatexml的第二个参数传入了一个不符合规范的值,因此就会产生报错,然后我们利用报错,来注入出了用户名

然后我们就可以利用这样的方式再注入出数据库名

有了数据库名称,我们就可以利用information_schema数据库来依次注入出表名,列名,最后注入出具体的数据 

ExtractValue

传参格式:ExtractValue(xml_frag, xpath_expr)

ExtractValue()采用两个字符串参数,一个 XML 标记片段 xml_frag和一个 XPath 表达式 xpath_expr(也称为 定位器);它返回CDATA第一个文本节点的文本 ( ),该文本节点是与 XPath 表达式匹配的一个或多个元素的子元素。

这里同样不需要懂得它的每个参数的具体含义,只需要知道它需要传入两个参数即可

从上面的介绍可以看出,ExtractValue函数的xpath,也就是第二个参数,必须要符合规范,否则就会报错,那么就可以利用这一点来进行报错注入:

这里还是在sqli-labs在第一关进行测试一下:

这里的payload就是与ExtractValue不同的就是少了一个参数,但也是在第二个参数中进行查询

?id=1' and extractvalue(1,concat(0x7e,(select user()),0x7e))--+

当然也可以通过同样的方式查询出数据库的名称:

 后面的就不用再说了,直接注入其他数据即可

Floor

最后一个就是floor函数了

主要的利用语句是 select count(),(floor(rand(0)*2))x from table group by x,导致数据库报错,通过 concat 函数,连接注入语句与 floor(rand(0)*2)函数,实现将注入结果与报错信息回显的注入方式。

这里可以看到利用floor函数进行报错注入会使用几个别的关键字,这里先分别介绍一下:

rand(随机数)

rand() 可以产生一个在0和1之间的随机数。

我们可以在mysql中看一下:

可以看到rand()函数每次都会生成一个<1的随机小数

但是当我们给rand()函数传入一个参数后,那么它的值就会变成固定的了

floor(向上取整)

那么再来看看floor函数,floor() 函数的作用就是返回小于等于括号内该值的最大整数。

在mysql中简单使用一下:

从结果中可以看出,确实如定义的那样,取最小的整数,那么将它和rand()函数配合起来在数据库中使用会有什么效果呢?

可以看到结果全是0,如果换成floor(rand(0)*2)应该就是产生的数就是返回 0 到 2 之间的随机数,再配合 floor() 就可以产生确定的两个数了。也就是 0 和 1: 。试试看:

可以看到这样果然就变得有的只有0和1了

count(统计)

count函数的作用统计结果的记录数。

比如我们需要知道users表中一共有多少条记录,就可以使用count来统计一下

group by(分组)

那么再来看那可能group by,它就是mysql的一个用于分组的函数,直接举一个例子来演示一下:
现在基于password来进行一个分组:

可以看到一共有18条记录

几个函数都已经介绍完了,那么最后再来看一下我们的payload是怎么来的吧:

既然是报错注入,首先就需要先进行报错:

这个报错的意思就是它说group_key的主键重复了

根据前面函数,这句话就是统计后面产生随机数的种类并计算每种数量。

分别产生0 1 1 0 1 1... ,这样0是7个,1是11个,但是最后却产生了报错。

下面分析一下报错的原因:

这个整合然后计数的过程中,中间发生了什么我们是必须要明白的。 首先mysql遇到该语句时会建立一个虚拟表。该虚拟表有两个字段,一个是分组的 key ,一个是计数值 count()。也就对应于实验中的 user_name 和 count()。

然后在查询数据的时候,首先查看该虚拟表中是否存在该分组,如果存在那么计数值加1,不存在则新建该分组。

然后mysql官方有给过提示,就是查询的时候如果使用rand()的话,该值会被计算多次,那这个"被计算多次"到底是什么意思,就是在使用group by的时候,floor(rand(0)*2)会被执行一次,如果虚表不存在记录,插入虚表的时候会再被执行一次,我们来看下floor(rand(0)2)报错的过程就知道了,从上面的函数使用中可以看到在一次多记录的查询过程中floor(rand(0)2)的值是定性的,为011011 (这个顺序很重要),报错实际上就是floor(rand(0)2)被计算多次导致的。

到此,三种常见的报错注入函数和报错注入就介绍和演示完毕了,后面的文章还会和大家分享更多的关于SQL注入的技巧和实验(^▽^)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目性能优化之用compression-webpack-plugin插件开启gzip压缩

背景&#xff1a;vue项目打包发布后&#xff0c;部分js、css文件体积较大导致页面卡顿&#xff0c;于是使用webpack插件compression-webpack-plugin开启gzip压缩 前端配置vue.config.js 先通过npm下载compression-webpack-plugin包&#xff0c;npm i compression-webpack-plug…

服务器基础知识(IP地址与自动化技术的使用)

目录 ip地址是什么&#xff1f; 如何查看ip地址 Windows的命令提示符 图形化版本&#xff1a; 自动化技术的应用与意义 ip地址是什么&#xff1f; IP地址的主要作用是**为互联网上的每个网络和每台主机分配一个逻辑地址**。 它由32位二进制数字组成&#xff0c;通常分为四…

微信小程序(十七)自定义组件生命周期(根据状态栏自适配)

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.获取手机状态栏的高度 2.验证attached可以修改数据 3.动态绑定样式数值 源码&#xff1a; myNav.js Component({lifetimes:{//相当于vue的created,因为无法更新数据被打入冷宫created(){},//相当于vue的mount…

Docker数据卷挂载(以容器化Mysql为例)

数据卷 数据卷是一个虚拟目录&#xff0c;是容器内目录与****之间映射的桥梁 在执行docker run命令时&#xff0c;使用**-v 本地目录&#xff1a;容器目录**可以完成本地目录挂载 eg.Mysql容器的数据挂载 1.在根目录root下创建目录mysql及三个子目录&#xff1a; cd ~ pwd m…

2982. 找出出现至少三次的最长特殊子字符串 II

字典树思路 用字典树搞一下就好了&#xff0c;比如aaaaa &#xff1a; a存5次 aa 4次以此类推&#xff5e; 字典树板子复习&#xff1a;P8306 【模板】字典树 这里这个清空方式 很好 因为很多时候memset T #include<iostream> #include<cstring> using namesp…

TensorFlow2实战-系列教程2:神经网络分类任务

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、Mnist数据集 下载mnist数据集&#xff1a; %matplotlib inline from pathlib imp…

蓝桥杯省赛无忧 编程13 肖恩的投球游戏

#include <iostream> #include <vector> using namespace std; int main() {int n, q;cin >> n >> q;vector<int> a(n 1);vector<int> diff(n 2, 0); // 初始化差分数组// 读取初始球数&#xff0c;构建差分数组for (int i 1; i < …

Redis 击穿、穿透、雪崩产生原因解决思路

大家都知道&#xff0c;计算机的瓶颈之一就是IO&#xff0c;为了解决内存与磁盘速度不匹配的问题&#xff0c;产生了缓存&#xff0c;将一些热点数据放在内存中&#xff0c;随用随取&#xff0c;降低连接到数据库的请求链接,避免数据库挂掉。需要注意的是&#xff0c;无论是击穿…

IDEA 安装阿里Java编码规范插件

1.File>Settings 2.安装之后重启 开发过程中如果有不符合规范的地方&#xff0c;会自动出现提示

硬件知识(1) 手机的长焦镜头

#灵感# 手机总是配备好几个镜头&#xff0c;研究一下 目录 手机常配备的摄像头&#xff0c;及效果举例 长焦的焦距 焦距的定义和示图&#xff1a; IPC的焦距和适用场景&#xff1a; 手机常配备的摄像头&#xff0c;及效果举例 以下是小米某个手机的摄像头介绍&#xff1a…

SpringBoot中集成XXL-JOB分布式任务调度平台,轻量级、低侵入实现定时任务

场景 XXL-JOB 分布式任务调度平台XXL-JOB XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 特性&#xff1a; 1、简单&#xff1a;支持通过Web页面对任务进行CRUD操作&#xff0c;操作简单&#xff0c;一分钟上手&…

Redis 可以代替 MySQL 作为数据库吗?

文章目录 前言1.连接到Redis服务器&#xff1a;2.存储和获取数据&#xff1a;3.列表操作&#xff1a;4.有序集合操作&#xff1a;5.键过期和删除&#xff1a;a.发布和订阅消息&#xff1a;b.实现分布式锁&#xff1a;c.使用Redis实现缓存功能&#xff1a; 前言 当使用Redis作为…