数据库内置系统表学习

文章主要从以下三个方面介绍:

  • 利用数据库的功能读写文件,以及读写文件的条件
  • 学习数据库系统表的功能,常用数据表及字段的介绍
  • 利用 hashcat 对用户的 hash 进行暴力破解

MySQL 读写文件

MySQL 读文件

1. mysql 命令导入

语法格式为

mysql -u用户名 -p密码 < .sql文件(runoob.sql)

例:

mysql -uroot -p123456 < runoob.sql

将备份的整个数据库 runoob.sql 导入

2. source 命令导入

需要先登录到数据库中:

mysql> create database abc;		# 创建数据库
mysql> use abc;					# 使用数据库
mysql> set names utf8;			# 设置编码
mysql> source /home/abc/abc.sql # 导入备份数据库

3. 使用 load_file() 函数

load_file() 函数读取文件内容,将内容以字符串形式返回。

前提条件:

  • 当前数据库用户具有 FILE 权限,使用 show grants 查看
  • secure_file_priv 不为 NULL,使用 select @@secure_file_priv 查看其值,值不为空字符串时,只能使用该目录进行文件读写操作
  • 读取文件的大小小于 max_allowed_packet,使用 select @@max_allowed_packet 查看
  • 文件及路径存在

如果上述任一条件不满足,函数返回 NULL 值。

image-20211112170010709

load_file() 用法,在 mysql 交互界面下

mysql> select load_file('filename')

例子:读取文件 /var/lib/mysql-files/test.txt

image-20211112171141210

4. 使用 LOAD DATA 导入数据

load_file() 函数只能从服务器读取文件,LOAD DATA 语句既能读取服务器的文件,也能读取客户机的文件,通过使用 LOCAL 语句从客户机读取文件内容。

#[] 中的内容为可选内容
LOAD DATA
    [LOW_PRIORITY | CONCURRENT] [LOCAL] #使用 LOCAL 表示从客户主机读取文件,要设置 mysqld 中的系统变量 local_infile
    INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [CHARACTER SET charset_name] #处理文件的字符集
    [{FIELDS | COLUMNS}  #描述每一列的格式
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES   #描述行的格式,不满足的行会被略过
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number {LINES | ROWS}] #忽略指定行或列
    [(col_name_or_user_var
        [, col_name_or_user_var] ...)] #写到数据表中的指定列
    [SET col_name={expr | DEFAULT}, 
        [, col_name={expr | DEFAULT}] ...]

你能明确地在LOAD DATA语句中指出列值的分隔符和行尾标记,但是默认标记是定位符和换行符。

两个命令的 FIELDS 和 LINES 子句的语法是一样的。两个子句都是可选的,但是如果两个同时被指定,FIELDS 子句必须出现在 LINES 子句之前。

mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl
  -> FIELDS TERMINATED BY ':'
  -> LINES TERMINATED BY '\r\n';

例子:读取文件 /var/lib/mysql-files/test.txt 到新建的表中,以 作为分隔。

mysql> create table person(id int(4),name char(10));
mysql> load data infile 'var/lib/mysql-files/test.txt' into table person fields terminated by ' ';
mysql> selcet * from person;

结果如下

image-20211113103007252

MySQL 写文件

1. 使用 SELECT ... INTO OUTFILE 语句导出数据

  • SELECT ... INTO OUTFILELOAD DATA INFILE 的逆操作,一个写文件,一个读文件。
  • SELECT ... INTO OUTFILE 把被选择的行写入一个文件中,必须拥有 FILE 权限。
  • 输出不能是一个已存在的文件,防止文件数据被篡改。

语法:

#[] 中的内容为可选内容
SELECT select_expr...
	INTO OUTFILE 'file_name'
    [CHARACTER SET charset_name] #处理文件的字符集
    [{FIELDS | COLUMNS}  #描述每一列的格式
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES   #描述行的格式
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]

例子:写数据表到 csv 文件中

mysql> select * from person into outfile '/var/lib/mysql-files/test.csv' fields by terminated ',' lines terminated by '\n';

image-20211113105553836

image-20211113105629004

使用 mysqldump 导出数据

mysqldump 是 mysql 用于转存储数据库的使用程序,使用 mysqldump 导出数据需要使用 --tab 选项来指定导出文件指定的目录,该目标必须是可写的。

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

image-20211113110925280

MySQL 数据库系统表

MySQL-5.7 默认的系统表/视图 放在 4 个数据库中

