浅谈PHP伪协议

admin 2022年2月4日12:53:39评论230 views字数 2232阅读7分26秒阅读模式


php中有很多封装协议,最常见的如file协议,php协议,data协议,zip和phar协议等等


这次我们主要来聊聊php://协议

浅谈PHP伪协议



浅谈PHP伪协议
浅谈PHP伪协议

php://stdin


PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。数据流引用了复制的文件描述符,所以如果你打开 php://stdin 并在之后关了它, 关闭的仅仅是复制品,真正被引用的 STDIN 并不受影响。STDIN常量是一个已经打开的stdin流,可节省几行代码,也可节省小部分打开stdin的性能,php://stdin是只读的,使用fgets读取,通常情况下只能读取一行数据,在较新版本的php中也有办法做到连续读取多行数据,可以使用stream_get_contents 控制读取数量,用于一次性读取包含换行的输入数据。


浅谈PHP伪协议


浅谈PHP伪协议
浅谈PHP伪协议

php://stdout


STDOUT和STDIN正好相反,是标准输出流,它将运行php将字符串默认输出到控制台(可使用freopen重定向到文件),和stdin注意点一样,但在php-cli模式中,作用和echo基本相同,只是实现方式不一样。


浅谈PHP伪协议


浅谈PHP伪协议
浅谈PHP伪协议

php://stderr


STRERR 标准错误和STDOUT差不多,都是将字符串默认打印到控制台,但是这个是打印错误用的,区别就是STDERR在终端支持的情况下会将打印的红色的字符串。


浅谈PHP伪协议


浅谈PHP伪协议
浅谈PHP伪协议

php://input


php://input 是个可以访问请求的原始数据的只读流。POST 请求的情况下,最好使用 php://input 来代替HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。而且,这样的情况下 HTTP_RAW_POST_DATA 默认没有填充,潜在需要更少的内存。


浅谈PHP伪协议


浅谈PHP伪协议
浅谈PHP伪协议

php://output


php://output 是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区。


浅谈PHP伪协议


浅谈PHP伪协议
浅谈PHP伪协议

php://fd


php://fd 允许直接访问指定的文件描述符。例如 php://fd/3 引用了文件描述符 3。用法:在linux中,一切皆文件,当启动系统时,先会启动STDIN标准输入(文件描述符0),之后是STDOUT文件描述符1,STDERR文件描述符2


浅谈PHP伪协议


浅谈PHP伪协议
浅谈PHP伪协议

php://memory和php://temp


php://memory 和 php://temp 是一个类似文件 包装器的数据流,允许读写临时数据。两者的唯一区别是 php://memory 总是把数据储存在内存中, 而 php://temp 会在内存量达到预定义的限制后(默认是 2MB)存入临时文件中。临时文件位置的决定和 sys_get_temp_dir() 的方式一致。php://temp 的内存限制可通过添加 /maxmemory:NN 来控制,NN 是以字节为单位、保留在内存的最大数据量,超过则使用临时文件。


浅谈PHP伪协议


浅谈PHP伪协议
浅谈PHP伪协议

php://filter


php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。php://filter 目标使用以下的参数作为它路径的一部分。复合过滤链能够在一个路径上指定。


浅谈PHP伪协议


浅谈PHP伪协议
浅谈PHP伪协议

stdin和input的区别


先说结论,要明白stdin和input,我们首先要来说stdout和output,stdout和output都是文件流,从定义上来看stdout是PHP进程的标准输出,output是返回的结果数据流,因此,同理可得stdin和input的区别,虽然不难理解,但本着安全研究严谨的态度,我们用代码来验证结论,代码如右侧图片所示,分别用output和stdout来处理输入流。


浅谈PHP伪协议


命令行执行


浅谈PHP伪协议浏览器端请求


浅谈PHP伪协议


由此可见,output只web端进行交互,同理stdin和input只有input用于读取请求正文的原始数据,这也是为什么我们在文件包含着通常使用input来执行命令。


浅谈PHP伪协议
浅谈PHP伪协议

php://filter的应用


base64

base64编码

index.php?file1=php://filter/read=convert.base64-encode/resource=file.php   // 专用于读取php文件
string.rot13

rot13加密

index.php?file1=php://filter/read=string.rot13/resource=file.php
string.toupper

将字符串转化为大写

index.php?file1=php://filter/read=string.toupper/resource=file.php
string.tolower

将字符串转化为小写

index.php?file1=php://filter/read=string.tolower/resource=file.php
string.strip_tags

从字符串中去除 HTML 和 PHP 标记,尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。

index.php?file1=php://filter/read=tring.strip_tags/resource=file.php

这些标记也可以混合使用,用|进行连接


浅谈PHP伪协议

原文始发于微信公众号(山石网科安全技术研究院):浅谈PHP伪协议

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年2月4日12:53:39
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   浅谈PHP伪协议http://cn-sec.com/archives/765309.html

发表评论

匿名网友 填写信息