phpMyAdmin远程执行代码误差清静通告

宣布时间 2018-07-03

误差编号和级别


CVE-2018-12613  厂商自评:高危  CVSS分值:官方未评定


影响规模


受影响的系统版本:


phpMyAdmin 4.8.0
phpMyAdmin 4.8.1


误差概述


phpMyAdmin 是一个以PHP为基础,以Web-Base方法架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。


在phpMyAdmin 4.8.x版本中,程序没有严酷控制用户的输入,攻击者可以使用双重编码绕过程序的白名单限制,造成文件包括误差。


此误差使经由身份验证的远程攻击者能够在服务器上执行恣意PHP代码。


phpMyAdmin的海内数据统计图如下:


 尊龙凯时 - 人生就是搏!


误差剖析


在/index.php


尊龙凯时 - 人生就是搏!

 

这里的target 可以直接传值输入。我们可以传入一个外地文件路径去让其包括,就会造成LFI误差。


首先,我们知足4个条件:


1.传入的target 需要是一个字符串。
2.不可以/index/ 开头。

3.不可在$target_blacklist数组内。


 尊龙凯时 - 人生就是搏!


4.知足checkPageValidity函数要求。


跟踪一下checkPageValidity函数


在/libraries/classes/Core.php


 尊龙凯时 - 人生就是搏!


该函数内,有三处返回ture的地方,只要有恣意一处返回ture就可以。视察这三处,有一个配合点,都是需要$page在$whitelist数组中内才会返回true。


 尊龙凯时 - 人生就是搏!


我们先看第一个返回true的地方。


 尊龙凯时 - 人生就是搏!


这里的$page在in_array之前没有经由任何的修饰,直接就与$whitelist作较量。没有步伐绕过,传入的target值只能为白名单里的文件名才行。很显着,第一个并不可使用。


再来看第二个


 尊龙凯时 - 人生就是搏!


先先容下这些函数的作用:


mb_strpos()函数的意思是查找字符串在另一个字符串中首次泛起的位置。


mb_substr()函数的意思是:


string mb_substr ( string $str, int $start [, int $length = NULL [, string $encoding = mb_internal_encoding()]] )

从$str字符串中,提取从$start位置最先,长度为$length的字符串。


可以看出,第二个可以返回ture,我们使用db_sql.php?/../../名堂就可以抵达目的,绕过白名单限制。那是不是这样就可以造成误差了呢 ?


假设我们用db_sql.php?/../../../aaa.txt来绕过白名单限制举行包括文件。


 尊龙凯时 - 人生就是搏!


那这里就是 include ‘db_sql.php?/../../../aaa.txt’。


这种名堂并不可跨路径包括,由于php程序把 ?号后面的工具当成是传入db_sql.php文件的参数。


再来看第三个:


 尊龙凯时 - 人生就是搏!


第三个和第二个比照多出了个urldecode()函数。


而问题恰恰出在了这个urldecode()函数。


我们可以使用双重编码绕过,将?经由两次编码%253f就可以绕过白名单验证。


缘故原由是:


%253f 传入时,首先会被自动解码一次,酿成%3f。然后urldecode()再解码一次,就酿成了 ?。 乐成绕过了白名单限制。


这种情形下include的包括情形就是这样的,也就可以恣意包括外地文件了。


include  db_sql.php%3f/../../../aaa.txt。


误差使用


完整的exp:


GET /index.php?target=sql.php%3f/../../etc/passwd


tips:


1、%3f 将被解码并成为?。

2、Core::checkPageValidity剥离所有内容?并sql.php在白名单内找到:检查被绕过!
3、index.php运行include 'sql.php?/../../etc/passwd',PHP的魔术来转换路径 ../etc/passwd,而不检查目录是否sql.php?保存。最后,它包括../etc/passwd乐成。


要写这个误差,可以枚举文件路径,如:


/etc/passwd

../../etc/passwd
../windows/win.ini

../../windows/win.ini


一旦你找到了..你需要预先设置的数目 ,你可以将你的php有用载荷注入到会见日志中,或者运行一个盘问SELECT ‘<?php phpinfo();?>',sql.php并包括你自己的会话文件(例如/var/lib/php5/sess_<PHPSESSID>),它包括你的SQL盘问,以执行恣意PHP代码。


修复建议


现在官方已修复该误差,宣布了最新版本4.8.2,可从官网下载最新版本。


下载链接:https://www.phpmyadmin.net/news/2018/6/21/security-fix-phpmyadmin-482-released/。


参考链接


https://www.phpmyadmin.net/security/PMASA-2018-4/
https://www.securityfocus.com/bid/104532
https://nvd.nist.gov/vuln/detail/CVE-2018-12613