摘要

PHP伪协议

PHP伪协议是一种用于在PHP中访问不同资源和执行不同操作的特殊URL方案。这些伪协议以 php://​ 开头,后跟不同的标识符,用于指示要执行的操作。以下是一些常见的PHP伪协议及其用途:

  1. php://input: 这个伪协议用于访问HTTP请求的原始主体数据。它通常用于从POST请求中读取数据。
  2. php://output: 这个伪协议用于访问HTTP响应的输出流。它通常用于向客户端发送数据。
  3. php://stdin: 用于访问标准输入流。
  4. php://stdout: 用于访问标准输出流。
  5. php://stderr: 用于访问标准错误输出流。
  6. php://temp: 用于临时存储数据的内存流。它可以用于在没有创建实际文件的情况下处理临时数据。
  7. php://memory: 用于在内存中创建可读写的数据流。
  8. php://filter: 这个伪协议用于数据过滤和转换。它允许您将不同的过滤器应用于数据流,例如Base64编码、压缩和加密等。
  9. php://globals: 用于访问全局变量。可以通过此伪协议查看和修改PHP全局变量的值。
  10. php://fd: 用于访问文件描述符。它允许您在PHP中访问底层文件系统。

这些伪协议可以用于访问不同类型的资源,例如文件、输入/输出流、内存数据等。它们在PHP中提供了更灵活的数据处理和资源访问的方式。但要小心使用,确保不滥用它们,因为错误的使用可能导致安全漏洞。

1.例一

使用 php://filter/read 从一个URL中读取数据,并对其进行Base64解码。

如果base被过滤,可以考虑utf编码绕过。

php://filter/convert.iconv.utf-8.utf-7/resource=imposible.php

php://filter/string.rot13/resource=imposible.php

php://filter/read=convert.base64-encode/resource=​ 中,resource​ 后面应该跟着要编码的资源的标识符,这个标识符通常是文件路径或数据流的名称。具体来说,您需要提供要进行Base64编码的资源的标识符。

  • 如果您要对文件进行编码,那么 resource​ 应该是文件的路径,例如 /path/to/your/file.txt​。
  • 如果您要对数据流进行编码,那么 resource​ 应该是数据流的名称或标识符。

换句话说,resource​ 应该是指向您要处理的具体资源的标识符。编码过程将基于此资源执行,并且结果将被返回以供读取或处理。

2.例二

php://input:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 <?php
error_reporting(0);

$text = $_GET["text"];
$file = $_GET["file"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the 504sys")){
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag|data|base|write|input/i",$file)){
echo "I am sorry but no way!";
exit();
}else{
include($file); //imposible.php
}
}
else{
highlight_file(__FILE__);
}
?>

单看文字,没看懂是什么意思。在上面的例子可以看到 当user=“the user is a admin”的时候,才会输出hello world 。然后上面hackbar中,没有将user变量直接复制为”the user is a admin”,而是,先等于php://input,然后用post请求提交一个值是“the user is admin”。可以看到网页输出了hello admin!依旧可以达到user=“the user is a admin”的效果。这样我就理解了刚才的那句话 可以访问请求的原始数据的只读流,在POST请求中访问POST的data部分 。