视图也称为虚表,是为了便于查询某些信息,建立在查询结果之上的表,所以视图其实就是被保存起来的一次查询。视图和表的区别简单来说就是视图存储的是 SQL 查询语句执行的结果,以表的形式存在但在数据库中并没有这个表。

库名 视图数量 基表数量
information_schema 61 0
mysql 0 31
performance_schema 0 87
sys 100 1(sys_config)

image-20211113122859245

这里主要介绍在 SQL 注入中常用的几个表和视图。

information_schema 数据库

information_schema 数据库是 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授权表,是非标准表

performance_schema 数据库

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

performance_schema 部分表说明

表名 注释
setup_table 设置表,配置监控选项
current_events_table 记录当前那些 thread 正在发生什么事情
history_table 发生的各种事件的历史记录表
summary_table 对各种事件的统计表
setup_consumers 描述各种事件,设置哪些事件能够被收集
setup_instruments 描述这个数据库下的表名以及是否开启监控
setup_timers 描述监控选项已经采样频率的时间间隔
threads 监控服务器所有连接
performance_timers 设置一些监控信息,指定 mysql 服务可用的监控周期,CYCLE 表示按每秒检测2603393034次, 目前 performance-schema 只支持’wait’时间的监控,代码树上 wait/ 下的函数都可以监控到

sys 数据库

sys_config:这是在这个系统哭上存在的唯一一个表

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

mysql 数据库

在 mysql 数据库中,有 mysql_install_db 脚本初始化权限表,存储权限的表,常用的有 userdb

user 表中常用字段有 userhostauthentication_string(存储密码的字段,低版本为password)等

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

msyql> select user,host,authentication_string from mysql.user;

image-20211115165550212

信息获取

  1. 获取用户名
mysql> select user();

image-20211115171736906

  1. 获取用户权限
mysql> select * from information_schema.user_privileges where grantee like `%root%`;

image-20211115172458578

  1. 获取数据库名
mysql> select schema_name from information_schema.schemata

image-20211115172834371

  1. 获取表名
mysql> select table_name from information_schema.tables where table_schema='test';

image-20211115173342118

  1. 获取列名
mysql> selcet column_name from information_schema.columns where table_name='students'

image-20211115184105548

Hashcat 破解用户密码

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

hashcat 号称最快的高级密码恢复套机(密码破解工具),支持多系统(Linux,OS,Windows),多平台(GPU,CPU,DSP等),支持多达 200 多种的 Hash 类型,支持使用同一系统的不同设备,支持分布式系统资源等。

安装

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

下载最新的压缩包,解压后 cmd 切换到安装目录下运行 hashcat.exe

使用

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 数字 + 小写字母

例子

8 位 MD5 加密数字破解

对 23323323 进行 MD5 加密:5a745e31dbbd93f4c86d1ef82281688b

使用 Hashcat 来进行破解:

hashcat.exe -a 3 -m 0 --force 5a745e31dbbd93f4c86d1ef82281688b ?d?d?d?d?d?d?d?d -O

image-20211115210857761

8 位 MD5 加密大小写字母破解

对 PassWord 进行 MD5 加密:a9d402bfcde5792a8b531b3a82669585

hashcat -a 3 -m 0 -1 '?l?u' --force  a9d402bfcde5792a8b531b3a82669585 ?1?1?1?1?1?1?1?1 -O

这里面定义了个自定义规则 -1,此时 ?1 就表示 ?l?u,即大小写字母

image-20211115210947997

5-7 位 MD5 加密的大小写字母 + 数字破解

Admin88 的 MD5 值为: 2792e40d60bac94b4b163b93566e65a9

hashcat.exe -a 3 -m 0 -1 ?l?u?d --force  2792e40d60bac94b4b163b93566e65a9 --increment --increment-min 5 --increment-max 7 ?1?1?1?1?1?1?1 -O

image-20211115211111066

MySQL4.1/5

查看 MySQL 用户名与密码

mysql> select user,host,authentication_string from mysql.user;

使用字典破解

hashcat.exe -a 0 -m 300 --force hashfile hashdict.txt -O

附录

MYSQL SHOW 命令

命令 注释
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 只显示最后一个执行语句所产生的错误

参考

MySQL 数据库系统表的利用: https://bingslient.github.io/2019/08/16/MySQL 数据库系统表的利用/

Hashcat 学习记录:https://www.sqlsec.com/2019/10/hashcat.html

原文地址:https://www.cnblogs.com/augustine0654/p/15586434.html