SQL注入原理学习总共分三个部分,本文是第一部分。
第二部分是《SQL注入原理(手动SQL注入)—web渗透学习》
第三部分《SQL注入原理(自动注入SQLMAP)—web渗透学习》,后续会将学习笔记提交
SQL注入的危害:
1.拖库导致数据库泄露;
2.危害web等应用的安全;
3.失去操作系统的控制权;
4.用户信息被非法买卖;
5.危害企业及国家的安全。
SQL注入的主要方式:
1.基于错误的注入;
2.基于布尔的注入;
3.基于UNION的注入;
4.基于时间的注入。
SQL关注的主要数据库:
information_schema库:其实MYSQL数据库的信息数据库,其保存着MYSQL服务器所维护的所有其他数据库信息,包括库名、表名、列名,及相应的类型和访问权限。再直白点说,被访问的MYSQL服务器上到底有哪些数据库,各个数据库有哪些表格,每个表格都有哪些表头信息,及每个表头的类型,每个数据库需要什么样的访问权限都在information_schema库中保存着。
infromation_schema数据库的表格信息如下:
mysql> show tables;
+---------------------------------------+
| Tables_in_information_schema |
+---------------------------------------+
| CHARACTER_SETS |
| COLLATIONS |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUMNS |---在这个表格中保存了当前SQL服务器所有表格的所有列信息(表头)信息,包括其归属哪个表格、哪个数据库、类型、权限等。
| COLUMN_PRIVILEGES |
| ENGINES |
| EVENTS |
| FILES |
| GLOBAL_STATUS |
| GLOBAL_VARIABLES |
| KEY_COLUMN_USAGE |
| PARTITIONS |
| PLUGINS |
| PROCESSLIST |
| PROFILING |
| REFERENTIAL_CONSTRAINTS |
| ROUTINES |
| SCHEMATA |----在这个表格中保存了当前SQL服务器所有数据库信息
| SCHEMA_PRIVILEGES |
| SESSION_STATUS |
| SESSION_VARIABLES |
| STATISTICS |
| TABLES |----在这个表格中保存了当前SQL服务器所有表格信息,包括归属哪个数据库,表格的名称,表引擎,创建时间等信息
| TABLE_CONSTRAINTS |
| TABLE_PRIVILEGES |
| TRIGGERS |
| USER_PRIVILEGES |
| VIEWS |
+---------------------------------------+
28 rows in set (0.00 sec)
查看一下information库columns表格中的信息:
mysql> select * from information_schema.columns limit 5\G;
*************************** 1. row ***************************
TABLE_CATALOG: NULL
TABLE_SCHEMA: information_schema ---数据库名称
TABLE_NAME: CHARACTER_SETS ---表格名称
COLUMN_NAME: CHARACTER_SET_NAME ---列名称
ORDINAL_POSITION: 1
COLUMN_DEFAULT:
IS_NULLABLE: NO
DATA_TYPE: varchar
CHARACTER_MAXIMUM_LENGTH: 32
CHARACTER_OCTET_LENGTH: 96
NUMERIC_PRECISION: NULL
NUMERIC_SCALE: NULL
CHARACTER_SET_NAME: utf8
COLLATION_NAME: utf8_general_ci
COLUMN_TYPE: varchar(32)
COLUMN_KEY:
EXTRA:
PRIVILEGES: select
COLUMN_COMMENT:
*************************** 2. row ***************************
TABLE_CATALOG: NULL
TABLE_SCHEMA: information_schema
TABLE_NAME: CHARACTER_SETS
COLUMN_NAME: DEFAULT_COLLATE_NAME
ORDINAL_POSITION: 2
COLUMN_DEFAULT:
IS_NULLABLE: NO
DATA_TYPE: varchar
CHARACTER_MAXIMUM_LENGTH: 32
CHARACTER_OCTET_LENGTH: 96
NUMERIC_PRECISION: NULL
NUMERIC_SCALE: NULL
CHARACTER_SET_NAME: utf8
COLLATION_NAME: utf8_general_ci
COLUMN_TYPE: varchar(32)
COLUMN_KEY:
EXTRA:
PRIVILEGES: select
COLUMN_COMMENT:
根据columns(或tables)的TABLE_SCHEMA(列头或表头)来查询当前数据服务器的所有数据库名称。
mysql> select DISTINCT TABLE_SCHEMA from information_schema.columns;
+--------------------+
| TABLE_SCHEMA |
+--------------------+
| information_schema |
| bricks |
| bwapp |
| citizens |
| cryptomg |
| dvwa |
| gallery2 |
| getboo |
| ghost |
| gtd-php |
| hex |
| isp |
| joomla |
| mutillidae |
| mysql |
| nowasp |
| orangehrm |
| personalblog |
| peruggia |
| phpbb |
| phpmyadmin |
| proxy |
| rentnet |
| sqlol |
| tikiwiki |
| vicnum |
| wackopicko |
| wavsepdb |
| webcal |
| webgoat_coins |
| wordpress |
| wraithlogin |
| yazd |
+--------------------+
33 rows in set (0.03 sec)
当我们要渗透一个服务器时,我们并不知道该数据库的当前任何信息,那么我们就可以利用information_schema库去查看我们感兴趣的数据库的内容。
步骤如下:
1.查询该数据库服务器都包含了哪些数据库
2.查询感兴趣数据库所包含的了哪些表格;
3.查询感兴趣数据库下目标表格的列头(或字段)信息;
4.查询目标表格的具体字段或列头的具体信息。
1.查询数据库名:
information_schema.tables保存着所有的库名,TABLE_SCHEMA对应;
select DISTINCT TABLE_SCHEMA from information_schema.tables;
语句注释:显示infromation_schema数据库里所有的数据库信息,将TABLE_SCHEMA重复的去除掉,等价于show databases;
结果显示:
mysql> select distinct table_schema from information_schema.tables;
+--------------------+
| table_schema |
+--------------------+
| information_schema |
| bricks |
| bwapp |
| citizens |
| cryptomg |
| dvwa |
| gallery2 |
| getboo |
| ghost |
| gtd-php |
| hex |
| isp |
| joomla |
| mutillidae |
| mysql |
| nowasp |
| orangehrm |
| personalblog |
| peruggia |
| phpbb |
| phpmyadmin |
| proxy |
| rentnet |
| sqlol |
| tikiwiki |
| vicnum |
| wackopicko |
| wavsepdb |
| webcal |
| webgoat_coins |
| wordpress |
| wraithlogin |
| yazd |
+--------------------+
33 rows in set (0.00 sec)
其他查询语句:
select DISTINCT TABLE_SCHEMA,GROUP_CONCAT(TABLE_NAME) from information_schema.TABLES GROUP BY TABLE_SCHEMA limit 5\G;
语句注释:显示infromation_schema.tables数据库中所有的表格信息,将TABLE_SCHEMA重复的去除掉,并将同一数据库的表格放到一个group里。
同时仅显示前5个,按照一个GROUP去显示每一个数据库。
结果显示:
mysql> select DISTINCT TABLE_SCHEMA,GROUP_CONCAT(TABLE_NAME) from information_schema.TABLES GROUP BY TABLE_SCHEMA limit 5\G;
*************************** 1. row ***************************
TABLE_SCHEMA: bricks
GROUP_CONCAT(TABLE_NAME): users
*************************** 2. row ***************************
TABLE_SCHEMA: bwapp
GROUP_CONCAT(TABLE_NAME): users,movies,heroes,blog
*************************** 3. row ***************************
TABLE_SCHEMA: citizens
GROUP_CONCAT(TABLE_NAME): logins
*************************** 4. row ***************************
TABLE_SCHEMA: cryptomg
GROUP_CONCAT(TABLE_NAME): challenge2_users,challenge2_articles,challenge4_users
*************************** 5. row ***************************
TABLE_SCHEMA: dvwa
GROUP_CONCAT(TABLE_NAME): guestbook,users
5 rows in set (0.00 sec)
可以看出cryptomg数据库中包含了challenge2_users,challenge2_articels,challenge4_users三个表格。
2.查询指定数据库的表信息:
information_schema.table_name保存着所有数据库的表格名:
select table_name from information_schema.tables where table_schema="cryptomg";
语句注释:显示infromation_schema中的table库为cryptomg的表格名称信息。
显示结果:
mysql> select table_name from information_schema.tables where table_schema="cryptomg";
+---------------------+
| table_name |
+---------------------+
| challenge2_articles |
| challenge2_users |
| challenge4_users |
+---------------------+
3 rows in set (0.00 sec)
3.查询指定表格的列字段信息:
infromation_schema.columns保存了所有数据库的所有表格的列信息。
select table_name,column_name from information_schema.columns where table_schema="cryptomg" and table_name="challenge4_users";
语句注释:显示infromation_schema中的table库为cryptomg的表格名称信息。
显示结果:
mysql> select table_name,column_name from information_schema.columns where table_schema="cryptomg" and table_name="challenge4_users";
+------------------+-------------+
| table_name | column_name |
+------------------+-------------+
| challenge4_users | id |
| challenge4_users | username |
| challenge4_users | password |
| challenge4_users | email |
+------------------+-------------+
4 rows in set (0.00 sec)
4.查询指定表格的列表信息:
此时可以根据上面已经获得的信息去针对性的查询表格当前的内容。
主要注意的是:能否查看该数据库的信息,取决于当前用户的权限。
select id,concat(username,' ',password,' ',email) from cryptomg.challenge4_users;
语句注释:显示数据库cryptomg中challenge4_users表格中id,username,password和email信息,其中后面三个信息联合(concat)显示,并由空格分开。
显示结果:
mysql> select id,concat(username,' ',password,' ',email) from cryptomg.challenge4_users;
+----+----------------------------------------------------------+
| id | concat(username,' ',password,' ',email) |
+----+----------------------------------------------------------+
| 1 | admin 09cdfd1fdd17cad4c17cfee07835c3f8 [email protected] |
+----+----------------------------------------------------------+
1 row in set (0.00 sec)