phpmyadmin 万能密码简单分析


网上广为流程的 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
2
3
create user ''@'localhost' identified by '';

flush privileges;

再次使用 “万能密码”登陆,发现成功登陆。

退出,用户名处乱打,密码不写,依然能成功登陆


看来所谓的 “万能密码” 只是 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
2
3
4
5
6
7
require_once './libraries/auth/' . $cfg['Server']['auth_type'] . '.auth.lib.php';

if (!PMA_auth_check()) {
PMA_auth();
} else {
PMA_auth_set_user();
}

然后程序将走到

libraries/common.inc.php line 819

调用函数 PMA_DBI_connect,传入 账号密码


1
2
3
4
if (! $controllink) {
$controllink = PMA_DBI_connect($cfg['Server']['user'],
$cfg['Server']['password'], true);
}

libraries/dbi/mysql.dbi.lib.phpPMA_DBI_connect 函数中,line 77

调用函数 PMA_DBI_real_connect,传入配置,*$user* 和 $password 都是函数形参

最终返回的是 PMA_DBI_real_connect函数的返回值

1
2
3
$link = PMA_DBI_real_connect($cfg['Server']['host'] . $server_port . $server_socket, $user, $password, empty($client_flags) ? NULL : $client_flags);
......
return $link;

libraries/dbi/mysql.dbi.lib.phpPMA_DBI_real_connect 函数中,line 30

$link 尝试连接 mysql 数据库,如果成功则返回资源,失败返回 false

最终返回的就是 是否成功连接 mysql数据库,成功返回连接句柄,失败返回 false

1
2
3
$link = @mysql_connect($server, $user, $password);
......
return $link;

以上就是 phpmyadmin 登陆的过程了。只要 $link 返回连接句柄则登陆成功,反之登陆失败


这么看下来,感觉和 phpmyadmin 的代码没有半毛关系,只是 mysql 配置的问题。而且也不是非要用 'localhost'@'@" 才能登陆


至于为什么随便输入也能登陆呢?简单测试了下:

1
2
3
4
5
6
<?php
var_dump(mysql_connect("127.0.0.1","",'')); //结果 resource
var_dump(mysql_connect("127.0.0.1","123",'')); //结果 resource
var_dump(mysql_connect("127.0.0.1","123",'123')); //结果 false
var_dump(mysql_connect("127.0.0.1","",'123')); //结果 false
?>

猜测


基于以上粗浅的分析,得出以下可能性:

第一种可能:该漏洞的成因为 mysql 中默认留有一个用户名为空的用户,所以导致输入任意用户名空密码可登陆

第二种可能:可能有这个漏洞的phpmyadmin是有后门的


以上皆是粗浅分析 phpmyadmin 2.11.3 的结论。如有不正确的地方欢迎指出