在渗透测试的过程中,如果网站数据库为Mysql,在sql注入的过程中如果爆出了网站的绝对路径,常规思路会去查看一下Mysql中用户权限是否有读写权限。sqlmap就是按照这样的思路写入shell的,不过在不知道网站绝对路径的情况下,sqlmap会对一些常规的路径进行写入尝试。在这里,我主要记录一下为什么有时候shell写不进去路径。

在我的经验里,有时候在linux渗透测试的后,即使mysql数据库用户是root权限(肯定会有读写权限),在对特定目录进行写入shell的时候还是会出问题。在这里实验一下,到底是啥原因。

首先,在系统环境为ubuntu16.04.2+mysql 5.7.17中尝试一下。直接用的mysql中的root用户来进行测试。尝试写入0x3c3f70687020706870696e666f28293b203f3e,出现如下错误:

ea1d1353c14925b6628c024bc4196e31.png

这是由于启动mysql的时候使用了--secure-file-priv这个参数,这个参数的主要目的就是限制LOAD DATA INFILE或者SELECT INTO OUTFILE之类文件的目录位置。可以使用SELECT @@global.secure_file_priv;查看当前设置的路径,默认为/var/lib/mysql-files。如下图所示:

efb45397940f0990033b223c4ee63844.png

现在,把这个选项关掉继续测试outfile写入文件权限的问题。在/etc/mysql/my.cnf中如下配置,然后重新启动mysql服务即可。

[mysqld]secure-file-priv = ""

查看一下:

d47fd83a6c9bf4d1dbb82b953b22f596.png

好了,继续。写入tmp目录下成功了。

bb85676fe38149e1c426a845eeac3d1c.png

可以写入成功,这是因为tmp目录任何用户都有权限进行读写。查看一下写入的文件的权限,是数据库的权限。

5bd166442f31a826c281960f2d7297f0.png

以当前用户创建一个目录,如下所示:

1592f97f7e4b9b10de07a43e61de7d67.png

尝试写入文件到该目录下:

64c7a5b22d0bc2713fed55213366de56.png

写入失败。尝试把目录所有者改为mysql再试一下。

901121f638bbc27092d311b2090d9f3c.png

5c1bebd96115157c3e520f29e0c2ad1c.png

还是失败。给test目录777权限再试一下:

d0732bfa53bf123b22f7ad1b5e9246d5.png

7cc99f8ffe416045fcb5579f20bbd975.png

依然失败。原因是ubuntu中的apparmor在作怪。这个类似于selinux。可以关掉再试一下,记住关掉apparmor不是service apparmor stop;(执行stop还是写不进去的)而是service apparmor teardown。

ec046d1f673dabe9bb9c3eec2aeb02a1.png

98475059b533dcc395c0ae7e5600dec2.png

发现在test目录设置为777权限的时候可以写入成功了,如果设置为当前用户muggle权限,还是写入失败了,把目录改为mysql权限又可以写入成功了。

接下来在CentOS7+MariaDB测试一下,MariaDB版本如下:

a3410599f1bb7a2f970eea1da9497312.png

尝试写入/tmp目录:

8c8852144d1bc1ce018612122f4dd7ab.png

写入成功。但是你到tmp目录下找不到写入的文件。这个的原因是mariadb systemd service中的设置造成的。

fef7058b06dc342755b643858bb2c918.png

其实,在tmp目录下,之前写入的文件存到了下面这个目录下面:

f3d1862fa28fc61306d9aebb9371a72f.png

如果想要让写入的文件直接存到/tmp目录下,需要把mariadb.service中PrivateTmp设置为false,然后执行systemctl daemon-reload命令,再重启一下mariadb即可。如下再次写入/tmp目录,即可让写入的文件直接在tmp目录下面。

c7a3faed986ebf24420c20ebf7acfedd.png

然后按照与ubuntu下测试的类似,在Documents下创建test目录,test目录权限为当前用户权限时,写入失败,test目录为mysql权限,写入失败。test目录权限设置为777,写入同样失败。

我们来看一下CentOS中selinux的状态:

6500a9b57a441411aec040fa8d6228a8.png

发现selinux是开启的,把selinux关闭试一下是否能够写入成功。发现采用命令sudo setenforce 0临时关闭selinux,然后写入也是失败的。那直接永久关闭试一下。修改/etc/selinux/config。把SELINUX=enforcing,设置为SELINUX=disabled即可。然后重启系统。

d6d45af24aa2a33aaea2ccd03e0a7b4e.png

selinux已经关闭了。然后继续尝试写入,在test目录权限为当前用户,mysql权限及目录为777权限的时候,都是写入失败。好吧,这个地方有点诡异。按理说关闭selinux之后,只要目录权限为777或者mysql权限,都是可以写入成功的。

把每一级目录都加上可执行权限,试一下是否可以写入成功。

7e2f89d57c3f90b7f2b08b32fcbdb7ac.png

7c44b09645360bcd7ae86deb2a9474f3.png

f5b9995e6628cc7f6babc98576686dd5.png

9ea65419022bab44150eba20ccd75b30.png

可以看到,还是写入失败。那现在把panda和test目录的所有者改为mysql试试看。能不能写入成功:

c563f41114caaa17891cdcb0a8c5662c.png

发现可以写入成功的。那现在把panda和test目录都改为777,是不是也可以写入成功呢?发现也是可以写入成功的。也就是说,在CentOS 7下面,想要在test目录下写入成功,需要每一级目录的所有者都为mysql或者每一级目录都是777权限。然而,某次尝试把selinux关闭后,重启之后,发现只要写入目录为mysql权限或者777权限都是可以写入成功的。略诡异。。。

有一种讨巧的办法,在写入的时候不指定绝对路径,这样文件写入/etc/my.cnf中设置的datadir目录。默认目录为/var/lib/mysql/下面。然后mv写入的文件到指定目录下即可。

Logo

更多推荐