freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

浅谈PHP伪协议
2022-01-24 11:26:25
所属地 广东省

浅谈PHP伪协议

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

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

php://stdin

PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。

数据流引用了复制的文件描述符,所以如果你打开 php://stdin 并在之后关了它, 关闭的仅仅是复制品,真正被引用的 STDIN 并不受影响。

STDIN常量是一个已经打开的stdin流,可节省几行代码,也可节省小部分打开stdin的性能,php://stdin是只读的,使用fgets读取,通常情况下只能读取一行数据,在较新版本的php中也有办法做到连续读取多行数据,可以使用stream_get_contents 控制读取数量,用于一次性读取包含换行的输入数据。

1642994648_61ee1bd89ae76929bf361.png!small?1642994648934

php://stdout

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

1642994656_61ee1be00a9302d66fe63.png!small?1642994656516

php://stderr

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

1642994663_61ee1be71266ced514a3d.png!small?1642994663776

php://input

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

1642994669_61ee1bed437e436886fa2.png!small?1642994669765

php://output

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

1642994676_61ee1bf4b165646058b86.png!small?1642994677649

php://fd

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

1642994684_61ee1bfc0e8a9223b3edd.png!small?1642994684573

php://memory 和 php://temp

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

1642994690_61ee1c02d66f752aee765.png!small?1642994691485

php://filter

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

1642994698_61ee1c0a302ccc5b73662.png!small?1642994699727

stdin和input的区别

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

1642994705_61ee1c11bf1589c4e5d27.png!small?1642994706587

命令行执行

1642994715_61ee1c1ba4069fdaab83f.png!small?1642994716110

浏览器端请求

1642994723_61ee1c23c36d622bd338d.png!small?1642994724100

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

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伪协议
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录