在之前的博文中曾介绍过如何对ASP网站进行手工注入,ASP网站大都是采用ACCESS或MSSQL数据库,因而所谓针对ASP的SQL注入其实也就是根据ACCESS或MSSQL数据库的特点来构造查询语句。除此之外,对于PHP网站则大都是采用MySQL数据库,这里要进行手工注入时所使用的查询语句与之前就不相同了,而且相对比较复杂。为了更好地理解,在进行针对PHP网站的注入之前,有必要先了解一些MySQL的基本特点和常用操作语句。

首先需要搭建一个MySQL的实验环境,这里推荐在Linux系统中安装MySQL服务。

挂载光盘并设置yum源之后,安装运行mysql服务。

# yum install mysql        安装mysql

# service mysqld start    运行mysql

MySQL的默认管理员账号是root,没有设置密码,所以可以执行“mysql –u root”命令,以root用户身份登录MySQL。不过建议***先用mysqladmin命令工具为root用户设置一个密码,然后用密码登录MySQL。

网络安全系列之十八 MySQL基本操作(PHP注入基础)

登录MySQL之后,可以在带有提示符“mysql>”的交互式命令环境中进行操作。在该操作环境中,输入的每一条数据库管理命令必须以分号“;”表示结束,可以不区分大小写。

(1) 查看基本信息

执行“select version();”命令查看MySQL版本,可以看到当前版本为5.0.77。

mysql> select version();

+-----------+

| version() |

+-----------+

| 5.0.77 |

+-----------+

1 row in set (0.00 sec)

执行“select @@version_compile_os;”命令查看操作系统版本,可以看到当前系统为redhat linux。

mysql> select @@version_compile_os;

+----------------------+

| @@version_compile_os |

+----------------------+

| redhat-linux-gnu |

+----------------------+

1 row in set (0.00 sec)

执行“select user();”命令查看当前用户,可以看到当前用户为root。

mysql> select user();

+----------------+

| user() |

+----------------+

| root@localhost |

+----------------+

1 row in set (0.07 sec)

执行“select database();”命令查看当前打开的数据库,可以看到当前没有打开任何数据库(NULL)。

mysql> select database();

+------------+

| database() |

+------------+

| NULL |

+------------+

1 row in set (0.01 sec)

(2) 查看数据库列表

执行“show databases;”命令可以查看MySQL***包含了哪些数据库,默认情况下MySQL中内置了3个数据库:information_schema、mysql、test。

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| test |

+--------------------+

3 rows in set (0.00 sec)

(3)切换数据库

执行“use information_schema;”命令,可以打开information_schema数据库。

mysql> use information_schema;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

information_schema是MySQL5以后的版本中默认自带的一个数据库,它里面存放了由用户在MySQL中创建的所有其它数据库的信息。因而在进行PHP注入时,主要也就是针对这个数据库进行操作。

(4)显示数据库中的表

打开数据库之后,执行“show tables;”命令可以显示数据库中所包含的表。在information_schema***包含了17个表。

mysql> show tables;

+---------------------------------------+

| Tables_in_information_schema |

+---------------------------------------+

| CHARACTER_SETS |

| COLLATIONS |

| COLLATION_CHARACTER_SET_APPLICABILITY |

| COLUMNS |

| COLUMN_PRIVILEGES |

| KEY_COLUMN_USAGE |

| PROFILING |

| ROUTINES |

| SCHEMATA |

| SCHEMA_PRIVILEGES |

| STATISTICS |

| TABLES |

| TABLE_CONSTRAINTS |

| TABLE_PRIVILEGES |

| TRIGGERS |

| USER_PRIVILEGES |

| VIEWS |

+---------------------------------------+

17 rows in set (0.00 sec)

在这些表中比较重要的有:

  • schemata:用于存放其它所有数据库的名字。

  • tables:用于存放MySQL中所有数据库的表的名字。

  • columns:用于存放MySQL中所有数据库的所有表中的所有字段的名字。

(5)显示表中的内容

执行“select * from schemata;”命令可以显示schemata表中的所有内容:

网络安全系列之十八 MySQL基本操作(PHP注入基础)

从命令显示的结果中可以看到,当前系统***包含了3个数据库,这与之前查看到的结果一致。

(6)利用information_schema数据库查看其他所有数据库的内容

在了解了上述基础知识之后,我们就可以通过information_schema数据库来查看到其他所有数据库中我们所关心的内容。

为了更好的演示,我们先执行“exit”命令退出MySQL环境,然后再重新登入。

登入之后,我们先不打开任何数据库。

假如我们想知道mysql数据库中都包含了哪些表,可以执行命令:

网络安全系列之十八 MySQL基本操作(PHP注入基础)

由于当前我们并没有打开任何数据库,因而“information_schema.tables”就表示information_shema数据库中的tables表,前面介绍过,这个表中存放了其他所有数据库的表的名字。

“table_name”是tables中用于存放表名的字段,“tables_schema”是tables中用于存放数据库名的字段。

再如我们想知道mysql数据库的user表中包含哪些字段,可以执行命令:

网络安全系列之十八 MySQL基本操作(PHP注入基础)

掌握了这些知识之后,接下来我们就可以进行手工PHP注入了



本文转自 yttitan 51CTO博客,原文链接:http://blog.51cto.com/yttitan/1570620