系统数据库学习

1. 系统数据库

系统数据库包括:master,msdb,model,Resource,tempdb数据库;

  • master 数据库
    记录实例实例的所有系统SQL Server。 这包括实例范围的元数据(例如登录帐户)、端点、链接服务器和系统配置设置。master的所有者是sa。
  • msdb 数据库
    用于 SQL Server 代理计划警报和作业。
  • model 数据库
    用作在数据库实例上创建的所有数据库的SQL Server。 对 model 数据库进行的修改(如数据库大小、排序规则、恢复模式和其他数据库选项)将应用于以后创建的所有数据库。
  • Resource 数据库
    是一个只读数据库,其中包含系统对象,这些对象包含在 SQL Server。 系统对象在物理上保留在 Resource 数据库中,但在逻辑上显示在每个数据库的 sys 架构中。Resource 数据库的物理文件名为 mssqlsystemresource.mdf 和 mssqlsystemresource.ldf。 这些文件位于 <<>:\Program Files\Microsoft SQL Server\MSSQLversion< 中>
  • tempdb 数据库
    一个工作空间,用于保存临时对象或中间结果集。

对于 Azure SQL 数据库单一数据库和弹性池,仅 master 数据库和 tempdb 数据库适用。

1.1 修改系统数据

SQL Server不支持用户直接更新系统对象(如系统表、系统存储过程和目录视图)中的信息。 相反,SQL Server提供了一整套管理工具,使用户能够完全管理其系统并管理数据库中的所有用户和对象。 其中包括:

  • 管理实用工具,例如SQL Server Management Studio。

  • SQL-SMO API。 这使程序员能够包括用于管理其应用程序中SQL Server功能。

  • Transact-SQL脚本和存储过程。 这些语句可以使用系统存储过程和 Transact-SQL DDL 语句。

2. 数据库读写文件操作

mysql中涉及到读写操作,必然离不开secure_file_priv参数,它的值限制load data,select … outfile,load_file()函数可作用的文件位置。
secure_file_priv:
值为NULL表示禁止限制操作
值为某一目录,则只能操作该目录下的文件
没有值则表示不对读写文件进行限制
查询语句:
mysql:show global variables like "secure%";

  • 读文件需满足的条件:
    secure_file_priv值允许对该路径下的文件进行操作
    当前数据库用户对文件有读权限
    当前数据库用户拥有file权限
    查看方法举例:mysql> show grants for root@localhost:
    知道文件的完整路径
    文件大小小于max_allowed_packet。load_file()函数受到这个值的限制
    查看方法:mysql> show global variables like 'max_allowed%';
    修改方法:mysql> set global max_allowed_packet = 5 * 1024 * 1024;

  • 写文件需满足的条件:
    secure_file_priv值允许对该路径下的文件进行操作
    当前数据库用户对文件有写权限
    当前数据库用户拥有file权限
    查看方法举例:mysql> show grants for root@localhost;
    知道文件的完整路径
    目标文件不存在

2.1 数据库读文件操作

  1. system cat
    限制条件:在mysql版本为5.x时,且只适合本地读取,远程连接mysql时无法使用system。无法越权读取。--local 选项使load data infile语句从客户主机读取文件。
  • 现在本地创建一个文本1.txt并查看内容:

  • 进入数据库直接使用system命令读取该文件

  1. load_file()
    在mysql 5.5.68版本以后 secure_file_priv的值默认为NULL。

可以通过以下方式修改
windows下:
修改mysql.ini 文件,在[mysqld] 下添加条目: secure_file_priv =
保存,重启mysql。
Linux下:
在/etc/my.cnf的[mysqld]下面添加local-infile=0选项。
sql命令如下:

create table user(cmd text);
insert into user(cmd) values(load_file('usr/test/1.txt'));
select * from user; 

  1. load data infile()
    其实load data infile和load_file()用法上没有什么区别,只是在注入过程中,往往会过滤掉load_file()这个函数,但是仍然有load data infile可以使用。
