CVE-2018-12613phpMyAdmin 后台文件包含漏洞分析

CVE-2018-12613phpMyAdmin 后台文件包含漏洞分析

一、    漏洞背景

phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。借由此Web接口可以成为一个简易方式输入繁杂SQL语法的较佳途径,尤其要处理大量资料的汇入及汇出更为方便。其中一个更大的优势在于由于phpMyAdmin跟其他PHP程式一样在网页服务器上执行,但是您可以在任何地方使用这些程式产生的HTML页面,也就是于远端管理MySQL数据库,方便的建立、修改、删除数据库及资料表。也可借由phpMyAdmin建立常用的php语法,方便编写网页时所需要的sql语法正确性。

ChaMd5安全团队披露了他们发现的一个phpMyAdmin文件包含漏洞,并且演示了如何将本地文件包含升级至远程命令执行。随后,phpmyadmin在最新版本修复了这个严重级别的漏洞。

二、    漏洞描述

攻击者利用发现在服务器上包含(查看和潜在执行)文件的漏洞。该漏洞来自一部分代码,其中页面在phpMyAdmin中被重定向和加载,以及对白名单页面进行不正确的测试。

攻击者必须经过身份验证,但在这些情况下除外:

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

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

影响版本:phpMyAdmin 4.8.0和4.8.1

三、    漏洞分析

 图片.png

测试发现漏洞的入口在index.php 54-63行,我们可以看到if区间一共有五个判断:

1. 是否存在target参数

2. target参数是否为字符串

3. 值不能以index开头

4. 值不能出现在$target_blacklist内

5. Core类的checkPageValidity方法判断

如果通过判断则包含参数所指定的文件,存在文件包含隐患。前三个判断比较通俗易懂,重要的是后面两个判断,调用第四个判断函数,数组中有两个参数。

 图片.png

$target_blacklist中的数组为import.php 和 export.php,只要target的值不是这两个就可以,然后进入第五个判断。

首先找到Core类的checkPageValidity函数,在文件libraries/classes/Core.php文件中。

 图片.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

 图片.png

$goto_whilelist定义了些可以被包含的文件名(省略了一部分)

第二个if直接跳过我们来看第三个if区间,如果$page如果等于$goto_whilelist的某个值则return真。phpmyadmin的开发团队考虑的很全面,想到了会存在target的值后面再跟参数的情况,于是有了第三个判断:

 图片.png

$_page为 以?分割然后取出前面的字符串再判断值是否存在于$goto_whilelist某个数组中。这个判断的作用是,如果target值带有参数的情况下,phpmyadmin也能正确的包含文件。

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

 图片.png

后面又将$page参数用urlencode解码再进行以?分割取出前面的值做判断。

那么传入target=db_sql.php%253f/../../test.txt,txt内容为//%253f是?号的二此url编码,urlcode将$page解码后是db_sql.php?/../../test.php 。再以?分割取出来前面的字符串为index.php,$whitelist中有index.php所以会进入最后一个if区间return true

index.php中提到

 图片.png

前面5个if都符合后会包含$_REQUEST['target'],target值会被解析成db_sql.php%3f/../../test.txt,因为php会把前面db_sql.php%3f当成目录,所以要多加一个../来跳出此目录,执行后面语句。

 图片.png

四、    漏洞复现

在这里我们利用包含session文件的方式来复现文件包含漏洞。首先进入VulnSpy 在线 phpMyAdmin 环境地址,点击 Start to Hack ,跳转到VSPlate。然后点击正在处于running状态演示地址项目,进行实验环境为phpmyadmin-4.8.1的文件包含漏洞复现。

 图片.png

点击进入演示地址,帐户密码未root/toor。

 图片.png图片.png

 

然后点击SQL,执行select语句:    

select ‘<?php phpinfo();exit;?>’,执行成功如下

 图片.png

PHP会序列化参数传递的值,并且保存在本地的session文件中。此时,F12查看当前phpmyadmin的cookie,并记录。

 图片.png

Macos的session保存目录为/var/tmp/,Linux的session保存目录为/var/lib/php/sessions,这样当前对应的SESSION文件为/var/lib/php/sessions/sess_你的SESSION ID。当前为:var/lib/php/sessions/sess_8e7caa4u1m3gdhrij0g3thfllbqfsrqf

然后在当前URL中包含次session文件:

http://4c69a765fd110c8271e6e2174576855a.vsplate.me/index.php?target=db_sql.php%253f/../../../../../../../../var/lib/php/sessions/sess_8e7caa4u1m3gdhrij0g3thfllbqfsrqf,执行成功复现文件包含漏洞和命令执行。

 图片.png

此外,还有2种getshell的方法,第一个是上传sql文件,然后包含mysql的sql文件,第二个是开启general_log来完成getshell。不过这两种思路都有些繁琐,利用有一定的局限性,所以仅以Phithon师傅在知识星球【代码审计】中提供的session文件包含来验证次命令执行漏洞。

五、    修复建议

在漏洞发布不久,该漏洞已经被修复,漏洞存在于版本号小于4.8.2的所有历史版本中,通过git changelog查看官方如何修复漏洞的。查看补丁源码,参考URL:https://github.com/phpmyadmin/phpmyadmin/commit/d1360f46cef76c5182116eb2b8fdbab1b20e687a

 图片.png

发现修复手法简单粗暴,直接在checkPageValidity中多加了一个参数$include。当$include=true时,仅执行第一次判断$page的合法性,我们的payload也就没有办法进入到urldecode的步骤了

关注我们

Tide安全团队正式成立于2019年1月,是以互联网攻防技术研究为目标的安全团队,目前聚集了十多位专业的安全攻防技术研究人员,专注于网络攻防、Web安全、移动终端、安全开发、IoT/物联网/工控安全等方向。

想了解更多Tide安全团队,请关注团队官网: http://www.TideSec.net 或关注公众号:

1551433162_5c78fdca9fae9.jpg

取消
Loading...

填写个人信息

姓名
电话
邮箱
公司
行业
职位
css.php