团队纳新了,为了让小鲜肉们有素材,我写了一些基础的东西。大神勿喷.....
mysql> select database();
+--------------------+
| database() |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)
我当前选中的是information_schema
mysql> show tables;
+---------------------------------------+
| Tables_in_information_schema |
+---------------------------------------+
| CHARACTER_SETS |
| COLLATIONS |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUMNS |
| COLUMN_PRIVILEGES
.
.(此处省略N个)
+---------------------------------------+
40 rows in set (0.00 sec)
这边我们看到它有很多个表。
其中保存着关于MySQL的服务器所维护的所有其他数据库的信息。所有数据库名的信息、数据库的表的信息、数据库列的信息等。常用的information_schema数据库表说明:
所有mysql数据库信息都在里面,我们选择一列显示出来。
Ok,我们看看他有几个表
这里我们主要关注SCHEMA_NAME这个列,因为这个列储存这所有的数据库名。
其他的列对我们的注入帮助不是这么大。
执行语句:select SCHEMA_NAME frominformation_schema.SCHEMATA;
获得所有的数据库名字。
这个表大家一看名字就知道了,肯定是和mysql所有的表名相关的一个表。
选择相应的一行显示。
同理,TABLES表我们只要关注TABLE_NAME(表名)、table_schema(表所属的数据库)这两个列就ok了。
select TABLE_NAME frominformation_schema.TABLES;
这就爆出了我们所有数据库的表
这里介绍一个函数,GROUP_CONCAT函数返回一个字符串结果,该结果由分组中的值连接组合而成。
我们可以构造语句:select group_concat(TABLE_NAME) from information_schema.TABLES;
这样我们返回的结果就会呈字符串返回,但是一个缺点是列名不能显示全。
假设我们猜测管理员的数据库在vaf。
那么我们可以构造语句:
mysql> select group_concat(table_name)from information_schema.tables where tabl
e_schema=’vaf’;
或者:
mysql> select group_concat(table_name) frominformation_schema.tables where tabl
e_schema=0x766166;
这个是十六进制vaf的值,为什么用16进制呢?有时候单引号会被过滤,转成HEX可以更方便的进行注入~
Ok,这样这个库的所有表的名字就都出来了。
这个就同样的套路了。
select SCHEMA_NAME frominformation_schema.COLUMNS limit 1,1;
到了这个表里,完全可以看到,库名,表名,列名对应的列都出来了。
Ok,我们继续构造语句:
mysql> select COLUMN_NAMEfrom information_schema.COLUMNS where TABLE_NAME='injection';
剩下来怎么注入拿到列名的数据我就不多说了~~哈哈哈哈.
这样注入手法很灵活的。突破了 limit 限制了。(group_concat)
有时候一些用户不能跨库查询的,所以在进行上述的一些列操作的时候,记住判断一下当前的用户。
select user from mysql.user