mysql 5.7 root 登录问题
前言
刚刚看到小密圈里,p 神又讲到了关于 mysql 登录的问题,想到前段时间实习的时候,遇到过类似的问题,这是当时做的一些简单的测试,发出来记录一下 : )
渗透测试中,发现有 phpmyadmin,用注入拿到的数据库账户密码却无法连接。下面是自己的一点测试,可以当做参考,不能保证完全正确,感兴趣的就往下读吧。
攻防练习
这是在实习的时候,师傅们根据真实环境,给我们实习生搭建的一个简单的靶场。
文件上传界面,ypzw 参数存在 sql 注入,id 写任意值,当 ypzw 输入单引号时报错,查看报错语句即可构造 payload。这靶场不难,但是值得思考的是,在文件上传的请求中,其他参数存在注入问题。所以,任何地方都有可能存在各种安全问题,还是要细心。
进后台后,友情链接的上传图片处可以上传任意 php 文件,上传文件路径需要爆破,格式/uploadfile/时间/文件名.php
,类似/uploadfile/2019-7-30/1.php
,文件名从数字 1 开始递增。
在 phpinfo 中发现没有限制命令执行的函数,可以将网站源码和日志等文件打包下载下来,为后续深入作准备。
环境搭建
因为 mysql 5.7 开始,需要用 sudo 模式才能以 mysql 中的 root 身份登录服务器,所以先以 mysql 5.6 为例,虚拟机为 ubuntu 18.04。
方便大家搭建,环境搭建代码如下。
1 | 复制 mysql 5.6 安装包到桌面 |
该版本中,非 root 用户登录 mysql 的 root 账号不需要 sudo。
接下来看 mysql 5.7。
1 | sudo rm /etc/apt/sources.list |
非 root 用户连接 mysql 中的 root 账号时,如果不用 sudo 权限无法连接。
所以,默认情况下,php 中也无法连接 mysql 数据库。
经测试 mysqli 和 pdo 也无法连接,同理 phpmyadmin 也无法连接。测试 phpmyadmin 的时候,需要先修改 mysql 密码,因为默认 mysql 无密码,此时无法用 phpmyadmin 连接。
1 | sudo mysql -u root -p |
那 php 无法连接数据库,要如何建站呢?
- 可以新建一个数据库用户,新建的用户就不需要用 sudo 权限登录了,使用该用户登录数据库即可。
1 | create user 'll'@'localhost' identified by 'llpassword'; |
- 修改 plugin 字段。
可以看到刚刚新建的用户和 root 的 plugin 字段内容不同,mysql 5.7 之后,root 用户默认通过 auth_socket 插件进行验证,而不是通过密码。意思就是,上图可以看到 root 是有密码的,但是,当你使用命令sudo mysql -u root -p
登录时,是不需要输入该密码,应该验证方式取决于 sudo,可以试试看。
关于该字段的更多内容可以参考:
1 | https://dev.mysql.com/doc/refman/5.7/en/pluggable-authentication.html |
修改该字段的值。
1 | update mysql.user set plugin='mysql_native_password' where user ='root'; |
此时就可以登录 phpmyadmin 了。
回到靶场
想想看题目的 php 是以 root 身份连接数据库的。(注意题目环境是 mariadb,和上述 mysql 分析是有差别的)
且仅有 root 一个用户。
那为什么网站能正常连接,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 | ?a=system(%27cp%20../../phpMyAdmin/config.sample.inc.php%20../../phpMyAdmin/config.inc.php%27); |
总结一下,就是复制了根目录的配置文件config.sample.inc.php
为config.inc.php
,并将其中的 localhost 改为 127.0.0.1。当然,连上菜刀后可以直接可视化修改内容。这样就可以进入 phpMyAdmin 啦。
到这里,只是为了说明关于 mysql 5.7 版本之后连接的问题,即如果不修改 plugin 字段,无法通过 root 登录数据库。可以创建一个新的非 root 的 mysql 用户,则不需要 sudo 连接,因为新建用户的 plugin 字段默认为 mysql_native_password。
但是这题的测试环境中是 mariadb,且 php 可以不使用 sudo 权限直接登录 mysql 用户,关于这个问题,可以根据上面的砖,自己去发掘一下区别。
还有就是,我们都拿 shell 了,还要进 phpMyAdmin 做什么?这里只是为了验证一下前述问题,但实际场景还是有的,因为在使用 phpMyAdmin 的时候,可能忘了对 setup 目录做权限限制,这样可能会导致信息泄露,甚至登入进 phpMyAdmin,假设在没拿 shell 的前提下,能登入 phpMyAdmin,可以先看下当前版本,看看有没有现成的洞直接打,写文件 getshell 之类的。
这里因为没创建 config 配置文件夹,所以不能修改配置,但是可以读一些信息。
关于该页面导致的权限绕过可以参考:
https://zhuanlan.zhihu.com/p/25887967
Author: ll
Link: http://yoursite.com/2019/08/29/mysql_5.7_root_登录问题/
License: 知识共享署名-非商业性使用 4.0 国际许可协议