什么是php伪协议

在 PHP 中,”伪协议”是一种特殊的语法,用于访问不同的资源或执行特定的操作。这些伪协议以 php:// 开头,后面跟着特定的指示符或参数,以实现不同的功能。这些伪协议提供了一种方便的方式来处理各种输入输出操作,而不必依赖于实际的文件或网络资源。

使用伪协议的函数

1. file_get_contents()

  • 用途:读取文件或流内容。
  • 常见伪协议:
    • file://:访问本地文件(默认协议)。
    • php://input:读取原始 HTTP 请求体。
    • php://filter:对资源进行过滤处理。

2. fopen()

  • 用途:打开文件或流。
  • 常见伪协议
    • php://tempphp://memory:临时存储数据。
    • data://:处理 Base64 或 URL 编码数据。

3. include / require

  • 用途:包含并执行 PHP 文件。
  • 常见伪协议:
    • php://filter:用于 LFI(本地文件包含)攻击或绕过限制。
    • data://:直接执行编码后的代码。

4. file()

  • 用途:将文件读取到数组中。
  • 常见伪协议:
    • php://filter:过滤文件内容。

5. readfile()

  • 用途:输出文件内容。
  • 常见伪协议:
    • php://output:直接输出到缓冲区。

6. copy()

  • 用途:复制文件或流。
  • 常见伪协议:
    • php://input:读取 HTTP 请求体并保存到文件。

7. stream_get_contents() / fread()

  • 用途:读取流内容。
  • 常见伪协议:
    • php://memoryphp://temp:操作内存或临时流。

8. file_put_contents()

  • 用途:写入数据到文件或流。

  • 常见伪协议:

    • php://output:直接输出内容。
    1
    2
    file_put_contents('php://output', 'Hello World');

php支持的伪协议

1
2
3
4
5
6
7
8
9
10
11
12
1 file:// — 访问本地文件系统
2 http:// — 访问 HTTP(s) 网址
3 ftp:// — 访问 FTP(s) URLs
4 php:// — 访问各个输入/输出流(I/O streams)
5 zlib:// — 压缩流
6 data:// — 数据(RFC 2397)
7 glob:// — 查找匹配的文件路径模式
8 phar:// — PHP 归档
9 ssh2:// — Secure Shell 2
10 rar:// — RAR
11 ogg:// — 音频流
12 expect:// — 处理交互式的流

常用伪协议

php://filter

简单通俗的说,这是一个中间件,在读入或写入数据的时候对数据进行处理后输出的一个过程。

php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取。

例子php://filter/read=convert.base64-encode/resource=index.php

协议参数

常见过滤器

string

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
string.toupper
转换为大写
read=string.toupper/resource=data.txt


string.tolower
转换为小写
write=string.tolower/resource=output.txt


string.rot13
ROT13 编码
read=string.rot13/resource=secret.txt


string.strip_tags
移除 HTML/PHP 标签
read=string.strip_tags?<p><a>/resource=webpage.html
(可选参数保留特定标签)

convert

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
convert.base64-decode
Base64 解码
write=convert.base64-decode/resource=decoded.bin


convert.quoted-printable-encode
引用可打印编码
read=convert.quoted-printable-encode/resource=text.txt


convert.quoted-printable-decode
引用可打印解码
read=convert.quoted-printable-decode/resource=qp.txt


convert.iconv.*
字符集转换
(最强大/最危险)
read=convert.iconv.UTF-8.ISO-8859-1/resource=utf8.txt

常用字符集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*
EUC-JP*
SJIS*
eucJP-win*
SJIS-win*
ISO-2022-JP
ISO-2022-JP-MS
CP932
CP51932
SJIS-mac(别名:MacJapanese)
SJIS-Mobile#DOCOMO(别名:SJIS-DOCOMO)
SJIS-Mobile#KDDI(别名:SJIS-KDDI)
SJIS-Mobile#SOFTBANK(别名:SJIS-SOFTBANK)
UTF-8-Mobile#DOCOMO(别名:UTF-8-DOCOMO)
UTF-8-Mobile#KDDI-A
UTF-8-Mobile#KDDI-B(别名:UTF-8-KDDI)
UTF-8-Mobile#SOFTBANK(别名:UTF-8-SOFTBANK)
ISO-2022-JP-MOBILE#KDDI(别名:ISO-2022-JP-KDDI)