文件包含漏洞

1、文件包含

一般为了更好地使用代码的重用性,引入文件包含函数,通过文件包含函数将文件包含进来,直接使用包含文件的代码,简单点来说就是一个文件里面包含另外一个或多个文件。

2、漏洞成因

文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。

3、引发文件包含漏洞的函数

PHP

复制代码
include()
include_once()
require()
require_once()

include()和require()的区别:
require()如果在包含过程中出错,就会直接退出,不执行后续语句
require()如果在包含过程中出错,只会提出警告,但不影响后续语句的执行

JAVA

复制代码
JSP 的文件包含分为静态包含和动态包含两种。

第一种是静态包含:
<%@include file="test.jsp"%>

第二种便是动态包含,动态包含的形式有如下两种:

<jsp:include page="<%=file%>"></jsp:include>
<jsp:include page ="<%=file%>"/>
<c:import url="<%= url%>"></c:import>

所谓的静态包含就是指包含在其中的参数值, 如上述的file参数,不能动态赋值,定义的时候写的是什么,那就是什么,而不能够在项目运行时,动态的赋值给它。因此,通常我们认为,静态包含并不含有文件包含漏洞,当然,不排除和其他漏洞结合而产生的奇妙反应造成包含漏洞产生的可能性;

静态包含是翻译阶段执行的,即被包含的文件和被插入到的页面会被 JSP 编译器合成编译,最终编译后的文件实际上只有一个。而动态包含实际是在请求处理阶段执行的,JSP程序会将请求转发到(注意不是重定向)被包含页面,并将执行结果输出到浏览器中,然后返回页面继续执行后面的代码,即被包含的文件和被插入到的页面会被JSP编译器单独编译。

本地文件包含漏洞

顾名思义,指的是能打开并包含本地文件的漏洞。大多数情况下遇到的文件包含漏洞都是本地文件包含漏洞。因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。

远程文件包含漏洞

是指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的,因此漏洞一旦存在,危害性会很大。但远程文件包含漏洞的利用条件较为苛刻;因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。

如PHP的需要php.ini中配置

复制代码
allow_url_fopen=On
allow_url_include=On

4、文件包含漏洞之伪协议

php://filter

利用条件:

只是读取,所以只需要开启allow_url_fopen,对allow_url_include不做要求

用法

复制代码
index.php?file=php://filter/read=convert.base64-encode/resource=xxx.php

通过指定末尾文件,可以读取经base64加密后的文件源码,虽然不能直接获取shell等,但能够读取敏感文件,危害还是是挺大的。

php://input

可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行

利用条件:

需要开启allow_url_include=on,对allow_url_fopen不做要求

用法:?file=php://input 数据利用POST传过去。

zip://伪协议

zip://可以访问压缩文件中的文件

条件: 使用zip协议,需要将#编码为%23,所以需要PHP 的版本> =5.3.0,要是因为版本的问题无法将#编码成%23,可以手动把#改成%23。

用法:?file=zip://压缩文件路径#压缩文件内的子文件名

phar://伪协议

与zip://协议类似,但用法不同,zip://伪协议中是用#把压缩文件路径和压缩文件的子文件名隔开,而phar://伪协议中是用/把压缩文件路径和压缩文件的子文件名隔开,即?file=phar://压缩文件路径/压缩文件内的子文件名

data:text/plain

和php伪协议的input类似,也可以执行任意代码,但利用条件和用法不同

条件:allow_url_fopen参数与allow_url_include都需开启

用法1:?file=data:text/plain,<?php 执行内容 ?>

用法2:?file=data:text/plain;base64,编码后的php代码

file://伪协议

file:// 用于访问本地文件系统,且不受allow_url_fopen与allow_url_include的影响。

用法:?file=file://文件绝对路径

防范措施

1、PHP 中使用 open_basedir 配置限制访问在指定的区域

2、功能设计上尽量不要将文件包含函数对应的文件放给前端进行选择和操作;

3、过滤.(点)/(反斜杠)\(反斜杠) ../ 、 http://、https:// 等特殊字符

4、尽量关闭allow_url_include配置

5、通过白名单策略,仅允许包含运行指定的文件,其他的都禁止;

相关推荐
极客先躯11 分钟前
高级java每日一道面试题-2026年05月11日-实战篇[Docker]-如何容器化金融产品推荐系统?
java·运维·docker·容器·金融·高级面试·金融产品推荐系统
朱容zr33313328 分钟前
为什么推荐使用自增主键?使用UUID作为主键的优缺点是什么?
java·运维·数据库·后端·mysql·面试·性能优化
知彼解己1 小时前
Eclipse Temurin:企业级 Java JDK 发行版的最佳实践
java·ide·eclipse
朱容zr3331331 小时前
请解释“回表”的概念。
java·前端·数据库
不吃辣4901 小时前
vibe coding | 如何做一个 AI 音乐生成工具?
java·人工智能·后端·ai·ai编程
NWU_LK1 小时前
【WebFlux】第八篇 —— 自定义调度器
java
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第210题】【10_网络协议篇】第1题:说说 TCP/IP 网络五层模型
java·网络协议·tcp/ip·计算机网络·网络五层模型
wuminyu1 小时前
JUC组件逐层剥离与深度剖析
java·linux·c语言·jvm·c++·算法
大黄说说1 小时前
EF Core 避坑指南:查询慢、循环查询、并发更新问题如何解决
java·服务器·数据库
小码哥哥1 小时前
企业级AI知识库:高效安全的知识管理新范式
人工智能·安全