SQL注入原理学习总共分三个部分,本文是第一部分。
第二部分是《SQL注入原理(手动SQL注入)—web渗透学习
<https://blog.csdn.net/Packet_Lee/article/details/89113917>》
第三部分《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)

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信