create table user(cmd text);
load data infile '/usr/test/1.txt' into table user;
select * from user;

小结:system命令的使用局限在本地读取,而load_file()和load data infile()的方式其实都是通过建立一个新表,并且以读取文件为字符串形式插入一个表中,再读取表中数据。

2.2 数据库写文件操作

  • 限制用户使用读写函数
    通过general_log和general_log_file实现文件的读写,mysql所有查询数据都会记录在general_log_file指定的文件中,有该文件的权限。默认general_log关闭。

同时也受到secure_file_priv的限制,只有通过以下设置,放开限制:

1.打开general_log开关:Set global general_log = 'on';
2.设置general_log_file储存路径:Set global general_log_file = '/tmp/shell.php';

  • outfile写文件

  • dumpfile写文件

3. 数据库系统表

数据库内置的系统表有information_schema、mysql、performance_schema、sys。

3.1 Information_schema

Information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。

3.1.1 什么是元数据呢?

元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。

在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。

  • information_schema数据库部分表说明
表名 注释
SCHEMATA 提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表
TABLES 提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema、表类型、表引擎、创建时间等信息。是show tables from schemaname的结果取之此表
COLUMNS 提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表
STATISTICS 提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表
USER_PRIVILEGES 用户权限表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表
SCHEMA_PRIVILEGES 方案权限表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表
TABLE_PRIVILEGES 表权限表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表
COLUMN_PRIVILEGES 列权限表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表
CHARACTER_SETS 字符集表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表
COLLATIONS 提供了关于各字符集的对照信息
COLLATION_CHARACTER_SET_APPLICABILITY 指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。
TABLE_CONSTRAINTS 描述了存在约束的表。以及表的约束类型
KEY_COLUMN_USAGE 描述了具有约束的键列
ROUTINES 提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列
VIEWS 给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息
TRIGGERS 提供了关于触发程序的信息。必须有super权限才能查看该表
  • performance_schema

PERFORMANCE_SCHEMA这个功能默认是关闭的。需要设置参数: performance_schema 才可以启动该功能,这个参数是静态参数,只能写在my.cnf 中 不能动态修改。

表名 注释
setup_table 设置表,配置监控选项
current_events_table 记录当前那些thread 正在发生什么事情
history_table 发生的各种事件的历史记录表
summary_table 对各种事件的统计表
setup_consumers\ setup_instruments 描述各种事件, 设置哪些事件能够被收集
setup_instruments 描述这个数据库下的表名以及是否开启监控
setup_timers 描述监控选项已经采样频率的时间间隔
threads 监控服务器所有连接
performance_timers 设置一些监控信息, 指定mysql服务可用的监控周期,CYCLE表示按每秒检测2603393034次, 目前 performance-schema 只支持’wait’时间的监控,代码树上 wait/ 下的函数都可以监控到
  • mysql
    在mysql数据库中,有mysql_install_db脚本初始化权限表,存储权限的表
表名 注释
user 用户列、权限列、安全列、资源控制列
db 用户列、权限列
host
table_priv
columns_priv
proc_priv
  • sys
    sys_config : 这是在这个系统库上存在的唯一一个表

3.1. 2 sys数据库表说明

