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类似,都是用于临时数据存储的伪协议包装器,主要区别在于:

  1. php://memory始终将数据存储在内存中
  2. php://temp在数据量达到预定义限制(默认2MB)后会存入临时文件
  3. 临时文件位置由sys_get_temp_dir()决定

可以通过/maxmemory:NN参数控制php://temp的内存限制,其中NN是以字节为单位的最大内存数据量。

0x02 工作机制分析

当向php://temp写入数据时:

  1. 数据量小于限制时:存储在内存中
  2. 数据量超过限制时:
    • 自动创建临时文件(通常位于/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场景:

  1. 文件长度受限:当题目限制文件名长度时(如不超过13字符)
  2. 文件权限受限:当难以找到可写权限的现有文件时
  3. 绕过过滤:当常规协议(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);
?>

解题思路:

  1. 使用php://temp作为file参数(长度10,满足<13)
  2. 写入超过2MB的数据触发临时文件创建
  3. 通过/proc/self/fd/3包含临时文件

0x04 高级利用技巧

结合/proc/self/fd包含

当有以下限制时特别有用:

  1. 包含文件名长度限制
  2. 过滤了常见关键字(tmp|php|sess等)
  3. 无法使用其他协议(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 防御建议

  1. 严格限制包含的文件路径
  2. 禁用不必要的协议(如allow_url_include=Off)
  3. 对/proc目录的访问进行限制
  4. 对写入内容进行严格过滤

0x06 总结

php://temp是一个强大的伪协议,特别在以下场景中非常有用:

  • 需要临时文件但无法创建常规文件
  • 文件名长度受限
  • 需要绕过某些过滤限制

理解其工作机制(内存缓冲和自动文件创建)对于CTF解题和安全审计都非常重要。

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) 测试代码: 执行后会观察到/proc/self/fd/下新增了描述符3,指向/tmp/php[ 随机字符 ]文件。 0x03 实际应用场景 php://temp特别适用于以下CTF场景: 文件长度受限 :当题目限制文件名长度时(如不超过13字符) 文件权限受限 :当难以找到可写权限的现有文件时 绕过过滤 :当常规协议(file://, phar://等)被过滤时 典型题目分析 题目代码: 解题思路: 使用 php://temp 作为file参数(长度10,满足 <13) 写入超过2MB的数据触发临时文件创建 通过 /proc/self/fd/3 包含临时文件 0x04 高级利用技巧 结合/proc/self/fd包含 当有以下限制时特别有用: 包含文件名长度限制 过滤了常见关键字(tmp|php|sess等) 无法使用其他协议(php://filter被过滤) 利用代码示例: 与其他协议对比 | 协议 | 读写支持 | 需要文件存在 | 内存限制 | 自动创建文件 | |------|---------|------------|---------|-------------| | file:// | 是 | 是 | 无 | 否 | | phar:// | 是 | 是 | 无 | 否 | | php://memory | 是 | 否 | 无 | 否 | | php://temp | 是 | 否 | 默认2MB | 是(超限时) | | php://fd | 是 | 否 | 无 | 否 | 0x05 防御建议 严格限制包含的文件路径 禁用不必要的协议(如allow_ url_ include=Off) 对/proc目录的访问进行限制 对写入内容进行严格过滤 0x06 总结 php://temp是一个强大的伪协议,特别在以下场景中非常有用: 需要临时文件但无法创建常规文件 文件名长度受限 需要绕过某些过滤限制 理解其工作机制(内存缓冲和自动文件创建)对于CTF解题和安全审计都非常重要。