初识文件包含
字数 1269 2025-08-15 21:31:32
PHP文件包含漏洞详解
一、文件包含漏洞概述
文件包含漏洞是指通过PHP的相应函数引入文件时,由于传入的文件名没有经过合理校验,导致可以操作预想之外的文件,从而可能造成文件泄露或恶意代码注入。
漏洞形成的两个必要条件:
- 用户能够控制动态变量
- include()等函数通过动态变量的方式引入需要包含的文件
二、危险函数列表
PHP中涉及文件包含的危险函数包括:
- include() - 包含并运行指定文件,发生错误时发出警告但继续执行
- require() - 包含并运行指定文件,发生错误时直接终止程序
- include_once() - 类似include(),但会检查文件是否已导入,避免重复导入
- 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_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协议
访问本地磁盘文件:
?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();?>
六、文件包含漏洞的危害
- 敏感信息泄露 - 读取服务器上的敏感文件
- 获取webshell - 通过包含恶意文件获取服务器控制权
- 任意命令执行 - 执行系统命令,完全控制服务器
七、漏洞修复方案
- 设置白名单 - 只允许包含指定的文件
- 过滤危险字符 - 如
../、:、http://等 - 设置文件目录 - 限制文件包含的目录范围
- 关闭危险配置 - 将
allow_url_fopen和allow_url_include设置为OFF
八、实际案例分析
以南京邮电大学网络攻防训练平台的一道CTF题为例:
- 题目提示为本地文件包含漏洞
- 利用php://filter伪协议读取index.php源码:
?file=php://filter/read=convert.base64-encode/resource=index.php
- 对获取的base64编码进行解码,即可查看flag
通过这个案例展示了如何利用文件包含漏洞读取服务器上的PHP源代码。