网上广为流程的 phpmyadmin 万能密码如下:
‘localhost‘@‘@”
据说 phpmyadmin 版本为 2.11.3 和 2.11.4 都可用
但是这个漏洞没有 CVE编号,国外也没搜到关于这个漏洞的详情
环境准备
phpmyadmin 的历史版本可以在其 github 上下载。我这里使用的是 phpmyadmin 2.11.3;php 5.6;mysql 5.7
下载好后解压丢到 web 目录,具体操作可以看同目录下的 Documentation.html
如果不想看文档就直接 copy 一份 config.sample.inc.php 命名为 config.inc.php。
修改 $cfg['Servers'][$i]['auth_type']
值为 cookie
即可
初探万能密码
按照网上说的,直接 'localhost'@'@"
糊脸

不太行呢,翻了几篇内容一样但是出处不同文章后,发现了一篇文章:
https://www.cnblogs.com/gqdw/archive/2012/10/11/2720519.html
尝试在 mysql 中添加一个 user 为 ‘’ password 为 ‘’ 的账户
1 | create user ''@'localhost' identified by ''; |
再次使用 “万能密码”登陆,发现成功登陆。
退出,用户名处乱打,密码不写,依然能成功登陆
看来所谓的 “万能密码” 只是 mysql的配置问题嘛?
查看源码
翻看 phpmyadmin 源码,跟进几次流程后,找到 phpmyadmin 获取 登陆表单数据的地方:
libraries/common.inc.php line 751
$cfg['Server']['auth_type']
为 config.inc.php 配置的值
PMA_auth_check()
函数中,只要 发送了登陆表单的数据,就返回 true。
PMA_auth_set_user();
是我们测试时的重点函数之一,它将 登陆表单发送的账号密码保存至 $cfg['Server']
中
1 | require_once './libraries/auth/' . $cfg['Server']['auth_type'] . '.auth.lib.php'; |
然后程序将走到
libraries/common.inc.php line 819
调用函数 PMA_DBI_connect
,传入 账号密码
1 | if (! $controllink) { |
在 libraries/dbi/mysql.dbi.lib.php 的 PMA_DBI_connect 函数中,line 77
调用函数 PMA_DBI_real_connect
,传入配置,*$user* 和 $password 都是函数形参
最终返回的是 PMA_DBI_real_connect
函数的返回值
1 | $link = PMA_DBI_real_connect($cfg['Server']['host'] . $server_port . $server_socket, $user, $password, empty($client_flags) ? NULL : $client_flags); |
libraries/dbi/mysql.dbi.lib.php 的 PMA_DBI_real_connect
函数中,line 30
$link
尝试连接 mysql 数据库,如果成功则返回资源,失败返回 false
最终返回的就是 是否成功连接 mysql数据库,成功返回连接句柄,失败返回 false
1 | $link = @mysql_connect($server, $user, $password); |
以上就是 phpmyadmin 登陆的过程了。只要 $link
返回连接句柄则登陆成功,反之登陆失败
这么看下来,感觉和 phpmyadmin 的代码没有半毛关系,只是 mysql 配置的问题。而且也不是非要用 'localhost'@'@"
才能登陆
至于为什么随便输入也能登陆呢?简单测试了下:
1 |
|
猜测
基于以上粗浅的分析,得出以下可能性:
第一种可能:该漏洞的成因为 mysql 中默认留有一个用户名为空的用户,所以导致输入任意用户名空密码可登陆
第二种可能:可能有这个漏洞的phpmyadmin是有后门的
以上皆是粗浅分析 phpmyadmin 2.11.3 的结论。如有不正确的地方欢迎指出