在之前的博文中曾介绍过如何对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之后,可以在带有提示符“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() |
+----------------+
| [email protected] |
+----------------+
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表中的所有内容:
从命令显示的结果中可以看到,当前系统中共包含了3个数据库,这与之前查看到的结果一致。
(6)利用information_schema数据库查看其他所有数据库的内容
在了解了上述基础知识之后,我们就可以通过information_schema数据库来查看到其他所有数据库中我们所关心的内容。
为了更好的演示,我们先执行“exit”命令退出MySQL环境,然后再重新登入。
登入之后,我们先不打开任何数据库。
假如我们想知道mysql数据库中都包含了哪些表,可以执行命令:
由于当前我们并没有打开任何数据库,因而“information_schema.tables”就表示information_shema数据库中的tables表,前面介绍过,这个表中存放了其他所有数据库的表的名字。
“table_name”是tables中用于存放表名的字段,“tables_schema”是tables中用于存放数据库名的字段。
再如我们想知道mysql数据库的user表中包含哪些字段,可以执行命令:
掌握了这些知识之后,接下来我们就可以进行手工PHP注入了。