MENU

认识 SQL 并学习数据库的基础操作总结

August 11, 2019 • Read: 1277 • SQL阅读设置

0x00 准备与目标

容器:Docker

任务目标:

  • 认识关系型数据库和非关系型数据库的区别。
  • 选择一种或几种数据库进行学习。
  • 熟练数据库中DDL(Data Definition Language 数据定义语言:create、drop、alter语句)、DQL(Data Query Language 数据查询语言:select语句)和DML(Data Manipulation Language 数据操控语言:insert、delete、update语句)相关操作。
  • 结合对SQL语句的理解和基础的SQL注入做一个学习(报告)总结。

0x01 数据库与SQL基础

重新翻开的大一的书本,重新回顾数据库的概念,首先,

1.数据库是什么?

简而言之,数据库(Data Base)就是存储电子数据的地方。就像茶杯是装水的容器,数据库就是用来存储一些数据,人可以在其上增加、删除、修改、查找数据。

2.数据是什么?

数据(Data)是数据库中存储的基本单元。是一种描述事物的符号。

计算机系统中的一切事物都可以用数据指代,如图片、文字等都可以称为数据。

3.数据库管理系统是什么?

数据库管理系统(Data Base Management System)简称DBMS,是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库。

这里有个误区,人们通常用数据库这个术语去指代他们所使用的数据库管理系统,这是不正确的,也因此产生了很多混淆。

4.SQL是什么?

SQL 是用于访问和处理数据库的标准的计算机语言。

全称:结构化查询语言(Structured Query Language)

SQL包含6个部分:

1、数据查询语言(DQL:Data Query Language):从数据表中获取数据。常用的关键字有SELECT,WHERE,ORDER BY,GROUP BY和HAVING。

2、数据操作语言(DML:Data Manipulation Language):对数据表中的数据进行操作。常用的关键字有INSERT、UPDATE和DELETE。

3、数据定义语言(DDL):其语句包括动词CREATE、,ALTER和DROP。在数据库中创建新表或修改、删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。

4、事务控制语言(TCL):它的语句能确保被DML语句影响的表的所有行及时得以更新。包括COMMIT(提交)命令、SAVEPOINT(保存点)命令、ROLLBACK(回滚)命令。

5、数据控制语言(DCL):它的语句通过GRANT或REVOKE实现权限控制,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。

6、指针控制语言(CCL):它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。

在实际操作过程中我们会经常使用SQL中的DQL、DML和DDL语句。

比如创建数据库、在指定数据库中创建数据表、在数据表中增加数据、删除数据、查询数据、修改数据等等一系列操作。

5.关系型数据库管理系统

关系数据库管理系统(Relational Database Management System:RDBMS)是指包括相互联系的逻辑组织和存取这些数据的一套程序 (数据库管理系统软件)。

常见的关系型数据库管理系统:Oracle、SQL Server、MySQL、Access、PostgreSQL、SQLite、DB2、vfp、Sybase等。

概念:

存储方式:数据库中以表的存储方式,数据以行列的方式的存储。

存储结构:创建表时定义字段(列),之后再根据表结构存储数据(行)。

优点:

1.格式统一:都使用表的结构。

2.标准化:使用SQL语句对数据库进行查询,可以支持复杂操作(多表查询等)。

缺点:

1.表结构固定,灵活性欠缺。

2.高并发时读写性能低。

3.数据库的可扩展性和可用性低。

6.非关系型数据库

非关系数据库(Not Only SQL:NoSQL)泛指非关系型的数据库。严格意义上讲非关系型数据库是一种区别于关系型数据库的数据结构化存储方法的集合,可以是键值对存储、列存储、文档存储、还可以是图形存储。

常见的非关系型数据库:NoSQL、Redis、HBase、MongodDB、Neo4j等。

概念:

存储方式:键值对(key/value)、列存储、文档、图形四大分类。

存储结构:结构不固定。

优点:

1.速度快,可以使用硬盘或者内存卡做载体,所以快,较关系型只能使用硬盘。

2.高扩展性。

3.格式灵活,可以是key/value形式、图形、文档、列等很灵活。

4.成本低,部署简单。

缺点:

1.不提供SQL支持,学习和使用成本较高。

2.存储简单数据。

3.数据结构相对复杂,复杂查询方面稍欠。

7.SQL基础语法

DDL语句操作

创建/删除名为center的数据库:

create database center;    # 创建一个名为center的数据库
drop database center;      # 删除一个名为center的数据库    

在数据库center中创建/删除名为persons的数据表:

create table persons(
    id INT primary key,
    name VARCHAR(20) not null,
    gender CHAR(2), 
    birthday DATE 
    );                    # 创建一个名为persons的数据表
drop table persons;     # 删除一个名为persons的数据表    

对数据表persons结构进行修改:

alter table persons add tel char(11);    # 增加tel字段 字段类型为char(11)
alter table persons drop column tel;    # 删除tel字段
Tips:

关键字

primary key:设置字段主键,唯一非空。

not null:设置字段非空 。

DML语句操作

对数据表persons进行增删改操作:

insert into persons(id,name,gender,birthday) values(1,'cn','n','1949-10-1');
# 在persons表增加一条数据(MySQL的插入语法)
update persons set gender='f' where id=1;
# 修改persons表中id为1的那条数据的gender值为f
delete from persons where id=1;
# 删除persons表中id为1的那条数据