CREATE TABLE sys_config (
variable varchar(128) NOT NULL,
value varchar(128) DEFAULT NULL,
set_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
set_by varchar(128) DEFAULT NULL,
PRIMARY KEY (variable)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

  • variable : 配置选项名称
  • value : 配置选项值
  • set_time : 该行配置修改的时间
  • set_by : 该行配置信息修改者,如果从被安装没有修改过,那么这个数据应该为NULL

4. 查询数据系统库

4.1 默认数据库信息

  • information_schema

select grantee,privilege_type from user_privileges;

  • mysql
    在 mysql 数据库中,有 mysql_install_db 脚本初始化权限表,存储权限的表,常用的有 userdbuser 表中常用字段有 userhostauthentication_string(存储密码的字段,低版本为password)等

查询所有用户名、连接主机和密码哈希

select host,user,password from user;

select user,host,authentication_string from mysql.user;

  • performance_schema

show tables;

  • sys

show databases;

4.2 获取信息

  • 获取用户;

select user();

  • 获取权限

select * from information_schema.user_privileges where grantee like '%root%';

  • 获取数据库名

select schema_name from information_schema.schemata;

  • 获取表名

select table_name from information_schema.tables where table_schema='test';

  • 获取列名

select column_name from information_schema.columns where table_name='test2';

小结:在对系统内置的数据表有了了解之后,对于获取信息的思路路径就是:获取用户信息->用户权限->数据库->数据表信息->数据表列;

5. hashcat 暴力破解用户关键信息

MySQL 用户的密码存储方式并非明文直接存储,而是经过 hash 函数加密进行存储的,从 mysql.user 中获取到 MySQL 用户密码哈希值之后,使用 Hashcat 工具进行密码破解。

hashcat 具有世界最快的密码恢复工具,支持多种方式破解,开源免费等特点的工具;

5.1 安装

下载地址:
https://github.com/hashcat/hashcat/releases
https://hashcat.net/hashcat/

  • windows
    下载最新的安装包,解压缩终端切换到该目录运行hashcat.exe
  • linux
git clone https://github.com/hashcat/hashcat.git

下载hashcat之后,先看源码中的README.md,BUILD.mdMakefile三个文件。BUILD文件中是hashcat的安装命令,推荐大家作为参考。Makefile文件中是编译代码,包括引用的各各文件和数据库路径。

git submodule update --init
make # 运行make命令后,会开始进行hashcat源码编译,并提供makefile文件中提供的相关功能。
make install # 开始安装hashcat

  • 使用说明
hashcat.exe -m 300 -a 3 hashfile -o plain.txt --outfile-format=2 ?a?a?a?a?a?a

-a 指定要使用的破解模式,其值参考后面对参数。
“-a 0”字典攻击,“-a 1” 组合攻击;“-a 3”掩码攻击。
-m 指定要破解的hash类型,如果不指定类型,则默认是MD5
-o 指定破解成功后的hash及所对应的明文密码的存放位置,可以用它把破解成功的hash写到指定的文件中
--force 忽略破解过程中的警告信息,跑单条hash可能需要加上此选项
--show 显示已经破解的hash及该hash所对应的明文
--increment 启用增量破解模式,你可以利用此模式让hashcat在指定的密码长度范围内执行破解过程
--increment-min 密码最小长度,后面直接等于一个整数即可,配置increment模式一起使用 --increment-max 密码最大长度,同上
--outfile-format 指定破解结果的输出格式id,默认是3
--username 忽略hash文件中的指定的用户名,在破解linux系统用户密码hash可能会用到
--remove 删除已被破解成功的hash -r 使用自定义破解规则

参数:

-m 300:hash 类型,200 多种,详见 hashcat --help,300 选择的是 MySQL4/5 的 hash

-a 3:攻击模式,总共 5 种,3 表示爆破模式,所有攻击模式如下表:

模式
0 Straight:字典模式,从字典内容中依次选择密码候选,进行哈希计算,看是否和待破解的哈希值相同
1 Combination:组合模式,将两个字典的内容组合作为字典内容,可以通过 -k-j 选项为两个字典添加额外规则
3 Brute-force:爆破模式/掩码模式,使用掩码固定密码的字符集,减小爆破的候选密码数,掩码格式见下文。
6 Hybrid Wordlist + Mask:混合模式(字典+掩码),通过字典后接掩码的方式构建最终的密码候选。
7 Hybrid Mask + Wordlist:混合模式(掩码+字典),通过掩码后接字典的方式构建最终的密码候选,和上面的组合顺序相反。

-o:--outfile 指定破解成功后的 hash 及所对应的明文密码的存放位置

--outfile-format=2:输出文件格式,2表示只输出破解后的内容,所有可用格式如下表

输出文件格式
1 hash[:salt]
2 plain
3 hash[:salt]:plain
4 hex_plain
5 hash[:salt]:hex_plain
6 plain:hex_plain
7 hash[:salt]:plain:hex_plain
8 crackpos
9 hash[:salt]:crack_pos
10 plain:crack_pos
11 hash[:salt]:plain:crack_pos
12 hex_plain:crack_pos
13 hash[:salt]:hex_plain:crack_pos
14 plain:hex_plain:crack_pos
15 hash[:salt]:plain:hex_plain:crack_pos

?a?a?a?a?a?a:这表示密码的掩码,所谓的掩码就是通过 ?[字符集代号]… 的格式表示密码的格式,包括密码的位数和每一位密码使用的字符集。?a 表示所有的键盘上可输入的字符,6个?a表示密码有6位。hashcat 内置字符集如下

字符集代号 字符集
l abcdefghijklmnopqrstuvwxyz
u ABCDEFGHIJKLMNOPQRSTUVWXYZ
d 0123456789
h 0123456789abcdef
H 0123456789ABCDEF
s !”#$%&’()* +,-./:;<=>?@ []^_ ` {
a ?l?u?d?s
b 0x00 - 0xff

还通过选项自定义字符集,自定以的字符集对应的字符集代号为 1,2,3,4:

--custom-charset1 [chars]等价于 -1
--custom-charset2 [chars]等价于 -2
--custom-charset3 [chars]等价于 -3
--custom-charset4 [chars]等价于 -4

--custom-charset2 ?l?d

此时 ?2 就表示?l?d?h 数字 + 小写字母

如果破解时间太长,我们可以按s键查看破解进度,p键暂停,r键继续破解,q键退出破解。

5.2 爆破Mysql用户密码

mysqldump 是 mysql 用于转存储数据库的使用程序,使用 mysqldump 导出数据需要使用 --tab 选项来指定导出文件指定的目录,该目标必须是可写的。将数据库文件到处后,再用hashcat对该值进行爆破。
语法格式:

mysqldump -u root -p 数据库名 数据表名 > 导出文件名

mysqldump -u root -p mysql user > password.txt

然后再在windows本机上对该值爆破:

hashcat.exe -a 3 -m 300 --force 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B ?l?l?l?l -O

6. 附录-MySql命令行

命令 注释
desc [table_name] 表信息
show columns from [table_name] 表字段
describe [table_name] 表信息
show create table [table_name] 表创建语句
show create database [database_name] 显示数据库信息
show table status from [database_name] 数据库状态
show tables 显示当前数据库中所有表的名称
show tables from [database_name] 显示当前数据库中所有表的名称(同上)
show databases 显示mysql中所有数据库的名称
show processlist 显示系统中正在运行的所有进程,也就是当前正在执行的查询。
show table status 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间
show columns from [table_name] from [database_name] 显示表中列名称
show grants for user_name@localhost 显示一个用户的权限,显示结果类似于grant 命令
show index from [table_name] 显示表的索引
show status 显示一些系统特定资源的信息,例如,正在运行的线程数量
show variables 显示系统变量的名称和值
show privileges 显示服务器所支持的不同权限
show create database [database_name] 显示create database 语句是否能够创建指定的数据库
show create table [table_name] 显示create database 语句是否能够创建指定的数据库
show engines 显示安装以后可用的存储引擎和默认引擎
show innodb status 显示innoDB存储引擎的状态
show logs 显示BDB存储引擎的日志
show warnings 显示最后一个执行的语句所产生的错误、警告和通知
show errors 只显示最后一个执行语句所产生的错误

参考

https://docs.microsoft.com/zh-cn/sql/relational-databases/databases/system-databases?view=sql-server-ver15

posted @ 2022-05-02 13:04  JaydenHuan  阅读(204)  评论(0编辑  收藏  举报