数据库内置系统表学习
文章主要从以下三个方面介绍:
- 利用数据库的功能读写文件,以及读写文件的条件
- 学习数据库系统表的功能,常用数据表及字段的介绍
- 利用 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 值。

load_file() 用法,在 mysql 交互界面下
mysql> select load_file('filename')
例子:读取文件 /var/lib/mysql-files/test.txt

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;
结果如下

MySQL 写文件
1. 使用 SELECT ... INTO OUTFILE 语句导出数据
SELECT ... INTO OUTFILE是LOAD 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';


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

MySQL 数据库系统表
MySQL-5.7 默认的系统表/视图 放在 4 个数据库中
视图也称为虚表,是为了便于查询某些信息,建立在查询结果之上的表,所以视图其实就是被保存起来的一次查询。视图和表的区别简单来说就是视图存储的是 SQL 查询语句执行的结果,以表的形式存在但在数据库中并没有这个表。
| 库名 | 视图数量 | 基表数量 |
|---|---|---|
| information_schema | 61 | 0 |
| mysql | 0 | 31 |
| performance_schema | 0 | 87 |
| sys | 100 | 1(sys_config) |

这里主要介绍在 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 脚本初始化权限表,存储权限的表,常用的有 user,db。
user 表中常用字段有 user、host、authentication_string(存储密码的字段,低版本为password)等
查询所有用户名、连接主机和密码哈希
msyql> select user,host,authentication_string from mysql.user;

信息获取
- 获取用户名
mysql> select user();

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

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

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

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

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

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,即大小写字母

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

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

浙公网安备 33010602011771号