初识文件包含
字数 1269 2025-08-15 21:31:32

PHP文件包含漏洞详解

一、文件包含漏洞概述

文件包含漏洞是指通过PHP的相应函数引入文件时,由于传入的文件名没有经过合理校验,导致可以操作预想之外的文件,从而可能造成文件泄露或恶意代码注入。

漏洞形成的两个必要条件:

  1. 用户能够控制动态变量
  2. include()等函数通过动态变量的方式引入需要包含的文件

二、危险函数列表

PHP中涉及文件包含的危险函数包括:

  1. include() - 包含并运行指定文件,发生错误时发出警告但继续执行
  2. require() - 包含并运行指定文件,发生错误时直接终止程序
  3. include_once() - 类似include(),但会检查文件是否已导入,避免重复导入
  4. require_once() - 类似require(),但会检查文件是否已导入,避免重复导入

三、文件包含漏洞分类

1. 本地文件包含(LFI - Local File Inclusion)

能够读取或执行包含本地文件的漏洞。

利用示例

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

通过base64编码读取index.php源码,解码后可查看文件内容。

2. 远程文件包含(RFI - Remote File Inclusion)

当PHP配置允许时,可以加载远程文件执行任意命令。

必要条件

  • php.ini中allow_url_fopenallow_url_include都设置为ON

配置选项说明

  • allow_url_fopen:是否允许打开URL文件
  • allow_url_include:是否允许引用URL文件

四、常见文件包含写法

  1. include $_GET[]
  2. include $_GET[].".inc"
  3. include "./".$_GET[]
  4. include "./include".$_GET[]
  5. include "./include".$_GET[].".inc"

五、PHP伪协议利用

1. file协议

访问本地磁盘文件:

?file=file://C:/windows/1.txt

2. php://filter

对本地磁盘文件进行读写操作:

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

3. php://input

通过POST数据执行代码:

?file=php://input
[POST数据] <?php phpinfo();?>

4. data://

直接执行代码:

?file=data://text/plain,<?php phpinfo();?>

六、文件包含漏洞的危害

  1. 敏感信息泄露 - 读取服务器上的敏感文件
  2. 获取webshell - 通过包含恶意文件获取服务器控制权
  3. 任意命令执行 - 执行系统命令,完全控制服务器

七、漏洞修复方案

  1. 设置白名单 - 只允许包含指定的文件
  2. 过滤危险字符 - 如../:http://
  3. 设置文件目录 - 限制文件包含的目录范围
  4. 关闭危险配置 - 将allow_url_fopenallow_url_include设置为OFF

八、实际案例分析

以南京邮电大学网络攻防训练平台的一道CTF题为例:

  1. 题目提示为本地文件包含漏洞
  2. 利用php://filter伪协议读取index.php源码:
?file=php://filter/read=convert.base64-encode/resource=index.php
  1. 对获取的base64编码进行解码,即可查看flag

通过这个案例展示了如何利用文件包含漏洞读取服务器上的PHP源代码。

PHP文件包含漏洞详解 一、文件包含漏洞概述 文件包含漏洞是指通过PHP的相应函数引入文件时,由于传入的文件名没有经过合理校验,导致可以操作预想之外的文件,从而可能造成文件泄露或恶意代码注入。 漏洞形成的两个必要条件: 用户能够控制动态变量 include()等函数通过动态变量的方式引入需要包含的文件 二、危险函数列表 PHP中涉及文件包含的危险函数包括: include() - 包含并运行指定文件,发生错误时发出警告但继续执行 require() - 包含并运行指定文件,发生错误时直接终止程序 include_ once() - 类似include(),但会检查文件是否已导入,避免重复导入 require_ once() - 类似require(),但会检查文件是否已导入,避免重复导入 三、文件包含漏洞分类 1. 本地文件包含(LFI - Local File Inclusion) 能够读取或执行包含本地文件的漏洞。 利用示例 : 通过base64编码读取index.php源码,解码后可查看文件内容。 2. 远程文件包含(RFI - Remote File Inclusion) 当PHP配置允许时,可以加载远程文件执行任意命令。 必要条件 : php.ini中 allow_url_fopen 和 allow_url_include 都设置为ON 配置选项说明 : allow_url_fopen :是否允许打开URL文件 allow_url_include :是否允许引用URL文件 四、常见文件包含写法 include $_GET[] include $_GET[].".inc" include "./".$_GET[] include "./include".$_GET[] include "./include".$_GET[].".inc" 五、PHP伪协议利用 1. file协议 访问本地磁盘文件: 2. php://filter 对本地磁盘文件进行读写操作: 3. php://input 通过POST数据执行代码: 4. data:// 直接执行代码: 六、文件包含漏洞的危害 敏感信息泄露 - 读取服务器上的敏感文件 获取webshell - 通过包含恶意文件获取服务器控制权 任意命令执行 - 执行系统命令,完全控制服务器 七、漏洞修复方案 设置白名单 - 只允许包含指定的文件 过滤危险字符 - 如 ../ 、 : 、 http:// 等 设置文件目录 - 限制文件包含的目录范围 关闭危险配置 - 将 allow_url_fopen 和 allow_url_include 设置为OFF 八、实际案例分析 以南京邮电大学网络攻防训练平台的一道CTF题为例: 题目提示为本地文件包含漏洞 利用php://filter伪协议读取index.php源码: 对获取的base64编码进行解码,即可查看flag 通过这个案例展示了如何利用文件包含漏洞读取服务器上的PHP源代码。