前言

刚刚看到小密圈里,p 神又讲到了关于 mysql 登录的问题,想到前段时间实习的时候,遇到过类似的问题,这是当时做的一些简单的测试,发出来记录一下 : )

渗透测试中,发现有 phpmyadmin,用注入拿到的数据库账户密码却无法连接。下面是自己的一点测试,可以当做参考,不能保证完全正确,感兴趣的就往下读吧。

攻防练习

这是在实习的时候,师傅们根据真实环境,给我们实习生搭建的一个简单的靶场。

文件上传界面,ypzw 参数存在 sql 注入,id 写任意值,当 ypzw 输入单引号时报错,查看报错语句即可构造 payload。这靶场不难,但是值得思考的是,在文件上传的请求中,其他参数存在注入问题。所以,任何地方都有可能存在各种安全问题,还是要细心。

01

进后台后,友情链接的上传图片处可以上传任意 php 文件,上传文件路径需要爆破,格式/uploadfile/时间/文件名.php,类似/uploadfile/2019-7-30/1.php,文件名从数字 1 开始递增。

03

在 phpinfo 中发现没有限制命令执行的函数,可以将网站源码和日志等文件打包下载下来,为后续深入作准备。

环境搭建

因为 mysql 5.7 开始,需要用 sudo 模式才能以 mysql 中的 root 身份登录服务器,所以先以 mysql 5.6 为例,虚拟机为 ubuntu 18.04。

方便大家搭建,环境搭建代码如下。

1
2
3
4
5
6
7
复制 mysql 5.6 安装包到桌面

tar -xf mysql-server_5.6.45-1debian9_amd64.deb-bundle.tar

sudo dpkg -i libmysqld-dev_5.6.45-1debian9_amd64.deb mysql-server_5.6.45-1debian9_amd64.deb mysql-testsuite_5.6.45-1debian9_amd64.deb mysql-server_5.6.45-1debian9_amd64.deb mysql-community-test_5.6.45-1debian9_amd64.deb mysql-community-source_5.6.45-1debian9_amd64.deb mysql-community-server_5.6.45-1debian9_amd64.deb mysql-community-client_5.6.45-1debian9_amd64.deb mysql-community-bench_5.6.45-1debian9_amd64.deb mysql-common_5.6.45-1debian9_amd64.deb mysql-client_5.6.45-1debian9_amd64.deb libmysqlclient-dev_5.6.45-1debian9_amd64.deb libmysqlclient18_5.6.45-1debian9_amd64.deb

sudo apt install -f

该版本中,非 root 用户登录 mysql 的 root 账号不需要 sudo。

02

接下来看 mysql 5.7。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo rm /etc/apt/sources.list

sudo echo 'deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse \ndeb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse \ndeb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse \ndeb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse \ndeb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse \ndeb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse \ndeb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse \ndeb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse \ndeb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse \ndeb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse' | sudo tee /etc/apt/sources.list

sudo apt update

sudo apt install -y neovim apache2 software-properties-common

sudo add-apt-repository -y ppa:ondrej/php

sudo apt update

sudo apt install -y libapache2-mod-php5.6 mysql-server php5.6-mysql

sudo service apache2 start
sudo serivce mysql start

非 root 用户连接 mysql 中的 root 账号时,如果不用 sudo 权限无法连接。

04

所以,默认情况下,php 中也无法连接 mysql 数据库。

05

经测试 mysqli 和 pdo 也无法连接,同理 phpmyadmin 也无法连接。测试 phpmyadmin 的时候,需要先修改 mysql 密码,因为默认 mysql 无密码,此时无法用 phpmyadmin 连接。

1
2
3
4
sudo mysql -u root -p
use mysql;
update user set authentication_string=password('password') where user = 'root';
flush privileges;

06

那 php 无法连接数据库,要如何建站呢?

  1. 可以新建一个数据库用户,新建的用户就不需要用 sudo 权限登录了,使用该用户登录数据库即可。
1
create user 'll'@'localhost' identified by 'llpassword';

07

  1. 修改 plugin 字段。

08

可以看到刚刚新建的用户和 root 的 plugin 字段内容不同,mysql 5.7 之后,root 用户默认通过 auth_socket 插件进行验证,而不是通过密码。意思就是,上图可以看到 root 是有密码的,但是,当你使用命令sudo mysql -u root -p登录时,是不需要输入该密码,应该验证方式取决于 sudo,可以试试看。

关于该字段的更多内容可以参考:

1
2
https://dev.mysql.com/doc/refman/5.7/en/pluggable-authentication.html
https://dev.mysql.com/doc/refman/5.7/en/cleartext-pluggable-authentication.html

修改该字段的值。

1
2
update mysql.user set plugin='mysql_native_password' where user ='root';
flush privileges;

此时就可以登录 phpmyadmin 了。

09

回到靶场

想想看题目的 php 是以 root 身份连接数据库的。(注意题目环境是 mariadb,和上述 mysql 分析是有差别的)

10

且仅有 root 一个用户。

11

那为什么网站能正常连接,phpmyadmin 却不能连接呢?理论上,php 能连接,phpmyadmin 也能连接,这就和 phpmyadmin 的配置有关了。

参考文章:https://blog.csdn.net/cplvfx/article/details/71124523

一个MySQL客户可以两种不同的方式连接mysqld服务器:Unix套接字,它通过在文件系统中的一个文件(缺省“/tmp/mysqld.sock”)进行连接;或TCP/IP,它通过一个端口号连接。Unix套接字比TCP/IP更快,但是只有用在连接同一台计算机上的服务器。如果你不指定主机名或如果你指定特殊的主机名localhost,使用Unix套接字。
错误(2002)Can’t connect to …通常意味着没有一个MySQL服务器运行在系统上或当试图连接mysqld服务器时,你正在使用一个错误的套接字文件或TCP/IP端口。

所以,我们可以试试拿到 shell 了,改一下 phpmyadmin 的配置文件信息。

1
2
3
?a=system(%27cp%20../../phpMyAdmin/config.sample.inc.php%20../../phpMyAdmin/config.inc.php%27);

?a=system(%27sed%20-i%20"31s/localhost/127.0.0.1/g"%20../../phpMyAdmin/config.inc.php%27);

总结一下,就是复制了根目录的配置文件config.sample.inc.phpconfig.inc.php,并将其中的 localhost 改为 127.0.0.1。当然,连上菜刀后可以直接可视化修改内容。这样就可以进入 phpMyAdmin 啦。

12

到这里,只是为了说明关于 mysql 5.7 版本之后连接的问题,即如果不修改 plugin 字段,无法通过 root 登录数据库。可以创建一个新的非 root 的 mysql 用户,则不需要 sudo 连接,因为新建用户的 plugin 字段默认为 mysql_native_password。

但是这题的测试环境中是 mariadb,且 php 可以不使用 sudo 权限直接登录 mysql 用户,关于这个问题,可以根据上面的砖,自己去发掘一下区别。

还有就是,我们都拿 shell 了,还要进 phpMyAdmin 做什么?这里只是为了验证一下前述问题,但实际场景还是有的,因为在使用 phpMyAdmin 的时候,可能忘了对 setup 目录做权限限制,这样可能会导致信息泄露,甚至登入进 phpMyAdmin,假设在没拿 shell 的前提下,能登入 phpMyAdmin,可以先看下当前版本,看看有没有现成的洞直接打,写文件 getshell 之类的。

13

这里因为没创建 config 配置文件夹,所以不能修改配置,但是可以读一些信息。

关于该页面导致的权限绕过可以参考:

https://zhuanlan.zhihu.com/p/25887967