学Linux - 上红联!
Linux系统教程_红联Linux门户
Linux帮助

关于Mysql中select into outfile权限的探讨

时间:2017-10-06来源:linux网站 作者:clumsy_geek
在渗透测试的过程中,如果网站数据库为Mysql,在sql注入的过程中如果出现了网站的绝对路径,常规思路会去查看一下Mysql中用户权限是否有读写权限。sqlmap就是按照这样的思路写入shell的,不过在不知道网站绝对路径的情况下,sqlmap会对一些常规的路径进行写入尝试。在这里,我主要记录一下为什么有时候shell写不进去路径。
 
在我的经验里,有时候在linux渗透测试的后,即使mysql数据库用户是root权限(肯定会有读写权限),在对特定目录进行写入shell的时候还是会出问题。在这里实验一下,到底是啥原因。
 
首先,在系统环境为ubuntu16.04.2+mysql 5.7.17中尝试一下。直接用的mysql中的root用户来进行测试。尝试写入0x3c3f70687020706870696e666f28293b203f3e,出现如下错误:
关于Mysql中select into outfile权限的探讨
 
这是由于启动mysql的时候使用了--secure-file-priv这个参数,这个参数的主要目的就是限制LOAD DATA INFILE或者SELECT INTO OUTFILE之类文件的目录位置。可以使用SELECT @@global.secure_file_priv;查看当前设置的路径,默认为/var/lib/mysql-files。如下图所示:
关于Mysql中select into outfile权限的探讨
 
现在,把这个选项关掉继续测试outfile写入文件权限的问题。在/etc/mysql/my.cnf中如下配置,然后重新启动mysql服务即可。
[mysqld]
secure-file-priv = ""
 
查看一下:
关于Mysql中select into outfile权限的探讨
 
好了,继续。写入tmp目录下成功了。
关于Mysql中select into outfile权限的探讨
 
可以写入成功,这是因为tmp目录任何用户都有权限进行读写。查看一下写入的文件的权限,是数据库的权限。
关于Mysql中select into outfile权限的探讨
 
以当前用户创建一个目录,如下所示:
关于Mysql中select into outfile权限的探讨
 
尝试写入文件到该目录下:
关于Mysql中select into outfile权限的探讨
 
写入失败。尝试把目录所有者改为mysql再试一下。
关于Mysql中select into outfile权限的探讨
关于Mysql中select into outfile权限的探讨
 
还是失败。给test目录777权限再试一下:
关于Mysql中select into outfile权限的探讨
关于Mysql中select into outfile权限的探讨
 
依然失败。原因是ubuntu中的apparmor在作怪。这个类似于selinux。可以关掉再试一下,记住关掉apparmor不是service apparmor stop;(执行stop还是写不进去的)而是service apparmor teardown。
关于Mysql中select into outfile权限的探讨
关于Mysql中select into outfile权限的探讨
 
发现在test目录设置为777权限的时候可以写入成功了,如果设置为当前用户muggle权限,还是写入失败了,把目录改为mysql权限又可以写入成功了。
 
接下来在CentOS7+MariaDB测试一下,MariaDB版本如下:
关于Mysql中select into outfile权限的探讨
 
尝试写入/tmp目录:
关于Mysql中select into outfile权限的探讨
 
写入成功。但是你到tmp目录下找不到写入的文件。这个的原因是mariadb systemd service中的设置造成的。
关于Mysql中select into outfile权限的探讨
 
其实,在tmp目录下,之前写入的文件存到了下面这个目录下面:
关于Mysql中select into outfile权限的探讨
 
如果想要让写入的文件直接存到/tmp目录下,需要把mariadb.service中PrivateTmp设置为false,然后执行systemctl daemon-reload命令,再重启一下mariadb即可。如下再次写入/tmp目录,即可让写入的文件直接在tmp目录下面。
关于Mysql中select into outfile权限的探讨
 
然后按照与ubuntu下测试的类似,在Documents下创建test目录,test目录权限为当前用户权限时,写入失败,test目录为mysql权限,写入失败。test目录权限设置为777,写入同样失败。
 
我们来看一下CentOS中selinux的状态:
关于Mysql中select into outfile权限的探讨
 
发现selinux是开启的,把selinux关闭试一下是否能够写入成功。发现采用命令sudo setenforce 0临时关闭selinux,然后写入也是失败的。那直接永久关闭试一下。 修改/etc/selinux/config。把SELINUX=enforcing,设置为SELINUX=disabled即可。然后重启系统。
关于Mysql中select into outfile权限的探讨
 
selinux已经关闭了。然后继续尝试写入,在test目录权限为当前用户,mysql权限及目录为777权限的时候,都是写入失败。好吧,这个地方有点诡异。按理说关闭selinux之后,只要目录权限为777或者mysql权限,都是可以写入成功的。
 
把每一级目录都加上可执行权限,试一下是否可以写入成功。
关于Mysql中select into outfile权限的探讨
关于Mysql中select into outfile权限的探讨    
关于Mysql中select into outfile权限的探讨
关于Mysql中select into outfile权限的探讨
 
可以看到,还是写入失败。那现在把panda和test目录的所有者改为mysql试试看。能不能写入成功:
关于Mysql中select into outfile权限的探讨
 
发现可以写入成功的。那现在把panda和test目录都改为777,是不是也可以写入成功呢?发现也是可以写入成功的。也就是说,在CentOS 7下面,想要在test目录下写入成功,需要每一级目录的所有者都为mysql或者每一级目录都是777权限。然而,某次尝试把selinux关闭后,重启之后,发现只要写入目录为mysql权限或者777权限都是可以写入成功的。略诡异。
 
有一种讨巧的办法,在写入的时候不指定绝对路径,这样文件写入/etc/my.cnf中设置的datadir目录。默认目录为/var/lib/mysql/下面。然后mv写入的文件到指定目录下即可。
 
本文永久更新地址:/linux/32733.html
------分隔线------