0x01[情况讨论]

  • or被过滤,但是未作大小写过滤,可以Or OR oR
  • 可以用 || 尝试绕过 username=admin'||1# 这就是为什么可以尝试万能密码登陆

Image.png

  • or被完全过滤也就意味着order by 没法使用 以及information_schema 没法使用

    • order by 被过滤 如果确定支持联合注入,我们可以直接union select 1,2,3......尝试出正确的列数
    • information_schema数据库记录着COLUMNS TABLES SCHEMATA等结构
      Image.png
      Image.png
    • information_schema被过滤并不意味着我们就没法获取其他有效信息了,下面会讲其他的方法在一定的情况下可以绕过这个限制

0x02[绕过方法]

  • innodb

    • 在Mysql>5.5中的mysql库中,有两个表存放了所有的数据库名与其对应的表名
    • 他们是innodb_table_stats 与 innodb_index_stats

Image.png
Image.png
Image.png
Image.png

  • sys

    • 同样在某些高版本的Mysql中存在着叫sys的数据库
    • 在表 innodb_buffer_stats_by_schema 与 innodb_buffer_stats_by_table 中也能找到相关信息

Image.png
Image.png

select table_name from mysql.innodb_table_stats where database_name='数据库名'

select table_name from mysql.innodb_index_stats where database_name='数据库名'

select object_name from sys.innodb_buffer_stats_by_table where object_schema='数据库名'
  • sys自增表得到信息

    • sys数据库中有schema_auto_increment_columns表记录自增信息
    • 有自增键的表可以在这里面找到痕迹
    • 据说是这样,但我在复现的时候并没找到这个表 buuoj貌似没有这玩意 我自己的环境中这是个空表,可能与我没有自增数据有关

Image.png

  • 当 in 被过滤的时候 可以尝试使用sys中的 schema_table_statistics_with_buffer 表 但是要求mysql版本>5.7
  • 创建测试数据

Image.png
Image.png
Image.png
Image.png
Image.png

  • 然后使用无列名注入
  • 可以参见[GYCTF2020]Ezsqli