Pikachu靶场-目录遍历
目录遍历是一种常见的安全漏洞,攻击者通过操纵文件路径参数访问服务器上的受限文件或目录。以下是对该漏洞的详细解析:
1. 漏洞原理
核心问题:应用程序未对用户输入的文件路径进行严格验证,导致攻击者可构造特殊路径跳出预期目录。
常见场景:
- 文件下载/查看功能(如download.php?file=report.pdf)。
- 文件包含(如include($_GET['page'] . '.php'))。
- 上传文件路径处理不当。
2. 攻击方式
相对路径遍历:
- 使用../返回上级目录,如../../etc/passwd。
- 组合使用路径分隔符(如..\、..//)。
绝对路径遍历:
- 直接输入系统绝对路径(如/var/www/config.php)。
编码绕过:
- URL编码:%2e%2e%2f(对应../)。
- 双重编码:%252e%252e%252f(解码两次后为../)。
- Unicode/UTF-8编码:如%c0%af(对应/)。
操作系统特性利用:
- Windows:使用反斜杠(..\)、..%5c或UNC路径(\\localhost\C$\file)。
- Linux:使用正斜杠(/)或空字节绕过扩展名检查(../../etc/passwd%00.jpg)。
3. 漏洞危害
- 敏感文件泄露:如/etc/passwd、/etc/shadow(Linux)或C:\Windows\win.ini(Windows)。
- 应用程序配置暴露:数据库凭证(config.php)、日志文件等。
- 系统文件篡改:若结合写入权限,可能植入后门或破坏系统。
4. 防御措施
输入验证与过滤:
- 白名单机制:仅允许指定字符(如字母、数字、短横线)。
- 黑名单过滤:禁止../、..\等符号(需谨慎,易被绕过)。
路径规范化处理:
- 使用编程语言内置函数解析绝对路径(如Java的getCanonicalPath()、PHP的realpath())。
- 确保最终路径限制在目标目录内(如检查是否以/var/www/uploads/开头)。
文件系统权限控制:
- 运行Web服务器的用户应仅有必要目录的最小权限。
- 禁止Web用户访问系统关键文件。
安全配置:
- 关闭服务器目录列表功能。
- 避免在错误信息中暴露文件路径。
安全编码实践:
- 使用安全的API处理文件操作(如Python的os.path.join()避免路径拼接)。
- 禁用危险函数(如PHP的include直接包含用户输入)。
5. 测试与验证
手动测试:
- 修改参数值为../、..%2f等,观察是否返回敏感文件。
- 尝试读取已知文件(如/etc/passwd)验证漏洞。
工具辅助:
- Burp Suite:拦截请求并修改参数进行Fuzzing。
- OWASP ZAP:自动化扫描目录遍历漏洞。
- DotDotPwn:专门测试路径遍历的工具。
6. 实际案例
- 案例1:某CMS的图片下载功能未过滤file参数,攻击者通过image.php?file=../../../wp-config.php窃取数据库密码。
- 案例2:文件共享服务允许用户输入绝对路径(C:\Users\admin\Documents\secret.txt),导致数据泄露。
- 修复方案:更新版本中限制路径在指定目录,并过滤所有非字母数字字符。
7. 常见误区
- 仅过滤部分字符:如仅替换../,但忽略编码或大小写变种(如..%255c)。
- 依赖黑名单:更安全的做法是采用白名单+路径规范化。
- 忽略操作系统差异:需针对部署环境(Linux/Windows)分别测试。
靶场实验部分:
1,观察网站,网站URL栏通过接收GET请求参数去实现文件包含功能
使用目录遍历的常见套路就能够读取危险的敏感文件
、
缺点是只能读取不能被PHP解释器解析的文件,无法通过泄露的源代码进行审计而后制定攻击形式
代码审计分析(目录遍历漏洞)
1. 漏洞位置
$filename = $_GET['title'];
require "soup/$filename";
- 关键问题:未对用户输入的 title 参数进行过滤,直接拼接进文件路径并加载文件。
- 攻击入口:通过构造 title 参数的值,攻击者可跳出 soup/ 目录,访问任意文件。
2. 漏洞利用示例
读取系统敏感文件:
GET /dir_list.php?title=../../../../etc/passwd HTTP/1.1
实际加载路径:soup/../../../../etc/passwd,可能泄露 Linux 系统用户信息。
读取 Web 应用配置文件:
GET /dir_list.php?title=../../../config.php HTTP/1.1
可能暴露数据库密码等敏感配置。
3. 漏洞成因
- 未校验用户输入:
- $_GET['title'] 直接赋值给 $filename,未过滤 ../ 等特殊字符。
- 路径拼接风险:
- 使用相对路径拼接 "soup/$filename",未限制文件访问范围。
- 危险函数调用:
- require 直接包含用户可控文件,若文件内容包含 PHP 代码,可能导致代码执行(需结合文件上传等其他漏洞)。
4. 修复建议
方案1:白名单限制文件名
// 仅允许指定文件名(如 jarheads.php、truman.php)
$allowed_files = ['jarheads.php', 'truman.php'];
if (in_array($_GET['title'], $allowed_files)) {
$filename = $_GET['title'];
require "soup/$filename";
} else {
die("Invalid request!");
}
- 优点:彻底杜绝目录遍历。
- 缺点:需提前明确合法文件名列表。
方案2:剥离路径字符
// 使用 basename() 去除路径部分
$filename = basename($_GET['title']);
require "soup/$filename";
- 作用:确保 $filename 不含 / 或 \,例如 ../../etc/passwd 会被转换为 passwd。
- 风险:若攻击者知道 soup/ 同级目录下的敏感文件名,仍可能访问非预期文件。
方案3:路径规范化校验
$base_dir = realpath('soup/'); // 获取 soup 目录绝对路径
$filename = realpath("soup/" . $_GET['title']);
// 校验路径是否在允许的目录下
if ($filename !== false && strpos($filename, $base_dir) === 0) {
require $filename;
} else {
die("Invalid file path!");
}
- 优点:严格限制文件必须位于 soup/ 或其子目录下。
- 注意:需处理 realpath() 返回 false 的情况(如文件不存在)。
5. 其他安全增强
- 关闭错误回显:
ini_set('display_errors', 0);
避免路径信息通过错误消息泄露。 - 限制文件类型(若适用):
$extension = pathinfo($_GET['title'], PATHINFO_EXTENSION);
if ($extension !== 'php') {
die("Only PHP files are allowed!");
}
6. 漏洞验证测试
- 正常请求:
GET /dir_list.php?title=jarheads.php HTTP/1.1
预期结果:正常加载 soup/jarheads.php。
- 恶意遍历请求:
GET /dir_list.php?title=../../header.php HTTP/1.1
- 预期结果(修复前):成功读取 header.php 文件内容。
- 预期结果(修复后):返回错误提示。
7. 总结
- 风险等级:高危(可导致敏感信息泄露,甚至远程代码执行)。
- 修复优先级:需立即修复。
- 推荐方案:结合 白名单 + 路径规范化校验,实现多层防御。