php伪协议
前言
PHP伪协议是PHP自己支持的一种协议与封装协议,简单来说就是PHP定义的一种特殊访问资源的方法。
有些伪协议成功执行需要allow_url_fopen和allow_url_include的支持。
allow_url_fopen On/Off 允许或禁止打开URL文件
allow_url_include On/Off 允许或禁止引用URL文件
什么时候用php伪协议?
文件包括!!!的时候,可能会遇到的文件包含函数
include
require
include_once
require_once
highlight_file
show_source
readfile
file_get_contents
file_put_contents
fopen(比较常见)
)file:// 访问本地文件系统
2)http:// 访问HTTP(S)网址
3)ftp:// 访问FTP(S)URL
4)php:// 访问各个输出输入流
5)zlib:// 处理压缩流
6)data:// 读取数据
7)glob:// 查找匹配的文件路径模式
8)phar:// PHP归档
9)rar:// RAR数据压缩
常见的PHP伪协议
php://input
是一个可以访问请求的原始数据的只读流,获取POST请求数据的协议。
当enctype=“multipart/form-data”的时候,enctype="multipart/form-data"
是 HTML 表单(<form>
标签)中的一个属性,用于指定表单数据在发送到服务器时应该如何编码。当你需要在表单中上传文件时,这个属性是必需的。
具体来说,enctype
是 “encoding type” 的缩写,它定义了表单数据的编码类型。HTML 表单可以支持三种不同的编码类型:
- **
application/x-www-form-urlencoded
**(默认值):这是表单数据的标准编码格式。所有的字符都会进行编码(空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值)。这种编码类型适用于不包含文件上传的表单。 - **
multipart/form-data
**:这种编码类型用于在表单中包含文件上传。它不会对字符编码,而是将表单数据编码为一条消息,其中包含表示边界的字符串,用于分隔表单中的不同部分。这样,服务器就可以正确地解析文件和数据。 - **
text/plain
**:这种编码类型将表单数据作为纯文本发送,空格和换行符等字符不进行特殊处理。它很少用于实际的表单提交,因为服务器通常期望接收的是编码后的表单数据。
当你需要在表单中让用户上传文件时,你应该使用 enctype="multipart/form-data"
。例如:
1 | <form action="/upload" method="post" enctype="multipart/form-data"> |
在这个例子中,<form>
标签的 enctype
属性设置为 multipart/form-data
,这意味着表单可以包含文件上传。method
属性设置为 post
,因为上传文件通常使用 POST 方法。
php://input是无效的。
成功执行的前提是allow_url_include 设置成On
1 | php |
php://filter
php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。
例子php://filter/read=convert.base64encode/resource=index.php
php://filter/resource=index.php
php://filter 伪协议组成:
read=<读链的筛选列表>
resource=<要过滤的数据流>
write=<写链的筛选列表>
php://filter/read=处理方式(base64编码,rot13等等)/resource=要读取的文件
read=convert.base64-encode是将resource指向的内容进行转化,将其变成base64编码,并输出结果.这样处理后的输出不再是一个可执行的 PHP 文件,而是一个 Base64 编码的字符串。因此,可以直接被include_once给输出来
read 对应要设置的过滤器:
常见的过滤器分字符串过滤器、转换过滤器、压缩过滤器、加密过滤器
其中convert.base64-encode ,convert.base64-decode都属于 转换过滤器
1 |
|
zip://与bzip2://与zlib://协议
zip:// 等属于压缩流的协议,通过直接压缩普通文件为zip文件,再通过zip:// 协议读取,可以直接执行php代码。压缩后的zip文件可以随意修改后缀也不影响zip://协议读取。(注意是如phpinfo.txt直接压缩为zip,而不是文件夹压缩zip)
1 |
|
压缩及协议访问格式:
压缩文件为.zip后缀
zip://绝对路径/phpinfo.zip%23phpinfo.php
压缩文件为.bz2后缀
compress.bzip2://绝对路径/phpinfo.zip/phpinfo.php
压缩文件为.gz后缀
compress.zlib://绝对路径/phpinfo.zip/phpinfo.php
include_once($file)
返回值
如果文件成功包含,include_once 将会返回 1。
如果文件没有被找到或者在尝试包含文件过程中有错误,include_once 不会返回任何值,但会产生一个警告(除非 error_reporting 被设置成忽略警告)。
各类文件类型的输出情况
include_once 的参数不是一个 PHP 文件,那么该文件的内容会被直接输出(或执行,如果有可执行的 PHP 代码)到输出流中。具体的行为取决于该文件的内容和类型。
纯文本文件(比如 .txt): 文件的内容会被直接输出。
HTML 文件(比如 .html 或 .htm): HTML 代码会被直接输出,浏览器会按照 HTML 来渲染。
XML 文件或其他标记语言文件: 文件的内容会被直接输出。
二进制文件(比如图片或者音频文件): 这样做通常不是个好主意,因为二进制数据可能会被错误地解释为文本,导致输出乱码或产生不可预测的结果。
包含 PHP 代码的非 PHP 文件: 如果文件中混合有 PHP 代码(即使文件扩展名不是 .php),那么那部分 PHP 代码仍然会被执行。