基本要求
1、什么是关系型和非关系型数据库,两者都包含哪些种类的数据库
2、选择一种关系型数据库进行学习(选择自己不熟悉的进行学习)
3、学习数据库中的字段类型并创建库和用户表,需要包含所有字段类型
4、学习数据库的增删改查,记录学习过程(重点是 sql 语句的理解)并形成报告
部分解释
1、对于关系型数据库,都会提供文件读写的功能,但是具体如何实现略有不同,文件读写在我们利用数据库注入漏洞获取 webshell 的时候非常有帮助,所以读写文件的基础是必须要学的。
2、任何关系型数据库,在默认安装成功之后会自带一些默认的系统库和表,这些库和表存储了数据库中很多关键的信息,比如用户创建的库相关信息、表相关信息、用户相关信息、权限相关信息、安装配置相关信息等,在我们利用注入漏洞获取更多信息和权限的过程中有很大的帮助,所以熟悉数据库默认的系统库和表也是很必要的。
3、对于关系型数据库,为了安全都会存在用户和密码,但是密码是经过哈希之后存储在系统表中的,当我们通过注入获取数据库的账号和哈希之后,想要知道哈希之前的明文信息,需要进行暴力破解操作,对于跑哈希来说,hashcat 可以利用 GPU 快速破解哈希,支持非常多的哈希格式,在未来的红蓝对抗中帮助很大。
学习笔记
关系数据库与非关系数据库
类型 | 说明 | 包含种类 |
---|---|---|
关系数据库 | 关系数据库,是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据,同时也是一个被组织成一组拥有正式描述性的表格,该形式的表格作用的实质是装载着数据项的特殊收集体,这些表格中的数据能以许多不同的方式被存取或重新召集而不需要重新组织数据库表格。关系数据库的定义造成元数据的一张表格或造成表格、列、范围和约束的正式描述。每个表格(有时被称为一个关系)包含用列表示的一个或更多的数据种类。 每行包含一个唯一的数据实体,这些数据是被列定义的种类。当创造一个关系数据库的时候,你能定义数据列的可能值的范围和可能应用于那个数据值的进一步约束。而SQL语言是标准用户和应用程序到关系数据库的接口。其优势是容易扩充,且在最初的数据库创造之后,一个新的数据种类能被添加而不需要修改所有的现有应用软件。 | oracle、sqlserver、mysql等 |
非关系数据库 | NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。NoSQL有如下优点:易扩展,NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。无形之间也在架构的层面上带来了可扩展的能力。大数据量,高性能,NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。 | MongoDB 、NoSql、Redis、Memcached、HBase等 |
推荐阅读:
关系型数据库和非关系型数据库区别、oracle与mysql的区别
使用Mysql进行学习
操作系统为ubuntu18.04.
创建数据库、用户、表
创建数据库
create database learn_sql;
use learn_sql;
注意:mysql普通用户无法直接通过create database创建数据库,需要授权
创建用户
更改密码策略
在创建新用户并修改密码时,需要更改密码策略
资料来源:
- 查看当前的密码策略
show variables like 'validate_password%';
- 各项值说明
validate_password_policy:密码安全策略,默认MEDIUM策略
策略 | 检测规则 |
---|---|
0 or LOW | Length |
1 or MEDIUM Length | numeric, lowercase/uppercase, and special characters |
2 or STRONG Length | numeric, lowercase/uppercase, and special characters ,dictionary file |
validate_password_dictionary_file:密码策略文件,策略为STRONG才需要
validate_password_length:密码最少长度
validate_password_mixed_case_count:大小写字符长度,至少1个
validate_password_number_count :数字至少1个 validate_password_special_char_count:特殊字符至少1个
- 修改策略(将策略要求置为LOW,长度要求置为1)
set global validate_password_policy=0;
set global validate_password_length=1;
用户管理
- 创建用户
create user 'new_user'@'localhost' identified by 'password';
- 本地用户可用localhost,
- 任意远程主机登陆,可以使用通配符%,也可省略
- 授权
GRANT语句的一般格式:
GRANT <权限>[,<权限>]...
[ON <对象类型> <对象名>]
TO <用户>[,<用户>]...
[WITH GRANT OPTION];
GRANT privileges ON learn_sql. TO 'username'@'host';
- 用户的常见权限
户详情的权限列表请参考MySQL官网说明: http://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html
- 授权
grant all privileges on learn_sql.* to 'new_user'@'localhost' identified by 'password' with grant option;
flush privileges;
- 查看用户权限
show grants for 'new_user'@'localhost';
- 回收权限
revoke create on learn_sql.* from 'new_user'@'localhost';
flush privileges;
- 删除用户
use mysql;
select host,user from user;
drop user 'new_user';
创建表
create table user_info(
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
DateOfBirth DATETIME,
NUMBER DOUBLE(20,4)
);
修改表结构
alter table user_info add tag char(6);
添加一列 tag
插入数据
insert into user_info values
(1,'x','z','2019-03-05',123123123.111,'asss'),
(2,'x','z','2019-03-05',123123123.111,'asss'),
(3,'x','z','2019-03-05',123123123.111,'asss'),
(4,'x','z','2019-03-05',123123123.111,'asss');
更新数据
update user_info set tag = 'haha' where id =1;
建立视图
mysql> create view user_view as select id,NUMBER, tag from user_info where tag = 4;
mysql> show tables;
+---------------------+
| Tables_in_learn_sql |
+---------------------+
| user_info |
| user_view |
+---------------------+
2 rows in set (0.00 sec)
单表查询
SELECT [ALL|DISTINCT] <目标列表达式> 指定要显示的属性列
[,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] … 指定查询对象(基本表或视图)
[ WHERE <条件表达式> ] 指定查询条件
[ GROUP BY <列名1> 对查询结果按指定列的值分组,该属性列值相等的元组为一个组。
[ HAVING <条件表达式>]] 筛选出只有满足指定条件的组
[ ORDER BY <列名2> [ ASC|DESC ] ]; 对查询结果表按指定列值的升序或降序排序
- 查询满足条件的元组
查询条件 | 谓词 | 例子 |
---|---|---|
比较 | =,<>,>,>=,<,<= | SELECT Sname,Sdept,Sage FROM S WHERE Sage NOT BETWEEN 20 AND 23; |
算术运算 | + – * / | |
确定范围 | Between And , Not Between And | |
确定集合 | IN , NOT IN | SELECT Sname,Ssex FROM S WHERE Sdept NOT IN ( 'IS','MA','CS' ); |
字符匹配 | Like , Not Like | ELECT Sname,Sno,Ssex FROM S WHERE Sname NOT LIKE '刘%'; |
空值 | IS NULL ,IS NOT NULL | SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL; |
多重条件 | AND , OR | SELECT Sname FROM S WHERE Sdept= 'CS' AND Sage<20; |
- 使用集函数
五类主要集函数
集函数 | 格式 | 例子 |
---|---|---|
计数 | COUNT([DISTINCT|ALL] *)COUNT([DISTINCT|ALL] <列名>) | SELECT COUNT(DISTINCT Sno) FROM SC; |
计算总和 | SUM([DISTINCT|ALL] <列名>) | |
计算平均值 | AVG([DISTINCT|ALL] <列名>) | SELECT AVG(Grade) FROM SC WHERE Cno= ' 1 '; |
求最大值 | MAX([DISTINCT|ALL] <列名> | SELECT MAX(Grade) FROM SC WHERE Cno= ' 1' |
求最小值 | MIN([DISTINCT|ALL] <列名> |
- 对查询结果分组
使用GROUP BY子句分组 细化集函数的作用对象
– 未对查询结果分组,集函数将作用于整个查询结果
– 对查询结果分组后,集函数将分别作用于每个组
– 使用HAVING短语筛选最终输出结果
select group_concat(id) from user_info group by tag having count(id)>2;
连接查询
数据库中的多个表之间一般都存在某种内在联系,他们共同提供有用的信
息,很多时候需要将两个及以上的表联合起来进行信息标识。同时涉及多
个表的查询称为连接查询。
用来连接两个表的条件称为连接条件或连接谓词 。
一般格式:
• [<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
比较运算符:=、>、<、>=、<=、!=SQL中连接查询的主要类型
– 广义笛卡尔积
– 等值连接(含自然连接)
– 非等值连接查询
– 自身连接查询
– 外连接查询
– 复合条件连接查询
后记
比较推荐从理论学习数据库等理论知识,再用sql 语句实现。