DQL语句操作

对数据表persons进行查询操作:

select * from persons;        # 查询persons表中所有数据 *号指代该表中所有字段
select name from persons where id=1;    # 查询id为1的name字段数据

0x02 MySQL学习

1.简介MySQL

与大型数据库管理系统相比较,MySQL更适合中小企业与个人,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。MySQL常常与PHP和apache联用形成良好的开发环境。

2.使用Docker搭建环境

这里使用MySQL5.7.25来进行学习。

首先在docker上查找mysql镜像:

docker search mysql

1565461810411.png

可以直接pull官方的MySQL,这里我直接选用5.7.25:

docker pull mysql:5.7.25

1565461927668.png

简单使用一个docker容器,运行mysql镜像:

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.25

方便起见初始化密码直接123456了,接下来测试一下连接。

1565462121923.png

完成。

3.MySQL基础命令

use databasename;    # 选择当前操作的数据库
show databases;        # 查看所有数据库
show tables;        # 查看当前数据库中的所有表
desc persons;        # 显示指定表的表结构

对表中数据的增删改查:

select * from persons where name like "c%";
# 模糊查询,查询persons表中name首位为c的所有数据
insert into persons(id,name,gender,birthday) values(1,'cn','n','1949-10-1');
# 在persons表增加一条数据
update users set password='123456' where id=1;
# 修改users表中id为1的那条数据的password为123456
delete from persons where id=1;
# 删除persons表中id为1的那条数据

4.MySQL注入常用函数

翻出之前整理到博客的记录,MYSQL 注入常用函数,在这里再贴一下:

函数名称函数功能函数名称函数功能
system user()系统用户名concat()没有分隔符地连接字符串
user()用户名concat_ws()含有分隔符地连接字符串
current_user()当前用户名group_concat()连接一个组的所有字符串,并以逗号分隔每一条数据
session_user()连接数据库的用户名load_file()读取本地文件
database()数据库名into outfile写文件
version()数据库版本ascii()字符串的ASCII码值
@@datadir数据库路径ord()返回字符串第一个字符的ASCII码值
@@basedir数据库安装路径mid()返回一个字符串的一部分
@@version_compile_os操作系统substr()返回一个字符串的一部分
count()返回执行结果数量length()返回字符串的长度

常用的比如:

group_concat()、database()、current_user()

还有一些函数:

函数名称函数功能
left()返回字符串的最左面的几个字符
floor()返回小于或等于x的最大整数
sleep()让此语句运行N秒钟
if()>SELECT IF(1>2,2,3); -> 3
char()返回整数ASCII代码字符组成的字符串
STRCMP()比较字符串内容
IFNULL()假如参数1不为NULL,则返回值为参数1,否则其返回值为参数2
exp()返回e的x次方
rand()返回0和1之间的一个随机数
extractvalue()第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc第二个参数:XPath_String(Xpath格式的字符串)作用:从目标XML中返回包含所查询值的字符串
updatexml()第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc第二个参数:XPath_String(Xpath格式的字符串)第三个参数:new_value,String格式,替换查找到的符合条件的数据作用:改变文档中符合条件的节点的值

5.MySQL操作

查询数据库安装路径:

select @@datadir;

1565464049449.png

查询数据库版本:

select version();

1565464526113.png

查询当前用户名:

select current_user();

1565464618797.png

如果在root权限下可以进行对用户的操作:

创建新用户:

create user 'test' identified by '123456';
# 创建一个用户名为test 密码为123456的用户

1565465126155.png

为用户授权:

grant all privileges on persons.* to test@localhost identified by '123456';
# 授权test用户拥有persons数据库的所有权限 可以指定数据库
grant all privileges on *.* to test@localhost identified by '123456';
# 授权test用户拥有所有数据库的所有权限
# 在进行完以上操作后要刷新权限
flush privileges;

1565465433909.png

删除用户:

drop user test@'%';        # 删除用户test

修改用户密码:

这里有两种一种使用alter一种使用update:

alter user test@'%' identified by '123456'; # 修改test用户密码为123456
# 或者
update mysql.user set authentication_string=password("123456") where User="test" and Host="%";
flush privileges;

0x03 总结

这次只重新学习了下MySQL,之前只是了解了MySQL在SQL注入的一些常用函数,并没有对用户权限划分这块做过多了解,现阶段相对安全的应该是对用户分权,对每个单独的数据库设数据库管理员仅能操作当前数据库,从攻击者角度去想,对于限制权限的数据库账号,在拿到webshell的前提下,如何可以对数据库安装路径访问并有查看文件内容权限可以通过查看\data\mysql目录下的user.MYD文件内容拼接root管理员密码hash,从而提升我们的权限。以上总结略有不足,欢迎指点,互相学习!


参考资料:

SQL必知必会(第4版)

数据库的基本概念

最通俗易懂的理解什么是数据库

MYSQL 注入常用函数

MySQL用户管理:添加用户、授权、删除用户

MySQL 教程

原文作者:Keefe

原文链接:认识 SQL 并学习数据库的基础操作总结

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

Last Modified: August 15, 2019