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