系统数据库学习
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 数据库读文件操作
- system cat
限制条件:在mysql版本为5.x时,且只适合本地读取,远程连接mysql时无法使用system。无法越权读取。--local 选项使load data infile语句从客户主机读取文件。
-
现在本地创建一个文本1.txt并查看内容:
-
进入数据库直接使用system命令读取该文件
- 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;
- 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 脚本初始化权限表,存储权限的表,常用的有user
,db
。user
表中常用字段有user
、host
、authentication_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.md
,Makefile
三个文件。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 | 只显示最后一个执行语句所产生的错误 |