新增的表
information_schema.TABLESPACES_EXTENSIONS
这个表好用就好用在,它直接存储了数据库和数据表
除了可以用 information_schema.SCHEMA 、information_schema.TABLES 、information.COLUMNS 这些表来获取数据库名、表信息和字段信息,还有一些本身就处在 MySQL 内的表和视图可使用
两表均有database_name和table_name字段
由于performance_schema过于复杂,所以mysql在5.7版本中新增了sys.schemma,基础数据来自于 performance_chema 和 information_schema 两个库,本身数据库不存储数据。
根据MySQL数据库中找的一些表单或视图里面的字段包含了数据库名和表单的信息,还有一些归纳总结
还有一些存储报错语句的和执行状态的表单或视图得知其中含有的数据库名和表单信息
还可利用 information.schema.processlist 表读取正在执行的sql语句,从而得到表名与列名
新增功能
table
官方文档描述和TABLE和SELECT有类似的功能
可以列出表的详细内容
但是与 SELECT 还是有区别的
TABLE始终显示表单中的所有列
TABLE不允许对其进行任何过滤,即TABLE不支持任何WHERE子句
坑点1:符号比较问题
先看如下这种情况
用的是小于号,第一列的值是 mysql,如果是 l 的话确实 l 的 ascii 编码小于 m 的,得到的是1。但是如果是m 的话,就不是小于了而应该是等于,所以预期结果是返回0。
但实际上,这里即使使用小于,比较的结果还是小于等于(≤)。所以需要将比较得到的结果的 ascii编码-1 再转换成字符才可以。
当然,反过来注入,从大的 ascii 编码往下注入到小的就没有这个问题了,例如下方的字符表(去掉了一些几乎不会在mysql创建表中出现的字符)
再来看另一种情况
发现在判断最后一位的时候,情况和之前又不一样了。最后一位的比较时候就是小于(<),而不是小于等于(≤)了。所以对于最后一位需要特别注意。
坑点2:字符转换与大小写问题
先看如下例子
这里id是整型,而我们给出的字符型,当进行比较时,字符型会被强制转换为整型,而不是像之前一样读到了第一位以后没有第二位就会停止,也就是都会强制转换为整型进行比较并且会一直持续下去,所以以后写脚本当跑到最后一位的时候尤其需要注意。
再来讨论一下大小写问题
lower_case_table_names 的值:
由于 MySQL 最初依赖于文件系统来作为其数据字典,因此默认设置是依赖于文件系统是否区分大小写。
对于真正的数据表,如果不加上 binary 的话,是不区分大小写的
value
values 可以构造一个表
values 可以直接接在 union 后面,判断列数,效果同 union select
如果列数不对则会直接报错
样例测试
给出一个关于mysql 8新特性的样例
很明确,禁用了 select,能显示部分结果,空格可以用 /**/ 代替,可以通过 order by 测列数或者通过 union values 判断列数
效果如下
尝试注出数据库
当然这里可以通过以下两句
来判断用户权限和是否可读写,要是可以读写则可以进行如下注入
本地环境为 windows 所以根目录不同
只能输出一个字段的内容,limit只能控制行数,select 是可以控制输出指定字段但是这里不允许,因为是 MySQL版本是 8.0.21 所以我们可以采用 table 和 小于号进行盲注,table 始终显示表的所有列,我们可以注其中一个字段,这里过滤了 or 所以打算采用另一个存储数据库名和表单名的视图 sys.schema_tables_with_full_table_scans, 这个视图本身的数据少方便我们搜寻,过滤了 and 和 or 可以采用 && 或者 ||
可以通过脚本注出第一个参数是 test 后紧接着注第一行第二个字段
第一位字符,MySQL8 此时小于号为小于等于所以第一位当大于 u 时则返回0,也就是 0||0 无数据,但是小于等于 u 时返回为 0||1 返回 id=1 时的数据,通过此方向进行布尔盲注,最后注出 test 数据库中另一个表单名 flagishere。
不知道字段名也可以注入,还是通过 table 猜测字段个数然后带出每个字段的数据
因为只有一位, MySQL8 当作最后一位来看,小于号就是发挥小于的作用,所以强制转换位整型后,0<1返回 1 则输出 id=1 的结果,而 1<1 返回 0 则不输出结果,最后就是总结,写个盲注的脚本
最后
我整理了相关的学习资料和工具,有需要的朋友关注私我哦!!!
【详细】